From 14dab6b10cc93fcc7b17af7d969698fb03af87b6 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Thu, 25 Aug 2022 08:23:27 +0200 Subject: [PATCH] v3dv: ref/unref pipeline layout objects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since KHR_maintenance4 it is possible to destroy pipeline layouts immediately after creating pipelines. Reviewed-by: Alejandro PiƱeiro Part-of: --- src/broadcom/vulkan/v3dv_descriptor_set.c | 3 ++- src/broadcom/vulkan/v3dv_pipeline.c | 9 +++++++++ src/broadcom/vulkan/v3dv_private.h | 22 ++++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dv_descriptor_set.c b/src/broadcom/vulkan/v3dv_descriptor_set.c index dc5baae2410..52edcf11e2d 100644 --- a/src/broadcom/vulkan/v3dv_descriptor_set.c +++ b/src/broadcom/vulkan/v3dv_descriptor_set.c @@ -339,6 +339,7 @@ v3dv_CreatePipelineLayout(VkDevice _device, return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); layout->num_sets = pCreateInfo->setLayoutCount; + layout->ref_cnt = 1; uint32_t dynamic_offset_count = 0; for (uint32_t set = 0; set < pCreateInfo->setLayoutCount; set++) { @@ -405,7 +406,7 @@ v3dv_DestroyPipelineLayout(VkDevice _device, if (!pipeline_layout) return; - v3dv_pipeline_layout_destroy(device, pipeline_layout, pAllocator); + v3dv_pipeline_layout_unref(device, pipeline_layout, pAllocator); } VKAPI_ATTR VkResult VKAPI_CALL diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 3d35396fa97..b9493aba41e 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -150,6 +150,9 @@ v3dv_destroy_pipeline(struct v3dv_pipeline *pipeline, if (pipeline->executables.mem_ctx) ralloc_free(pipeline->executables.mem_ctx); + if (pipeline->layout) + v3dv_pipeline_layout_unref(device, pipeline->layout, pAllocator); + vk_object_free(&device->vk, pAllocator, pipeline); } @@ -3025,6 +3028,8 @@ pipeline_init(struct v3dv_pipeline *pipeline, /* This must be done after the pipeline has been compiled */ pipeline_set_ez_state(pipeline, ds_info); + v3dv_pipeline_layout_ref(pipeline->layout); + return result; } @@ -3265,6 +3270,10 @@ compute_pipeline_init(struct v3dv_pipeline *pipeline, pipeline->layout = layout; VkResult result = pipeline_compile_compute(pipeline, cache, info, alloc); + if (result != VK_SUCCESS) + return result; + + v3dv_pipeline_layout_ref(pipeline->layout); return result; } diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 29c5c5d8006..8de3cc21f25 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1842,6 +1842,11 @@ struct v3dv_pipeline_layout { uint32_t dynamic_offset_count; uint32_t push_constant_size; + /* Pipeline layouts can be destroyed after creating pipelines since + * maintenance4. + */ + uint32_t ref_cnt; + unsigned char sha1[20]; }; @@ -1850,6 +1855,23 @@ v3dv_pipeline_layout_destroy(struct v3dv_device *device, struct v3dv_pipeline_layout *layout, const VkAllocationCallbacks *alloc); +static inline void +v3dv_pipeline_layout_ref(struct v3dv_pipeline_layout *layout) +{ + assert(layout && layout->ref_cnt >= 1); + p_atomic_inc(&layout->ref_cnt); +} + +static inline void +v3dv_pipeline_layout_unref(struct v3dv_device *device, + struct v3dv_pipeline_layout *layout, + const VkAllocationCallbacks *alloc) +{ + assert(layout && layout->ref_cnt >= 1); + if (p_atomic_dec_zero(&layout->ref_cnt)) + v3dv_pipeline_layout_destroy(device, layout, alloc); +} + /* * We are using descriptor maps for ubo/ssbo and texture/samplers, so we need * it to be big enough to include the max value for all of them.