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