From 77f036d574c04afcff60aa27f845aa95df32d4ba Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 21 Feb 2024 09:21:46 +0100 Subject: [PATCH] radv: fix a big memleak with VK_EXT_shader_object Shaders and binaries weren't freed at all! Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_shader.h | 2 ++ src/amd/vulkan/radv_shader_object.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 8d155801153..566c5bbc790 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -729,6 +729,8 @@ struct radv_shader_object { gl_shader_stage stage; + VkShaderCodeTypeEXT code_type; + /* Main shader */ struct radv_shader *shader; struct radv_shader_binary *binary; diff --git a/src/amd/vulkan/radv_shader_object.c b/src/amd/vulkan/radv_shader_object.c index d19e5feb0fe..f5c61ce75dc 100644 --- a/src/amd/vulkan/radv_shader_object.c +++ b/src/amd/vulkan/radv_shader_object.c @@ -23,10 +23,29 @@ #include "radv_private.h" +static void +radv_shader_object_destroy_variant(struct radv_device *device, VkShaderCodeTypeEXT code_type, + struct radv_shader *shader, struct radv_shader_binary *binary) +{ + if (shader) + radv_shader_unref(device, shader); + + if (code_type == VK_SHADER_CODE_TYPE_SPIRV_EXT) + free(binary); +} + static void radv_shader_object_destroy(struct radv_device *device, struct radv_shader_object *shader_obj, const VkAllocationCallbacks *pAllocator) { + radv_shader_object_destroy_variant(device, shader_obj->code_type, shader_obj->as_ls.shader, + shader_obj->as_ls.binary); + radv_shader_object_destroy_variant(device, shader_obj->code_type, shader_obj->as_es.shader, + shader_obj->as_es.binary); + radv_shader_object_destroy_variant(device, shader_obj->code_type, shader_obj->gs.copy_shader, + shader_obj->gs.copy_binary); + radv_shader_object_destroy_variant(device, shader_obj->code_type, shader_obj->shader, shader_obj->binary); + vk_object_base_finish(&shader_obj->base); vk_free2(&device->vk.alloc, pAllocator, shader_obj); } @@ -284,6 +303,7 @@ radv_shader_object_init(struct radv_shader_object *shader_obj, struct radv_devic radv_get_shader_layout(pCreateInfo, &layout); shader_obj->stage = vk_to_mesa_shader_stage(pCreateInfo->stage); + shader_obj->code_type = pCreateInfo->codeType; shader_obj->push_constant_size = layout.push_constant_size; shader_obj->dynamic_offset_count = layout.dynamic_offset_count; @@ -477,6 +497,7 @@ radv_shader_object_create_linked(VkDevice _device, uint32_t createInfoCount, con vk_object_base_init(&device->vk, &shader_obj->base, VK_OBJECT_TYPE_SHADER_EXT); shader_obj->stage = s; + shader_obj->code_type = pCreateInfo->codeType; shader_obj->push_constant_size = stages[s].layout.push_constant_size; shader_obj->dynamic_offset_count = stages[s].layout.dynamic_offset_count;