From b28899a26129f075ab65aaa72df8e9cc385809b5 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Thu, 6 Oct 2022 16:46:19 +0200 Subject: [PATCH] vk/descriptor_set_layout: Add optional destructor Drivers implementing descriptor buffers will want to allocate and free descriptors with the layout for embedded samplers, so we need a hook to allow them to free any GPU buffers. Part-of: --- src/vulkan/runtime/vk_descriptor_set_layout.c | 8 ++++++++ src/vulkan/runtime/vk_descriptor_set_layout.h | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/vulkan/runtime/vk_descriptor_set_layout.c b/src/vulkan/runtime/vk_descriptor_set_layout.c index f70302a101c..9e657bec4c5 100644 --- a/src/vulkan/runtime/vk_descriptor_set_layout.c +++ b/src/vulkan/runtime/vk_descriptor_set_layout.c @@ -35,6 +35,7 @@ vk_descriptor_set_layout_init(struct vk_device *device, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT); layout->ref_cnt = 1; + layout->destroy = vk_descriptor_set_layout_destroy; } void * @@ -73,6 +74,13 @@ vk_descriptor_set_layout_multizalloc(struct vk_device *device, return layout; } +void +vk_descriptor_set_layout_destroy(struct vk_device *device, + struct vk_descriptor_set_layout *layout) +{ + vk_object_free(device, NULL, layout); +} + VKAPI_ATTR void VKAPI_CALL vk_common_DestroyDescriptorSetLayout(VkDevice _device, VkDescriptorSetLayout descriptorSetLayout, diff --git a/src/vulkan/runtime/vk_descriptor_set_layout.h b/src/vulkan/runtime/vk_descriptor_set_layout.h index 4c43c5e4722..857ec1a7bea 100644 --- a/src/vulkan/runtime/vk_descriptor_set_layout.h +++ b/src/vulkan/runtime/vk_descriptor_set_layout.h @@ -34,6 +34,9 @@ extern "C" { struct vk_descriptor_set_layout { struct vk_object_base base; + void (*destroy)(struct vk_device *device, + struct vk_descriptor_set_layout *layout); + /** Reference count * * It's often necessary to store a pointer to the descriptor set layout in @@ -60,6 +63,9 @@ void *vk_descriptor_set_layout_zalloc(struct vk_device *device, size_t size); void *vk_descriptor_set_layout_multizalloc(struct vk_device *device, struct vk_multialloc *ma); +void vk_descriptor_set_layout_destroy(struct vk_device *device, + struct vk_descriptor_set_layout *layout); + static inline struct vk_descriptor_set_layout * vk_descriptor_set_layout_ref(struct vk_descriptor_set_layout *layout) { @@ -74,7 +80,7 @@ vk_descriptor_set_layout_unref(struct vk_device *device, { assert(layout && layout->ref_cnt >= 1); if (p_atomic_dec_zero(&layout->ref_cnt)) - vk_object_free(device, NULL, layout); + layout->destroy(device, layout); } #ifdef __cplusplus