2 * Copyright © 2020 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 #include "vk_object.h"
29 vk_object_base_init(UNUSED
struct vk_device
*device
,
30 struct vk_object_base
*base
,
31 UNUSED VkObjectType obj_type
)
33 base
->_loader_data
.loaderMagic
= ICD_LOADER_MAGIC
;
34 base
->type
= obj_type
;
35 util_sparse_array_init(&base
->private_data
, sizeof(uint64_t), 8);
39 vk_object_base_finish(struct vk_object_base
*base
)
41 util_sparse_array_finish(&base
->private_data
);
45 vk_device_init(struct vk_device
*device
,
46 UNUSED
const VkDeviceCreateInfo
*pCreateInfo
,
47 const VkAllocationCallbacks
*instance_alloc
,
48 const VkAllocationCallbacks
*device_alloc
)
50 vk_object_base_init(device
, &device
->base
, VK_OBJECT_TYPE_DEVICE
);
52 device
->alloc
= *device_alloc
;
54 device
->alloc
= *instance_alloc
;
56 p_atomic_set(&device
->private_data_next_index
, 0);
60 vk_device_finish(UNUSED
struct vk_device
*device
)
62 vk_object_base_finish(&device
->base
);
66 vk_private_data_slot_create(struct vk_device
*device
,
67 const VkPrivateDataSlotCreateInfoEXT
* pCreateInfo
,
68 const VkAllocationCallbacks
* pAllocator
,
69 VkPrivateDataSlotEXT
* pPrivateDataSlot
)
71 struct vk_private_data_slot
*slot
=
72 vk_alloc2(&device
->alloc
, pAllocator
, sizeof(*slot
), 8,
73 VK_SYSTEM_ALLOCATION_SCOPE_DEVICE
);
75 return VK_ERROR_OUT_OF_HOST_MEMORY
;
77 vk_object_base_init(device
, &slot
->base
,
78 VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT
);
79 slot
->index
= p_atomic_inc_return(&device
->private_data_next_index
);
81 *pPrivateDataSlot
= vk_private_data_slot_to_handle(slot
);
87 vk_private_data_slot_destroy(struct vk_device
*device
,
88 VkPrivateDataSlotEXT privateDataSlot
,
89 const VkAllocationCallbacks
*pAllocator
)
91 VK_FROM_HANDLE(vk_private_data_slot
, slot
, privateDataSlot
);
95 vk_object_base_finish(&slot
->base
);
96 vk_free2(&device
->alloc
, pAllocator
, slot
);
100 vk_object_base_private_data(VkObjectType objectType
,
101 uint64_t objectHandle
,
102 VkPrivateDataSlotEXT privateDataSlot
)
104 VK_FROM_HANDLE(vk_private_data_slot
, slot
, privateDataSlot
);
105 struct vk_object_base
*obj
=
106 vk_object_base_from_u64_handle(objectHandle
, objectType
);
107 return util_sparse_array_get(&obj
->private_data
, slot
->index
);
111 vk_object_base_set_private_data(struct vk_device
*device
,
112 VkObjectType objectType
,
113 uint64_t objectHandle
,
114 VkPrivateDataSlotEXT privateDataSlot
,
117 uint64_t *private_data
=
118 vk_object_base_private_data(objectType
, objectHandle
, privateDataSlot
);
119 *private_data
= data
;
124 vk_object_base_get_private_data(struct vk_device
*device
,
125 VkObjectType objectType
,
126 uint64_t objectHandle
,
127 VkPrivateDataSlotEXT privateDataSlot
,
130 uint64_t *private_data
=
131 vk_object_base_private_data(objectType
, objectHandle
, privateDataSlot
);
132 *pData
= *private_data
;