anv,vulkan: Implement VK_EXT_private_data
[mesa.git] / src / vulkan / util / vk_object.c
index f84a68034b07d0e3a7ee414656eae4713397f66b..789cf12b15cf6888639da7a55122559a6bdd72f4 100644 (file)
 
 #include "vk_object.h"
 
+#include "vk_alloc.h"
+
 void
 vk_object_base_init(UNUSED struct vk_device *device,
                     struct vk_object_base *base,
                     UNUSED VkObjectType obj_type)
 {
    base->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
-#ifndef NDEBUG
    base->type = obj_type;
-#endif
+   util_sparse_array_init(&base->private_data, sizeof(uint64_t), 8);
 }
 
 void
-vk_object_base_finish(UNUSED struct vk_object_base *base)
+vk_object_base_finish(struct vk_object_base *base)
 {
+   util_sparse_array_finish(&base->private_data);
 }
 
 void
@@ -50,6 +52,8 @@ vk_device_init(struct vk_device *device,
       device->alloc = *device_alloc;
    else
       device->alloc = *instance_alloc;
+
+   p_atomic_set(&device->private_data_next_index, 0);
 }
 
 void
@@ -57,3 +61,73 @@ vk_device_finish(UNUSED struct vk_device *device)
 {
    vk_object_base_finish(&device->base);
 }
+
+VkResult
+vk_private_data_slot_create(struct vk_device *device,
+                            const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+                            const VkAllocationCallbacks* pAllocator,
+                            VkPrivateDataSlotEXT* pPrivateDataSlot)
+{
+   struct vk_private_data_slot *slot =
+      vk_alloc2(&device->alloc, pAllocator, sizeof(*slot), 8,
+                VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
+   if (slot == NULL)
+      return VK_ERROR_OUT_OF_HOST_MEMORY;
+
+   vk_object_base_init(device, &slot->base,
+                       VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT);
+   slot->index = p_atomic_inc_return(&device->private_data_next_index);
+
+   *pPrivateDataSlot = vk_private_data_slot_to_handle(slot);
+
+   return VK_SUCCESS;
+}
+
+void
+vk_private_data_slot_destroy(struct vk_device *device,
+                             VkPrivateDataSlotEXT privateDataSlot,
+                             const VkAllocationCallbacks *pAllocator)
+{
+   VK_FROM_HANDLE(vk_private_data_slot, slot, privateDataSlot);
+   if (slot == NULL)
+      return;
+
+   vk_object_base_finish(&slot->base);
+   vk_free2(&device->alloc, pAllocator, slot);
+}
+
+static uint64_t *
+vk_object_base_private_data(VkObjectType objectType,
+                            uint64_t objectHandle,
+                            VkPrivateDataSlotEXT privateDataSlot)
+{
+   VK_FROM_HANDLE(vk_private_data_slot, slot, privateDataSlot);
+   struct vk_object_base *obj =
+      vk_object_base_from_u64_handle(objectHandle, objectType);
+   return util_sparse_array_get(&obj->private_data, slot->index);
+}
+
+VkResult
+vk_object_base_set_private_data(struct vk_device *device,
+                                VkObjectType objectType,
+                                uint64_t objectHandle,
+                                VkPrivateDataSlotEXT privateDataSlot,
+                                uint64_t data)
+{
+   uint64_t *private_data =
+      vk_object_base_private_data(objectType, objectHandle, privateDataSlot);
+   *private_data = data;
+   return VK_SUCCESS;
+}
+
+void
+vk_object_base_get_private_data(struct vk_device *device,
+                                VkObjectType objectType,
+                                uint64_t objectHandle,
+                                VkPrivateDataSlotEXT privateDataSlot,
+                                uint64_t *pData)
+{
+   uint64_t *private_data =
+      vk_object_base_private_data(objectType, objectHandle, privateDataSlot);
+   *pData = *private_data;
+}