xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_meta.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Collabora Ltd
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include "vk_meta_object_list.h"
25*61046927SAndroid Build Coastguard Worker #include "vk_meta_private.h"
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include "vk_buffer.h"
28*61046927SAndroid Build Coastguard Worker #include "vk_command_buffer.h"
29*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
30*61046927SAndroid Build Coastguard Worker #include "vk_pipeline.h"
31*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker #include "util/hash_table.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include <string.h>
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker struct cache_key {
38*61046927SAndroid Build Coastguard Worker    VkObjectType obj_type;
39*61046927SAndroid Build Coastguard Worker    uint32_t key_size;
40*61046927SAndroid Build Coastguard Worker    const void *key_data;
41*61046927SAndroid Build Coastguard Worker };
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker static struct cache_key *
cache_key_create(VkObjectType obj_type,const void * key_data,size_t key_size)44*61046927SAndroid Build Coastguard Worker cache_key_create(VkObjectType obj_type, const void *key_data, size_t key_size)
45*61046927SAndroid Build Coastguard Worker {
46*61046927SAndroid Build Coastguard Worker    assert(key_size <= UINT32_MAX);
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker    struct cache_key *key = malloc(sizeof(*key) + key_size);
49*61046927SAndroid Build Coastguard Worker    *key = (struct cache_key) {
50*61046927SAndroid Build Coastguard Worker       .obj_type = obj_type,
51*61046927SAndroid Build Coastguard Worker       .key_size = key_size,
52*61046927SAndroid Build Coastguard Worker       .key_data = key + 1,
53*61046927SAndroid Build Coastguard Worker    };
54*61046927SAndroid Build Coastguard Worker    memcpy(key + 1, key_data, key_size);
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker    return key;
57*61046927SAndroid Build Coastguard Worker }
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker static uint32_t
cache_key_hash(const void * _key)60*61046927SAndroid Build Coastguard Worker cache_key_hash(const void *_key)
61*61046927SAndroid Build Coastguard Worker {
62*61046927SAndroid Build Coastguard Worker    const struct cache_key *key = _key;
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    assert(sizeof(key->obj_type) == 4);
65*61046927SAndroid Build Coastguard Worker    uint32_t hash = _mesa_hash_u32(&key->obj_type);
66*61046927SAndroid Build Coastguard Worker    return _mesa_hash_data_with_seed(key->key_data, key->key_size, hash);
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker static bool
cache_key_equal(const void * _a,const void * _b)70*61046927SAndroid Build Coastguard Worker cache_key_equal(const void *_a, const void *_b)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker    const struct cache_key *a = _a, *b = _b;
73*61046927SAndroid Build Coastguard Worker    if (a->obj_type != b->obj_type || a->key_size != b->key_size)
74*61046927SAndroid Build Coastguard Worker       return false;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    return memcmp(a->key_data, b->key_data, a->key_size) == 0;
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_device_init(struct vk_device * device,struct vk_meta_device * meta)80*61046927SAndroid Build Coastguard Worker vk_meta_device_init(struct vk_device *device,
81*61046927SAndroid Build Coastguard Worker                     struct vk_meta_device *meta)
82*61046927SAndroid Build Coastguard Worker {
83*61046927SAndroid Build Coastguard Worker    memset(meta, 0, sizeof(*meta));
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker    meta->cache = _mesa_hash_table_create(NULL, cache_key_hash,
86*61046927SAndroid Build Coastguard Worker                                                cache_key_equal);
87*61046927SAndroid Build Coastguard Worker    simple_mtx_init(&meta->cache_mtx, mtx_plain);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker    meta->cmd_draw_rects = vk_meta_draw_rects;
90*61046927SAndroid Build Coastguard Worker    meta->cmd_draw_volume = vk_meta_draw_volume;
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker void
vk_meta_device_finish(struct vk_device * device,struct vk_meta_device * meta)96*61046927SAndroid Build Coastguard Worker vk_meta_device_finish(struct vk_device *device,
97*61046927SAndroid Build Coastguard Worker                       struct vk_meta_device *meta)
98*61046927SAndroid Build Coastguard Worker {
99*61046927SAndroid Build Coastguard Worker    hash_table_foreach(meta->cache, entry) {
100*61046927SAndroid Build Coastguard Worker       free((void *)entry->key);
101*61046927SAndroid Build Coastguard Worker       vk_meta_destroy_object(device, entry->data);
102*61046927SAndroid Build Coastguard Worker    }
103*61046927SAndroid Build Coastguard Worker    _mesa_hash_table_destroy(meta->cache, NULL);
104*61046927SAndroid Build Coastguard Worker    simple_mtx_destroy(&meta->cache_mtx);
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker uint64_t
vk_meta_lookup_object(struct vk_meta_device * meta,VkObjectType obj_type,const void * key_data,size_t key_size)108*61046927SAndroid Build Coastguard Worker vk_meta_lookup_object(struct vk_meta_device *meta,
109*61046927SAndroid Build Coastguard Worker                       VkObjectType obj_type,
110*61046927SAndroid Build Coastguard Worker                       const void *key_data, size_t key_size)
111*61046927SAndroid Build Coastguard Worker {
112*61046927SAndroid Build Coastguard Worker    assert(key_size >= sizeof(enum vk_meta_object_key_type));
113*61046927SAndroid Build Coastguard Worker    assert(*(enum vk_meta_object_key_type *)key_data !=
114*61046927SAndroid Build Coastguard Worker           VK_META_OBJECT_KEY_TYPE_INVALID);
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker    struct cache_key key = {
117*61046927SAndroid Build Coastguard Worker       .obj_type = obj_type,
118*61046927SAndroid Build Coastguard Worker       .key_size = key_size,
119*61046927SAndroid Build Coastguard Worker       .key_data = key_data,
120*61046927SAndroid Build Coastguard Worker    };
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker    uint32_t hash = cache_key_hash(&key);
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&meta->cache_mtx);
125*61046927SAndroid Build Coastguard Worker    struct hash_entry *entry =
126*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_search_pre_hashed(meta->cache, hash, &key);
127*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&meta->cache_mtx);
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker    if (entry == NULL)
130*61046927SAndroid Build Coastguard Worker       return 0;
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker    struct vk_object_base *obj = entry->data;
133*61046927SAndroid Build Coastguard Worker    assert(obj->type == obj_type);
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker    return (uint64_t)(uintptr_t)obj;
136*61046927SAndroid Build Coastguard Worker }
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker uint64_t
vk_meta_cache_object(struct vk_device * device,struct vk_meta_device * meta,const void * key_data,size_t key_size,VkObjectType obj_type,uint64_t handle)139*61046927SAndroid Build Coastguard Worker vk_meta_cache_object(struct vk_device *device,
140*61046927SAndroid Build Coastguard Worker                      struct vk_meta_device *meta,
141*61046927SAndroid Build Coastguard Worker                      const void *key_data, size_t key_size,
142*61046927SAndroid Build Coastguard Worker                      VkObjectType obj_type,
143*61046927SAndroid Build Coastguard Worker                      uint64_t handle)
144*61046927SAndroid Build Coastguard Worker {
145*61046927SAndroid Build Coastguard Worker    assert(key_size >= sizeof(enum vk_meta_object_key_type));
146*61046927SAndroid Build Coastguard Worker    assert(*(enum vk_meta_object_key_type *)key_data !=
147*61046927SAndroid Build Coastguard Worker           VK_META_OBJECT_KEY_TYPE_INVALID);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker    struct cache_key *key = cache_key_create(obj_type, key_data, key_size);
150*61046927SAndroid Build Coastguard Worker    struct vk_object_base *obj =
151*61046927SAndroid Build Coastguard Worker       vk_object_base_from_u64_handle(handle, obj_type);
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker    uint32_t hash = cache_key_hash(key);
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker    simple_mtx_lock(&meta->cache_mtx);
156*61046927SAndroid Build Coastguard Worker    struct hash_entry *entry =
157*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_search_pre_hashed(meta->cache, hash, key);
158*61046927SAndroid Build Coastguard Worker    if (entry == NULL)
159*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_insert_pre_hashed(meta->cache, hash, key, obj);
160*61046927SAndroid Build Coastguard Worker    simple_mtx_unlock(&meta->cache_mtx);
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker    if (entry != NULL) {
163*61046927SAndroid Build Coastguard Worker       /* We raced and found that object already in the cache */
164*61046927SAndroid Build Coastguard Worker       free(key);
165*61046927SAndroid Build Coastguard Worker       vk_meta_destroy_object(device, obj);
166*61046927SAndroid Build Coastguard Worker       return (uint64_t)(uintptr_t)entry->data;
167*61046927SAndroid Build Coastguard Worker    } else {
168*61046927SAndroid Build Coastguard Worker       /* Return the newly inserted object */
169*61046927SAndroid Build Coastguard Worker       return (uint64_t)(uintptr_t)obj;
170*61046927SAndroid Build Coastguard Worker    }
171*61046927SAndroid Build Coastguard Worker }
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_create_sampler(struct vk_device * device,struct vk_meta_device * meta,const VkSamplerCreateInfo * info,const void * key_data,size_t key_size,VkSampler * sampler_out)174*61046927SAndroid Build Coastguard Worker vk_meta_create_sampler(struct vk_device *device,
175*61046927SAndroid Build Coastguard Worker                        struct vk_meta_device *meta,
176*61046927SAndroid Build Coastguard Worker                        const VkSamplerCreateInfo *info,
177*61046927SAndroid Build Coastguard Worker                        const void *key_data, size_t key_size,
178*61046927SAndroid Build Coastguard Worker                        VkSampler *sampler_out)
179*61046927SAndroid Build Coastguard Worker {
180*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
181*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker    VkSampler sampler;
184*61046927SAndroid Build Coastguard Worker    VkResult result = disp->CreateSampler(_device, info, NULL, &sampler);
185*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
186*61046927SAndroid Build Coastguard Worker       return result;
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker    *sampler_out = (VkSampler)
189*61046927SAndroid Build Coastguard Worker       vk_meta_cache_object(device, meta, key_data, key_size,
190*61046927SAndroid Build Coastguard Worker                            VK_OBJECT_TYPE_SAMPLER,
191*61046927SAndroid Build Coastguard Worker                            (uint64_t)sampler);
192*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
193*61046927SAndroid Build Coastguard Worker }
194*61046927SAndroid Build Coastguard Worker 
195*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_create_descriptor_set_layout(struct vk_device * device,struct vk_meta_device * meta,const VkDescriptorSetLayoutCreateInfo * info,const void * key_data,size_t key_size,VkDescriptorSetLayout * layout_out)196*61046927SAndroid Build Coastguard Worker vk_meta_create_descriptor_set_layout(struct vk_device *device,
197*61046927SAndroid Build Coastguard Worker                                      struct vk_meta_device *meta,
198*61046927SAndroid Build Coastguard Worker                                      const VkDescriptorSetLayoutCreateInfo *info,
199*61046927SAndroid Build Coastguard Worker                                      const void *key_data, size_t key_size,
200*61046927SAndroid Build Coastguard Worker                                      VkDescriptorSetLayout *layout_out)
201*61046927SAndroid Build Coastguard Worker {
202*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
203*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker    VkDescriptorSetLayout layout;
206*61046927SAndroid Build Coastguard Worker    VkResult result = disp->CreateDescriptorSetLayout(_device, info,
207*61046927SAndroid Build Coastguard Worker                                                      NULL, &layout);
208*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
209*61046927SAndroid Build Coastguard Worker       return result;
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker    *layout_out = (VkDescriptorSetLayout)
212*61046927SAndroid Build Coastguard Worker       vk_meta_cache_object(device, meta, key_data, key_size,
213*61046927SAndroid Build Coastguard Worker                            VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,
214*61046927SAndroid Build Coastguard Worker                            (uint64_t)layout);
215*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
216*61046927SAndroid Build Coastguard Worker }
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker static VkResult
vk_meta_get_descriptor_set_layout(struct vk_device * device,struct vk_meta_device * meta,const VkDescriptorSetLayoutCreateInfo * info,const void * key_data,size_t key_size,VkDescriptorSetLayout * layout_out)219*61046927SAndroid Build Coastguard Worker vk_meta_get_descriptor_set_layout(struct vk_device *device,
220*61046927SAndroid Build Coastguard Worker                                   struct vk_meta_device *meta,
221*61046927SAndroid Build Coastguard Worker                                   const VkDescriptorSetLayoutCreateInfo *info,
222*61046927SAndroid Build Coastguard Worker                                   const void *key_data, size_t key_size,
223*61046927SAndroid Build Coastguard Worker                                   VkDescriptorSetLayout *layout_out)
224*61046927SAndroid Build Coastguard Worker {
225*61046927SAndroid Build Coastguard Worker    VkDescriptorSetLayout cached =
226*61046927SAndroid Build Coastguard Worker       vk_meta_lookup_descriptor_set_layout(meta, key_data, key_size);
227*61046927SAndroid Build Coastguard Worker    if (cached != VK_NULL_HANDLE) {
228*61046927SAndroid Build Coastguard Worker       *layout_out = cached;
229*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
230*61046927SAndroid Build Coastguard Worker    }
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker    return vk_meta_create_descriptor_set_layout(device, meta, info,
233*61046927SAndroid Build Coastguard Worker                                                key_data, key_size,
234*61046927SAndroid Build Coastguard Worker                                                layout_out);
235*61046927SAndroid Build Coastguard Worker }
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_create_pipeline_layout(struct vk_device * device,struct vk_meta_device * meta,const VkPipelineLayoutCreateInfo * info,const void * key_data,size_t key_size,VkPipelineLayout * layout_out)238*61046927SAndroid Build Coastguard Worker vk_meta_create_pipeline_layout(struct vk_device *device,
239*61046927SAndroid Build Coastguard Worker                                struct vk_meta_device *meta,
240*61046927SAndroid Build Coastguard Worker                                const VkPipelineLayoutCreateInfo *info,
241*61046927SAndroid Build Coastguard Worker                                const void *key_data, size_t key_size,
242*61046927SAndroid Build Coastguard Worker                                VkPipelineLayout *layout_out)
243*61046927SAndroid Build Coastguard Worker {
244*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
245*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker    VkPipelineLayout layout;
248*61046927SAndroid Build Coastguard Worker    VkResult result = disp->CreatePipelineLayout(_device, info, NULL, &layout);
249*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
250*61046927SAndroid Build Coastguard Worker       return result;
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker    *layout_out = (VkPipelineLayout)
253*61046927SAndroid Build Coastguard Worker       vk_meta_cache_object(device, meta, key_data, key_size,
254*61046927SAndroid Build Coastguard Worker                            VK_OBJECT_TYPE_PIPELINE_LAYOUT,
255*61046927SAndroid Build Coastguard Worker                            (uint64_t)layout);
256*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
257*61046927SAndroid Build Coastguard Worker }
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_get_pipeline_layout(struct vk_device * device,struct vk_meta_device * meta,const VkDescriptorSetLayoutCreateInfo * desc_info,const VkPushConstantRange * push_range,const void * key_data,size_t key_size,VkPipelineLayout * layout_out)260*61046927SAndroid Build Coastguard Worker vk_meta_get_pipeline_layout(struct vk_device *device,
261*61046927SAndroid Build Coastguard Worker                             struct vk_meta_device *meta,
262*61046927SAndroid Build Coastguard Worker                             const VkDescriptorSetLayoutCreateInfo *desc_info,
263*61046927SAndroid Build Coastguard Worker                             const VkPushConstantRange *push_range,
264*61046927SAndroid Build Coastguard Worker                             const void *key_data, size_t key_size,
265*61046927SAndroid Build Coastguard Worker                             VkPipelineLayout *layout_out)
266*61046927SAndroid Build Coastguard Worker {
267*61046927SAndroid Build Coastguard Worker    VkPipelineLayout cached =
268*61046927SAndroid Build Coastguard Worker       vk_meta_lookup_pipeline_layout(meta, key_data, key_size);
269*61046927SAndroid Build Coastguard Worker    if (cached != VK_NULL_HANDLE) {
270*61046927SAndroid Build Coastguard Worker       *layout_out = cached;
271*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
272*61046927SAndroid Build Coastguard Worker    }
273*61046927SAndroid Build Coastguard Worker 
274*61046927SAndroid Build Coastguard Worker    VkDescriptorSetLayout set_layout = VK_NULL_HANDLE;
275*61046927SAndroid Build Coastguard Worker    if (desc_info != NULL) {
276*61046927SAndroid Build Coastguard Worker       VkResult result =
277*61046927SAndroid Build Coastguard Worker          vk_meta_get_descriptor_set_layout(device, meta, desc_info,
278*61046927SAndroid Build Coastguard Worker                                            key_data, key_size, &set_layout);
279*61046927SAndroid Build Coastguard Worker       if (result != VK_SUCCESS)
280*61046927SAndroid Build Coastguard Worker          return result;
281*61046927SAndroid Build Coastguard Worker    }
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker    const VkPipelineLayoutCreateInfo layout_info = {
284*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
285*61046927SAndroid Build Coastguard Worker       .setLayoutCount = set_layout != VK_NULL_HANDLE ? 1 : 0,
286*61046927SAndroid Build Coastguard Worker       .pSetLayouts = &set_layout,
287*61046927SAndroid Build Coastguard Worker       .pushConstantRangeCount = push_range != NULL ? 1 : 0,
288*61046927SAndroid Build Coastguard Worker       .pPushConstantRanges = push_range,
289*61046927SAndroid Build Coastguard Worker    };
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker    return vk_meta_create_pipeline_layout(device, meta, &layout_info,
292*61046927SAndroid Build Coastguard Worker                                          key_data, key_size, layout_out);
293*61046927SAndroid Build Coastguard Worker }
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker static VkResult
create_rect_list_pipeline(struct vk_device * device,struct vk_meta_device * meta,const VkGraphicsPipelineCreateInfo * info,VkPipeline * pipeline_out)296*61046927SAndroid Build Coastguard Worker create_rect_list_pipeline(struct vk_device *device,
297*61046927SAndroid Build Coastguard Worker                           struct vk_meta_device *meta,
298*61046927SAndroid Build Coastguard Worker                           const VkGraphicsPipelineCreateInfo *info,
299*61046927SAndroid Build Coastguard Worker                           VkPipeline *pipeline_out)
300*61046927SAndroid Build Coastguard Worker {
301*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
302*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker    VkGraphicsPipelineCreateInfo info_local = *info;
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker    /* We always configure for layered rendering for now */
307*61046927SAndroid Build Coastguard Worker    bool use_gs = meta->use_gs_for_layer;
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkPipelineShaderStageCreateInfo, stages,
310*61046927SAndroid Build Coastguard Worker                info->stageCount + 1 + use_gs);
311*61046927SAndroid Build Coastguard Worker    uint32_t stage_count = 0;
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker    VkPipelineShaderStageNirCreateInfoMESA vs_nir_info = {
314*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NIR_CREATE_INFO_MESA,
315*61046927SAndroid Build Coastguard Worker       .nir = vk_meta_draw_rects_vs_nir(meta, use_gs),
316*61046927SAndroid Build Coastguard Worker    };
317*61046927SAndroid Build Coastguard Worker    stages[stage_count++] = (VkPipelineShaderStageCreateInfo) {
318*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
319*61046927SAndroid Build Coastguard Worker       .pNext = &vs_nir_info,
320*61046927SAndroid Build Coastguard Worker       .stage = VK_SHADER_STAGE_VERTEX_BIT,
321*61046927SAndroid Build Coastguard Worker       .pName = "main",
322*61046927SAndroid Build Coastguard Worker    };
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker    VkPipelineShaderStageNirCreateInfoMESA gs_nir_info;
325*61046927SAndroid Build Coastguard Worker    if (use_gs) {
326*61046927SAndroid Build Coastguard Worker       gs_nir_info = (VkPipelineShaderStageNirCreateInfoMESA) {
327*61046927SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NIR_CREATE_INFO_MESA,
328*61046927SAndroid Build Coastguard Worker          .nir = vk_meta_draw_rects_gs_nir(meta),
329*61046927SAndroid Build Coastguard Worker       };
330*61046927SAndroid Build Coastguard Worker       stages[stage_count++] = (VkPipelineShaderStageCreateInfo) {
331*61046927SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
332*61046927SAndroid Build Coastguard Worker          .pNext = &gs_nir_info,
333*61046927SAndroid Build Coastguard Worker          .stage = VK_SHADER_STAGE_GEOMETRY_BIT,
334*61046927SAndroid Build Coastguard Worker          .pName = "main",
335*61046927SAndroid Build Coastguard Worker       };
336*61046927SAndroid Build Coastguard Worker    }
337*61046927SAndroid Build Coastguard Worker 
338*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < info->stageCount; i++) {
339*61046927SAndroid Build Coastguard Worker       assert(info->pStages[i].stage != VK_SHADER_STAGE_VERTEX_BIT);
340*61046927SAndroid Build Coastguard Worker       if (use_gs)
341*61046927SAndroid Build Coastguard Worker          assert(info->pStages[i].stage != VK_SHADER_STAGE_GEOMETRY_BIT);
342*61046927SAndroid Build Coastguard Worker       stages[stage_count++] = info->pStages[i];
343*61046927SAndroid Build Coastguard Worker    }
344*61046927SAndroid Build Coastguard Worker 
345*61046927SAndroid Build Coastguard Worker    info_local.stageCount = stage_count;
346*61046927SAndroid Build Coastguard Worker    info_local.pStages = stages;
347*61046927SAndroid Build Coastguard Worker    info_local.pVertexInputState = &vk_meta_draw_rects_vi_state;
348*61046927SAndroid Build Coastguard Worker    info_local.pViewportState = &vk_meta_draw_rects_vs_state;
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    uint32_t dyn_count = info->pDynamicState != NULL ?
351*61046927SAndroid Build Coastguard Worker                         info->pDynamicState->dynamicStateCount : 0;
352*61046927SAndroid Build Coastguard Worker 
353*61046927SAndroid Build Coastguard Worker    STACK_ARRAY(VkDynamicState, dyn_state, dyn_count + 2);
354*61046927SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < dyn_count; i++)
355*61046927SAndroid Build Coastguard Worker       dyn_state[i] = info->pDynamicState->pDynamicStates[i];
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker    dyn_state[dyn_count + 0] = VK_DYNAMIC_STATE_VIEWPORT;
358*61046927SAndroid Build Coastguard Worker    dyn_state[dyn_count + 1] = VK_DYNAMIC_STATE_SCISSOR;
359*61046927SAndroid Build Coastguard Worker 
360*61046927SAndroid Build Coastguard Worker    const VkPipelineDynamicStateCreateInfo dyn_info = {
361*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
362*61046927SAndroid Build Coastguard Worker       .dynamicStateCount = dyn_count + 2,
363*61046927SAndroid Build Coastguard Worker       .pDynamicStates = dyn_state,
364*61046927SAndroid Build Coastguard Worker    };
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker    info_local.pDynamicState = &dyn_info;
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker    VkResult result = disp->CreateGraphicsPipelines(_device, VK_NULL_HANDLE,
369*61046927SAndroid Build Coastguard Worker                                                    1, &info_local, NULL,
370*61046927SAndroid Build Coastguard Worker                                                    pipeline_out);
371*61046927SAndroid Build Coastguard Worker 
372*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(dyn_state);
373*61046927SAndroid Build Coastguard Worker    STACK_ARRAY_FINISH(stages);
374*61046927SAndroid Build Coastguard Worker 
375*61046927SAndroid Build Coastguard Worker    return result;
376*61046927SAndroid Build Coastguard Worker }
377*61046927SAndroid Build Coastguard Worker 
378*61046927SAndroid Build Coastguard Worker static const VkPipelineRasterizationStateCreateInfo default_rs_info = {
379*61046927SAndroid Build Coastguard Worker    .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
380*61046927SAndroid Build Coastguard Worker    .depthClampEnable = false,
381*61046927SAndroid Build Coastguard Worker    .depthBiasEnable = false,
382*61046927SAndroid Build Coastguard Worker    .polygonMode = VK_POLYGON_MODE_FILL,
383*61046927SAndroid Build Coastguard Worker    .cullMode = VK_CULL_MODE_NONE,
384*61046927SAndroid Build Coastguard Worker    .frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE,
385*61046927SAndroid Build Coastguard Worker };
386*61046927SAndroid Build Coastguard Worker 
387*61046927SAndroid Build Coastguard Worker static const VkPipelineDepthStencilStateCreateInfo default_ds_info = {
388*61046927SAndroid Build Coastguard Worker    .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
389*61046927SAndroid Build Coastguard Worker    .depthTestEnable = false,
390*61046927SAndroid Build Coastguard Worker    .depthBoundsTestEnable = false,
391*61046927SAndroid Build Coastguard Worker    .stencilTestEnable = false,
392*61046927SAndroid Build Coastguard Worker };
393*61046927SAndroid Build Coastguard Worker 
394*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_create_graphics_pipeline(struct vk_device * device,struct vk_meta_device * meta,const VkGraphicsPipelineCreateInfo * info,const struct vk_meta_rendering_info * render,const void * key_data,size_t key_size,VkPipeline * pipeline_out)395*61046927SAndroid Build Coastguard Worker vk_meta_create_graphics_pipeline(struct vk_device *device,
396*61046927SAndroid Build Coastguard Worker                                  struct vk_meta_device *meta,
397*61046927SAndroid Build Coastguard Worker                                  const VkGraphicsPipelineCreateInfo *info,
398*61046927SAndroid Build Coastguard Worker                                  const struct vk_meta_rendering_info *render,
399*61046927SAndroid Build Coastguard Worker                                  const void *key_data, size_t key_size,
400*61046927SAndroid Build Coastguard Worker                                  VkPipeline *pipeline_out)
401*61046927SAndroid Build Coastguard Worker {
402*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
403*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
404*61046927SAndroid Build Coastguard Worker    VkResult result;
405*61046927SAndroid Build Coastguard Worker 
406*61046927SAndroid Build Coastguard Worker    VkGraphicsPipelineCreateInfo info_local = *info;
407*61046927SAndroid Build Coastguard Worker 
408*61046927SAndroid Build Coastguard Worker    /* Add in the rendering info */
409*61046927SAndroid Build Coastguard Worker    VkPipelineRenderingCreateInfo r_info = {
410*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,
411*61046927SAndroid Build Coastguard Worker       .viewMask = render->view_mask,
412*61046927SAndroid Build Coastguard Worker       .colorAttachmentCount = render->color_attachment_count,
413*61046927SAndroid Build Coastguard Worker       .pColorAttachmentFormats = render->color_attachment_formats,
414*61046927SAndroid Build Coastguard Worker       .depthAttachmentFormat = render->depth_attachment_format,
415*61046927SAndroid Build Coastguard Worker       .stencilAttachmentFormat = render->stencil_attachment_format,
416*61046927SAndroid Build Coastguard Worker    };
417*61046927SAndroid Build Coastguard Worker    __vk_append_struct(&info_local, &r_info);
418*61046927SAndroid Build Coastguard Worker 
419*61046927SAndroid Build Coastguard Worker    /* Assume rectangle pipelines */
420*61046927SAndroid Build Coastguard Worker    if (info_local.pInputAssemblyState == NULL)
421*61046927SAndroid Build Coastguard Worker    info_local.pInputAssemblyState = &vk_meta_draw_rects_ia_state;
422*61046927SAndroid Build Coastguard Worker 
423*61046927SAndroid Build Coastguard Worker    if (info_local.pRasterizationState == NULL)
424*61046927SAndroid Build Coastguard Worker       info_local.pRasterizationState = &default_rs_info;
425*61046927SAndroid Build Coastguard Worker 
426*61046927SAndroid Build Coastguard Worker    VkPipelineMultisampleStateCreateInfo ms_info;
427*61046927SAndroid Build Coastguard Worker    if (info_local.pMultisampleState == NULL) {
428*61046927SAndroid Build Coastguard Worker       ms_info = (VkPipelineMultisampleStateCreateInfo) {
429*61046927SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
430*61046927SAndroid Build Coastguard Worker          .rasterizationSamples = render->samples,
431*61046927SAndroid Build Coastguard Worker       };
432*61046927SAndroid Build Coastguard Worker       info_local.pMultisampleState = &ms_info;
433*61046927SAndroid Build Coastguard Worker    }
434*61046927SAndroid Build Coastguard Worker 
435*61046927SAndroid Build Coastguard Worker    if (info_local.pDepthStencilState == NULL)
436*61046927SAndroid Build Coastguard Worker       info_local.pDepthStencilState = &default_ds_info;
437*61046927SAndroid Build Coastguard Worker 
438*61046927SAndroid Build Coastguard Worker    VkPipelineColorBlendStateCreateInfo cb_info;
439*61046927SAndroid Build Coastguard Worker    VkPipelineColorBlendAttachmentState cb_att[MESA_VK_MAX_COLOR_ATTACHMENTS];
440*61046927SAndroid Build Coastguard Worker    if (info_local.pColorBlendState == NULL) {
441*61046927SAndroid Build Coastguard Worker       for (uint32_t i = 0; i < render->color_attachment_count; i++) {
442*61046927SAndroid Build Coastguard Worker          cb_att[i] = (VkPipelineColorBlendAttachmentState) {
443*61046927SAndroid Build Coastguard Worker             .blendEnable = false,
444*61046927SAndroid Build Coastguard Worker             .colorWriteMask = render->color_attachment_write_masks[i],
445*61046927SAndroid Build Coastguard Worker          };
446*61046927SAndroid Build Coastguard Worker       }
447*61046927SAndroid Build Coastguard Worker       cb_info = (VkPipelineColorBlendStateCreateInfo) {
448*61046927SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
449*61046927SAndroid Build Coastguard Worker          .attachmentCount = render->color_attachment_count,
450*61046927SAndroid Build Coastguard Worker          .pAttachments = cb_att,
451*61046927SAndroid Build Coastguard Worker       };
452*61046927SAndroid Build Coastguard Worker       info_local.pColorBlendState = &cb_info;
453*61046927SAndroid Build Coastguard Worker    }
454*61046927SAndroid Build Coastguard Worker 
455*61046927SAndroid Build Coastguard Worker    VkPipeline pipeline;
456*61046927SAndroid Build Coastguard Worker    if (info_local.pInputAssemblyState->topology ==
457*61046927SAndroid Build Coastguard Worker        VK_PRIMITIVE_TOPOLOGY_META_RECT_LIST_MESA) {
458*61046927SAndroid Build Coastguard Worker       result = create_rect_list_pipeline(device, meta,
459*61046927SAndroid Build Coastguard Worker                                          &info_local,
460*61046927SAndroid Build Coastguard Worker                                          &pipeline);
461*61046927SAndroid Build Coastguard Worker    } else {
462*61046927SAndroid Build Coastguard Worker       result = disp->CreateGraphicsPipelines(_device, VK_NULL_HANDLE,
463*61046927SAndroid Build Coastguard Worker                                              1, &info_local,
464*61046927SAndroid Build Coastguard Worker                                              NULL, &pipeline);
465*61046927SAndroid Build Coastguard Worker    }
466*61046927SAndroid Build Coastguard Worker    if (unlikely(result != VK_SUCCESS))
467*61046927SAndroid Build Coastguard Worker       return result;
468*61046927SAndroid Build Coastguard Worker 
469*61046927SAndroid Build Coastguard Worker    *pipeline_out = (VkPipeline)vk_meta_cache_object(device, meta,
470*61046927SAndroid Build Coastguard Worker                                                     key_data, key_size,
471*61046927SAndroid Build Coastguard Worker                                                     VK_OBJECT_TYPE_PIPELINE,
472*61046927SAndroid Build Coastguard Worker                                                     (uint64_t)pipeline);
473*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
474*61046927SAndroid Build Coastguard Worker }
475*61046927SAndroid Build Coastguard Worker 
476*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_create_compute_pipeline(struct vk_device * device,struct vk_meta_device * meta,const VkComputePipelineCreateInfo * info,const void * key_data,size_t key_size,VkPipeline * pipeline_out)477*61046927SAndroid Build Coastguard Worker vk_meta_create_compute_pipeline(struct vk_device *device,
478*61046927SAndroid Build Coastguard Worker                                 struct vk_meta_device *meta,
479*61046927SAndroid Build Coastguard Worker                                 const VkComputePipelineCreateInfo *info,
480*61046927SAndroid Build Coastguard Worker                                 const void *key_data, size_t key_size,
481*61046927SAndroid Build Coastguard Worker                                 VkPipeline *pipeline_out)
482*61046927SAndroid Build Coastguard Worker {
483*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
484*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
485*61046927SAndroid Build Coastguard Worker 
486*61046927SAndroid Build Coastguard Worker    VkPipeline pipeline;
487*61046927SAndroid Build Coastguard Worker    VkResult result = disp->CreateComputePipelines(_device, VK_NULL_HANDLE,
488*61046927SAndroid Build Coastguard Worker                                                   1, info, NULL, &pipeline);
489*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
490*61046927SAndroid Build Coastguard Worker       return result;
491*61046927SAndroid Build Coastguard Worker 
492*61046927SAndroid Build Coastguard Worker    *pipeline_out = (VkPipeline)vk_meta_cache_object(device, meta,
493*61046927SAndroid Build Coastguard Worker                                                     key_data, key_size,
494*61046927SAndroid Build Coastguard Worker                                                     VK_OBJECT_TYPE_PIPELINE,
495*61046927SAndroid Build Coastguard Worker                                                     (uint64_t)pipeline);
496*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
497*61046927SAndroid Build Coastguard Worker }
498*61046927SAndroid Build Coastguard Worker 
499*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_create_buffer(struct vk_command_buffer * cmd,struct vk_meta_device * meta,const VkBufferCreateInfo * info,VkBuffer * buffer_out)500*61046927SAndroid Build Coastguard Worker vk_meta_create_buffer(struct vk_command_buffer *cmd,
501*61046927SAndroid Build Coastguard Worker                       struct vk_meta_device *meta,
502*61046927SAndroid Build Coastguard Worker                       const VkBufferCreateInfo *info,
503*61046927SAndroid Build Coastguard Worker                       VkBuffer *buffer_out)
504*61046927SAndroid Build Coastguard Worker {
505*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd->base.device;
506*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
507*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
508*61046927SAndroid Build Coastguard Worker 
509*61046927SAndroid Build Coastguard Worker    VkResult result = disp->CreateBuffer(_device, info, NULL, buffer_out);
510*61046927SAndroid Build Coastguard Worker    if (unlikely(result != VK_SUCCESS))
511*61046927SAndroid Build Coastguard Worker       return result;
512*61046927SAndroid Build Coastguard Worker 
513*61046927SAndroid Build Coastguard Worker    vk_meta_object_list_add_handle(&cmd->meta_objects,
514*61046927SAndroid Build Coastguard Worker                                   VK_OBJECT_TYPE_BUFFER,
515*61046927SAndroid Build Coastguard Worker                                   (uint64_t)*buffer_out);
516*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
517*61046927SAndroid Build Coastguard Worker }
518*61046927SAndroid Build Coastguard Worker 
519*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_create_image_view(struct vk_command_buffer * cmd,struct vk_meta_device * meta,const VkImageViewCreateInfo * info,VkImageView * image_view_out)520*61046927SAndroid Build Coastguard Worker vk_meta_create_image_view(struct vk_command_buffer *cmd,
521*61046927SAndroid Build Coastguard Worker                           struct vk_meta_device *meta,
522*61046927SAndroid Build Coastguard Worker                           const VkImageViewCreateInfo *info,
523*61046927SAndroid Build Coastguard Worker                           VkImageView *image_view_out)
524*61046927SAndroid Build Coastguard Worker {
525*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd->base.device;
526*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
527*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
528*61046927SAndroid Build Coastguard Worker 
529*61046927SAndroid Build Coastguard Worker    VkResult result = disp->CreateImageView(_device, info, NULL, image_view_out);
530*61046927SAndroid Build Coastguard Worker    if (unlikely(result != VK_SUCCESS))
531*61046927SAndroid Build Coastguard Worker       return result;
532*61046927SAndroid Build Coastguard Worker 
533*61046927SAndroid Build Coastguard Worker    vk_meta_object_list_add_handle(&cmd->meta_objects,
534*61046927SAndroid Build Coastguard Worker                                   VK_OBJECT_TYPE_IMAGE_VIEW,
535*61046927SAndroid Build Coastguard Worker                                   (uint64_t)*image_view_out);
536*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
537*61046927SAndroid Build Coastguard Worker }
538*61046927SAndroid Build Coastguard Worker 
539*61046927SAndroid Build Coastguard Worker VkResult
vk_meta_create_buffer_view(struct vk_command_buffer * cmd,struct vk_meta_device * meta,const VkBufferViewCreateInfo * info,VkBufferView * buffer_view_out)540*61046927SAndroid Build Coastguard Worker vk_meta_create_buffer_view(struct vk_command_buffer *cmd,
541*61046927SAndroid Build Coastguard Worker                            struct vk_meta_device *meta,
542*61046927SAndroid Build Coastguard Worker                            const VkBufferViewCreateInfo *info,
543*61046927SAndroid Build Coastguard Worker                            VkBufferView *buffer_view_out)
544*61046927SAndroid Build Coastguard Worker {
545*61046927SAndroid Build Coastguard Worker    struct vk_device *device = cmd->base.device;
546*61046927SAndroid Build Coastguard Worker    const struct vk_device_dispatch_table *disp = &device->dispatch_table;
547*61046927SAndroid Build Coastguard Worker    VkDevice _device = vk_device_to_handle(device);
548*61046927SAndroid Build Coastguard Worker 
549*61046927SAndroid Build Coastguard Worker    VkResult result = disp->CreateBufferView(_device, info, NULL, buffer_view_out);
550*61046927SAndroid Build Coastguard Worker    if (unlikely(result != VK_SUCCESS))
551*61046927SAndroid Build Coastguard Worker       return result;
552*61046927SAndroid Build Coastguard Worker 
553*61046927SAndroid Build Coastguard Worker    vk_meta_object_list_add_handle(&cmd->meta_objects,
554*61046927SAndroid Build Coastguard Worker                                   VK_OBJECT_TYPE_BUFFER_VIEW,
555*61046927SAndroid Build Coastguard Worker                                   (uint64_t)*buffer_view_out);
556*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
557*61046927SAndroid Build Coastguard Worker }
558*61046927SAndroid Build Coastguard Worker 
559*61046927SAndroid Build Coastguard Worker VkDeviceAddress
vk_meta_buffer_address(struct vk_device * device,VkBuffer buffer,uint64_t offset,uint64_t range)560*61046927SAndroid Build Coastguard Worker vk_meta_buffer_address(struct vk_device *device, VkBuffer buffer,
561*61046927SAndroid Build Coastguard Worker                        uint64_t offset, uint64_t range)
562*61046927SAndroid Build Coastguard Worker {
563*61046927SAndroid Build Coastguard Worker    const VkBufferDeviceAddressInfo info = {
564*61046927SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
565*61046927SAndroid Build Coastguard Worker       .buffer = buffer,
566*61046927SAndroid Build Coastguard Worker    };
567*61046927SAndroid Build Coastguard Worker    VkDeviceAddress base = device->dispatch_table.GetBufferDeviceAddress(
568*61046927SAndroid Build Coastguard Worker       vk_device_to_handle(device), &info);
569*61046927SAndroid Build Coastguard Worker 
570*61046927SAndroid Build Coastguard Worker    /* Only called for the assert()s in vk_buffer_range(), we don't care about
571*61046927SAndroid Build Coastguard Worker     * the result.
572*61046927SAndroid Build Coastguard Worker     */
573*61046927SAndroid Build Coastguard Worker    vk_buffer_range(vk_buffer_from_handle(buffer), offset, range);
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker    return base + offset;
576*61046927SAndroid Build Coastguard Worker }
577