xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_object.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2020 Intel Corporation
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_object.h"
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #include "vk_alloc.h"
27*61046927SAndroid Build Coastguard Worker #include "vk_common_entrypoints.h"
28*61046927SAndroid Build Coastguard Worker #include "vk_instance.h"
29*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
30*61046927SAndroid Build Coastguard Worker #include "util/hash_table.h"
31*61046927SAndroid Build Coastguard Worker #include "util/ralloc.h"
32*61046927SAndroid Build Coastguard Worker #include "vk_enum_to_str.h"
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker void
vk_object_base_init(struct vk_device * device,struct vk_object_base * base,VkObjectType obj_type)35*61046927SAndroid Build Coastguard Worker vk_object_base_init(struct vk_device *device,
36*61046927SAndroid Build Coastguard Worker                     struct vk_object_base *base,
37*61046927SAndroid Build Coastguard Worker                     VkObjectType obj_type)
38*61046927SAndroid Build Coastguard Worker {
39*61046927SAndroid Build Coastguard Worker    base->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
40*61046927SAndroid Build Coastguard Worker    base->type = obj_type;
41*61046927SAndroid Build Coastguard Worker    base->client_visible = false;
42*61046927SAndroid Build Coastguard Worker    base->device = device;
43*61046927SAndroid Build Coastguard Worker    base->instance = NULL;
44*61046927SAndroid Build Coastguard Worker    base->object_name = NULL;
45*61046927SAndroid Build Coastguard Worker    util_sparse_array_init(&base->private_data, sizeof(uint64_t), 8);
46*61046927SAndroid Build Coastguard Worker }
47*61046927SAndroid Build Coastguard Worker 
vk_object_base_instance_init(struct vk_instance * instance,struct vk_object_base * base,VkObjectType obj_type)48*61046927SAndroid Build Coastguard Worker void vk_object_base_instance_init(struct vk_instance *instance,
49*61046927SAndroid Build Coastguard Worker                                   struct vk_object_base *base,
50*61046927SAndroid Build Coastguard Worker                                   VkObjectType obj_type)
51*61046927SAndroid Build Coastguard Worker {
52*61046927SAndroid Build Coastguard Worker    base->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
53*61046927SAndroid Build Coastguard Worker    base->type = obj_type;
54*61046927SAndroid Build Coastguard Worker    base->client_visible = false;
55*61046927SAndroid Build Coastguard Worker    base->device = NULL;
56*61046927SAndroid Build Coastguard Worker    base->instance = instance;
57*61046927SAndroid Build Coastguard Worker    base->object_name = NULL;
58*61046927SAndroid Build Coastguard Worker    util_sparse_array_init(&base->private_data, sizeof(uint64_t), 8);
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker void
vk_object_base_finish(struct vk_object_base * base)62*61046927SAndroid Build Coastguard Worker vk_object_base_finish(struct vk_object_base *base)
63*61046927SAndroid Build Coastguard Worker {
64*61046927SAndroid Build Coastguard Worker    util_sparse_array_finish(&base->private_data);
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    if (base->object_name == NULL)
67*61046927SAndroid Build Coastguard Worker       return;
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    assert(base->device != NULL || base->instance != NULL);
70*61046927SAndroid Build Coastguard Worker    if (base->device)
71*61046927SAndroid Build Coastguard Worker       vk_free(&base->device->alloc, base->object_name);
72*61046927SAndroid Build Coastguard Worker    else
73*61046927SAndroid Build Coastguard Worker       vk_free(&base->instance->alloc, base->object_name);
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker void
vk_object_base_recycle(struct vk_object_base * base)77*61046927SAndroid Build Coastguard Worker vk_object_base_recycle(struct vk_object_base *base)
78*61046927SAndroid Build Coastguard Worker {
79*61046927SAndroid Build Coastguard Worker    struct vk_device *device = base->device;
80*61046927SAndroid Build Coastguard Worker    VkObjectType obj_type = base->type;
81*61046927SAndroid Build Coastguard Worker    vk_object_base_finish(base);
82*61046927SAndroid Build Coastguard Worker    vk_object_base_init(device, base, obj_type);
83*61046927SAndroid Build Coastguard Worker }
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker void *
vk_object_alloc(struct vk_device * device,const VkAllocationCallbacks * alloc,size_t size,VkObjectType obj_type)86*61046927SAndroid Build Coastguard Worker vk_object_alloc(struct vk_device *device,
87*61046927SAndroid Build Coastguard Worker                 const VkAllocationCallbacks *alloc,
88*61046927SAndroid Build Coastguard Worker                 size_t size,
89*61046927SAndroid Build Coastguard Worker                 VkObjectType obj_type)
90*61046927SAndroid Build Coastguard Worker {
91*61046927SAndroid Build Coastguard Worker    void *ptr = vk_alloc2(&device->alloc, alloc, size, 8,
92*61046927SAndroid Build Coastguard Worker                          VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
93*61046927SAndroid Build Coastguard Worker    if (ptr == NULL)
94*61046927SAndroid Build Coastguard Worker       return NULL;
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker    vk_object_base_init(device, (struct vk_object_base *)ptr, obj_type);
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker    return ptr;
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker void *
vk_object_zalloc(struct vk_device * device,const VkAllocationCallbacks * alloc,size_t size,VkObjectType obj_type)102*61046927SAndroid Build Coastguard Worker vk_object_zalloc(struct vk_device *device,
103*61046927SAndroid Build Coastguard Worker                 const VkAllocationCallbacks *alloc,
104*61046927SAndroid Build Coastguard Worker                 size_t size,
105*61046927SAndroid Build Coastguard Worker                 VkObjectType obj_type)
106*61046927SAndroid Build Coastguard Worker {
107*61046927SAndroid Build Coastguard Worker    void *ptr = vk_zalloc2(&device->alloc, alloc, size, 8,
108*61046927SAndroid Build Coastguard Worker                          VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
109*61046927SAndroid Build Coastguard Worker    if (ptr == NULL)
110*61046927SAndroid Build Coastguard Worker       return NULL;
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker    vk_object_base_init(device, (struct vk_object_base *)ptr, obj_type);
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker    return ptr;
115*61046927SAndroid Build Coastguard Worker }
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker void *
vk_object_multialloc(struct vk_device * device,struct vk_multialloc * ma,const VkAllocationCallbacks * alloc,VkObjectType obj_type)118*61046927SAndroid Build Coastguard Worker vk_object_multialloc(struct vk_device *device,
119*61046927SAndroid Build Coastguard Worker                      struct vk_multialloc *ma,
120*61046927SAndroid Build Coastguard Worker                      const VkAllocationCallbacks *alloc,
121*61046927SAndroid Build Coastguard Worker                      VkObjectType obj_type)
122*61046927SAndroid Build Coastguard Worker {
123*61046927SAndroid Build Coastguard Worker    void *ptr = vk_multialloc_alloc2(ma, &device->alloc, alloc,
124*61046927SAndroid Build Coastguard Worker                                     VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
125*61046927SAndroid Build Coastguard Worker    if (ptr == NULL)
126*61046927SAndroid Build Coastguard Worker       return NULL;
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker    vk_object_base_init(device, (struct vk_object_base *)ptr, obj_type);
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    return ptr;
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker void *
vk_object_multizalloc(struct vk_device * device,struct vk_multialloc * ma,const VkAllocationCallbacks * alloc,VkObjectType obj_type)134*61046927SAndroid Build Coastguard Worker vk_object_multizalloc(struct vk_device *device,
135*61046927SAndroid Build Coastguard Worker                       struct vk_multialloc *ma,
136*61046927SAndroid Build Coastguard Worker                       const VkAllocationCallbacks *alloc,
137*61046927SAndroid Build Coastguard Worker                       VkObjectType obj_type)
138*61046927SAndroid Build Coastguard Worker {
139*61046927SAndroid Build Coastguard Worker    void *ptr = vk_multialloc_zalloc2(ma, &device->alloc, alloc,
140*61046927SAndroid Build Coastguard Worker                                      VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
141*61046927SAndroid Build Coastguard Worker    if (ptr == NULL)
142*61046927SAndroid Build Coastguard Worker       return NULL;
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker    vk_object_base_init(device, (struct vk_object_base *)ptr, obj_type);
145*61046927SAndroid Build Coastguard Worker 
146*61046927SAndroid Build Coastguard Worker    return ptr;
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker void
vk_object_free(struct vk_device * device,const VkAllocationCallbacks * alloc,void * data)150*61046927SAndroid Build Coastguard Worker vk_object_free(struct vk_device *device,
151*61046927SAndroid Build Coastguard Worker                const VkAllocationCallbacks *alloc,
152*61046927SAndroid Build Coastguard Worker                void *data)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker    vk_object_base_finish((struct vk_object_base *)data);
155*61046927SAndroid Build Coastguard Worker    vk_free2(&device->alloc, alloc, data);
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker VkResult
vk_private_data_slot_create(struct vk_device * device,const VkPrivateDataSlotCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkPrivateDataSlot * pPrivateDataSlot)159*61046927SAndroid Build Coastguard Worker vk_private_data_slot_create(struct vk_device *device,
160*61046927SAndroid Build Coastguard Worker                             const VkPrivateDataSlotCreateInfo* pCreateInfo,
161*61046927SAndroid Build Coastguard Worker                             const VkAllocationCallbacks* pAllocator,
162*61046927SAndroid Build Coastguard Worker                             VkPrivateDataSlot* pPrivateDataSlot)
163*61046927SAndroid Build Coastguard Worker {
164*61046927SAndroid Build Coastguard Worker    struct vk_private_data_slot *slot =
165*61046927SAndroid Build Coastguard Worker       vk_alloc2(&device->alloc, pAllocator, sizeof(*slot), 8,
166*61046927SAndroid Build Coastguard Worker                 VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
167*61046927SAndroid Build Coastguard Worker    if (slot == NULL)
168*61046927SAndroid Build Coastguard Worker       return VK_ERROR_OUT_OF_HOST_MEMORY;
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker    vk_object_base_init(device, &slot->base,
171*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_PRIVATE_DATA_SLOT);
172*61046927SAndroid Build Coastguard Worker    slot->index = p_atomic_inc_return(&device->private_data_next_index);
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker    *pPrivateDataSlot = vk_private_data_slot_to_handle(slot);
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker void
vk_private_data_slot_destroy(struct vk_device * device,VkPrivateDataSlot privateDataSlot,const VkAllocationCallbacks * pAllocator)180*61046927SAndroid Build Coastguard Worker vk_private_data_slot_destroy(struct vk_device *device,
181*61046927SAndroid Build Coastguard Worker                              VkPrivateDataSlot privateDataSlot,
182*61046927SAndroid Build Coastguard Worker                              const VkAllocationCallbacks *pAllocator)
183*61046927SAndroid Build Coastguard Worker {
184*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_private_data_slot, slot, privateDataSlot);
185*61046927SAndroid Build Coastguard Worker    if (slot == NULL)
186*61046927SAndroid Build Coastguard Worker       return;
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker    vk_object_base_finish(&slot->base);
189*61046927SAndroid Build Coastguard Worker    vk_free2(&device->alloc, pAllocator, slot);
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker static VkResult
get_swapchain_private_data_locked(struct vk_device * device,uint64_t objectHandle,struct vk_private_data_slot * slot,uint64_t ** private_data)193*61046927SAndroid Build Coastguard Worker get_swapchain_private_data_locked(struct vk_device *device,
194*61046927SAndroid Build Coastguard Worker                                   uint64_t objectHandle,
195*61046927SAndroid Build Coastguard Worker                                   struct vk_private_data_slot *slot,
196*61046927SAndroid Build Coastguard Worker                                   uint64_t **private_data)
197*61046927SAndroid Build Coastguard Worker {
198*61046927SAndroid Build Coastguard Worker    if (unlikely(device->swapchain_private == NULL)) {
199*61046927SAndroid Build Coastguard Worker       /* Even though VkSwapchain/Surface are non-dispatchable objects, we know
200*61046927SAndroid Build Coastguard Worker        * a priori that these are actually pointers so we can use
201*61046927SAndroid Build Coastguard Worker        * the pointer hash table for them.
202*61046927SAndroid Build Coastguard Worker        */
203*61046927SAndroid Build Coastguard Worker       device->swapchain_private = _mesa_pointer_hash_table_create(NULL);
204*61046927SAndroid Build Coastguard Worker       if (device->swapchain_private == NULL)
205*61046927SAndroid Build Coastguard Worker          return VK_ERROR_OUT_OF_HOST_MEMORY;
206*61046927SAndroid Build Coastguard Worker    }
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker    struct hash_entry *entry =
209*61046927SAndroid Build Coastguard Worker       _mesa_hash_table_search(device->swapchain_private,
210*61046927SAndroid Build Coastguard Worker                               (void *)(uintptr_t)objectHandle);
211*61046927SAndroid Build Coastguard Worker    if (unlikely(entry == NULL)) {
212*61046927SAndroid Build Coastguard Worker       struct util_sparse_array *swapchain_private =
213*61046927SAndroid Build Coastguard Worker          ralloc(device->swapchain_private, struct util_sparse_array);
214*61046927SAndroid Build Coastguard Worker       util_sparse_array_init(swapchain_private, sizeof(uint64_t), 8);
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker       entry = _mesa_hash_table_insert(device->swapchain_private,
217*61046927SAndroid Build Coastguard Worker                                       (void *)(uintptr_t)objectHandle,
218*61046927SAndroid Build Coastguard Worker                                       swapchain_private);
219*61046927SAndroid Build Coastguard Worker       if (entry == NULL)
220*61046927SAndroid Build Coastguard Worker          return VK_ERROR_OUT_OF_HOST_MEMORY;
221*61046927SAndroid Build Coastguard Worker    }
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker    struct util_sparse_array *swapchain_private = entry->data;
224*61046927SAndroid Build Coastguard Worker    *private_data = util_sparse_array_get(swapchain_private, slot->index);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
227*61046927SAndroid Build Coastguard Worker }
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker static VkResult
vk_object_base_private_data(struct vk_device * device,VkObjectType objectType,uint64_t objectHandle,VkPrivateDataSlot privateDataSlot,uint64_t ** private_data)230*61046927SAndroid Build Coastguard Worker vk_object_base_private_data(struct vk_device *device,
231*61046927SAndroid Build Coastguard Worker                             VkObjectType objectType,
232*61046927SAndroid Build Coastguard Worker                             uint64_t objectHandle,
233*61046927SAndroid Build Coastguard Worker                             VkPrivateDataSlot privateDataSlot,
234*61046927SAndroid Build Coastguard Worker                             uint64_t **private_data)
235*61046927SAndroid Build Coastguard Worker {
236*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_private_data_slot, slot, privateDataSlot);
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker    /* There is an annoying spec corner here on Android.  Because WSI is
239*61046927SAndroid Build Coastguard Worker     * implemented in the Vulkan loader which doesn't know about the
240*61046927SAndroid Build Coastguard Worker     * VK_EXT_private_data extension, we have to handle VkSwapchainKHR in the
241*61046927SAndroid Build Coastguard Worker     * driver as a special case.  On future versions of Android where the
242*61046927SAndroid Build Coastguard Worker     * loader does understand VK_EXT_private_data, we'll never see a
243*61046927SAndroid Build Coastguard Worker     * vkGet/SetPrivateData call on a swapchain because the loader will
244*61046927SAndroid Build Coastguard Worker     * handle it.
245*61046927SAndroid Build Coastguard Worker     */
246*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
247*61046927SAndroid Build Coastguard Worker    if (objectType == VK_OBJECT_TYPE_SWAPCHAIN_KHR ||
248*61046927SAndroid Build Coastguard Worker        objectType == VK_OBJECT_TYPE_SURFACE_KHR) {
249*61046927SAndroid Build Coastguard Worker #else
250*61046927SAndroid Build Coastguard Worker    if (objectType == VK_OBJECT_TYPE_SURFACE_KHR) {
251*61046927SAndroid Build Coastguard Worker #endif
252*61046927SAndroid Build Coastguard Worker       mtx_lock(&device->swapchain_private_mtx);
253*61046927SAndroid Build Coastguard Worker       VkResult result = get_swapchain_private_data_locked(device, objectHandle,
254*61046927SAndroid Build Coastguard Worker                                                           slot, private_data);
255*61046927SAndroid Build Coastguard Worker       mtx_unlock(&device->swapchain_private_mtx);
256*61046927SAndroid Build Coastguard Worker       return result;
257*61046927SAndroid Build Coastguard Worker    }
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker    struct vk_object_base *obj =
260*61046927SAndroid Build Coastguard Worker       vk_object_base_from_u64_handle(objectHandle, objectType);
261*61046927SAndroid Build Coastguard Worker    *private_data = util_sparse_array_get(&obj->private_data, slot->index);
262*61046927SAndroid Build Coastguard Worker 
263*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker VkResult
267*61046927SAndroid Build Coastguard Worker vk_object_base_set_private_data(struct vk_device *device,
268*61046927SAndroid Build Coastguard Worker                                 VkObjectType objectType,
269*61046927SAndroid Build Coastguard Worker                                 uint64_t objectHandle,
270*61046927SAndroid Build Coastguard Worker                                 VkPrivateDataSlot privateDataSlot,
271*61046927SAndroid Build Coastguard Worker                                 uint64_t data)
272*61046927SAndroid Build Coastguard Worker {
273*61046927SAndroid Build Coastguard Worker    uint64_t *private_data;
274*61046927SAndroid Build Coastguard Worker    VkResult result = vk_object_base_private_data(device,
275*61046927SAndroid Build Coastguard Worker                                                  objectType, objectHandle,
276*61046927SAndroid Build Coastguard Worker                                                  privateDataSlot,
277*61046927SAndroid Build Coastguard Worker                                                  &private_data);
278*61046927SAndroid Build Coastguard Worker    if (unlikely(result != VK_SUCCESS))
279*61046927SAndroid Build Coastguard Worker       return result;
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker    *private_data = data;
282*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker void
286*61046927SAndroid Build Coastguard Worker vk_object_base_get_private_data(struct vk_device *device,
287*61046927SAndroid Build Coastguard Worker                                 VkObjectType objectType,
288*61046927SAndroid Build Coastguard Worker                                 uint64_t objectHandle,
289*61046927SAndroid Build Coastguard Worker                                 VkPrivateDataSlot privateDataSlot,
290*61046927SAndroid Build Coastguard Worker                                 uint64_t *pData)
291*61046927SAndroid Build Coastguard Worker {
292*61046927SAndroid Build Coastguard Worker    uint64_t *private_data;
293*61046927SAndroid Build Coastguard Worker    VkResult result = vk_object_base_private_data(device,
294*61046927SAndroid Build Coastguard Worker                                                  objectType, objectHandle,
295*61046927SAndroid Build Coastguard Worker                                                  privateDataSlot,
296*61046927SAndroid Build Coastguard Worker                                                  &private_data);
297*61046927SAndroid Build Coastguard Worker    if (likely(result == VK_SUCCESS)) {
298*61046927SAndroid Build Coastguard Worker       *pData = *private_data;
299*61046927SAndroid Build Coastguard Worker    } else {
300*61046927SAndroid Build Coastguard Worker       *pData = 0;
301*61046927SAndroid Build Coastguard Worker    }
302*61046927SAndroid Build Coastguard Worker }
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
305*61046927SAndroid Build Coastguard Worker vk_common_CreatePrivateDataSlot(VkDevice _device,
306*61046927SAndroid Build Coastguard Worker                                 const VkPrivateDataSlotCreateInfo *pCreateInfo,
307*61046927SAndroid Build Coastguard Worker                                 const VkAllocationCallbacks *pAllocator,
308*61046927SAndroid Build Coastguard Worker                                 VkPrivateDataSlot *pPrivateDataSlot)
309*61046927SAndroid Build Coastguard Worker {
310*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_device, device, _device);
311*61046927SAndroid Build Coastguard Worker    return vk_private_data_slot_create(device, pCreateInfo, pAllocator,
312*61046927SAndroid Build Coastguard Worker                                       pPrivateDataSlot);
313*61046927SAndroid Build Coastguard Worker }
314*61046927SAndroid Build Coastguard Worker 
315*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
316*61046927SAndroid Build Coastguard Worker vk_common_DestroyPrivateDataSlot(VkDevice _device,
317*61046927SAndroid Build Coastguard Worker                                  VkPrivateDataSlot privateDataSlot,
318*61046927SAndroid Build Coastguard Worker                                  const VkAllocationCallbacks *pAllocator)
319*61046927SAndroid Build Coastguard Worker {
320*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_device, device, _device);
321*61046927SAndroid Build Coastguard Worker    vk_private_data_slot_destroy(device, privateDataSlot, pAllocator);
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker VKAPI_ATTR VkResult VKAPI_CALL
325*61046927SAndroid Build Coastguard Worker vk_common_SetPrivateData(VkDevice _device,
326*61046927SAndroid Build Coastguard Worker                          VkObjectType objectType,
327*61046927SAndroid Build Coastguard Worker                          uint64_t objectHandle,
328*61046927SAndroid Build Coastguard Worker                          VkPrivateDataSlot privateDataSlot,
329*61046927SAndroid Build Coastguard Worker                          uint64_t data)
330*61046927SAndroid Build Coastguard Worker {
331*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_device, device, _device);
332*61046927SAndroid Build Coastguard Worker    return vk_object_base_set_private_data(device,
333*61046927SAndroid Build Coastguard Worker                                           objectType, objectHandle,
334*61046927SAndroid Build Coastguard Worker                                           privateDataSlot, data);
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker VKAPI_ATTR void VKAPI_CALL
338*61046927SAndroid Build Coastguard Worker vk_common_GetPrivateData(VkDevice _device,
339*61046927SAndroid Build Coastguard Worker                          VkObjectType objectType,
340*61046927SAndroid Build Coastguard Worker                          uint64_t objectHandle,
341*61046927SAndroid Build Coastguard Worker                          VkPrivateDataSlot privateDataSlot,
342*61046927SAndroid Build Coastguard Worker                          uint64_t *pData)
343*61046927SAndroid Build Coastguard Worker {
344*61046927SAndroid Build Coastguard Worker    VK_FROM_HANDLE(vk_device, device, _device);
345*61046927SAndroid Build Coastguard Worker    vk_object_base_get_private_data(device,
346*61046927SAndroid Build Coastguard Worker                                    objectType, objectHandle,
347*61046927SAndroid Build Coastguard Worker                                    privateDataSlot, pData);
348*61046927SAndroid Build Coastguard Worker }
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker const char *
351*61046927SAndroid Build Coastguard Worker vk_object_base_name(struct vk_object_base *obj)
352*61046927SAndroid Build Coastguard Worker {
353*61046927SAndroid Build Coastguard Worker    if (obj->object_name)
354*61046927SAndroid Build Coastguard Worker       return obj->object_name;
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker    obj->object_name = vk_asprintf(&obj->device->alloc,
357*61046927SAndroid Build Coastguard Worker                                   VK_SYSTEM_ALLOCATION_SCOPE_DEVICE,
358*61046927SAndroid Build Coastguard Worker                                   "%s(0x%"PRIx64")",
359*61046927SAndroid Build Coastguard Worker                                   vk_ObjectType_to_ObjectName(obj->type),
360*61046927SAndroid Build Coastguard Worker                                   (uint64_t)(uintptr_t)obj);
361*61046927SAndroid Build Coastguard Worker 
362*61046927SAndroid Build Coastguard Worker    return obj->object_name;
363*61046927SAndroid Build Coastguard Worker }
364