radv: fix a big memleak with VK_EXT_shader_object

Shaders and binaries weren't freed at all!

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27715>
This commit is contained in:
Samuel Pitoiset
2024-02-21 09:21:46 +01:00
committed by Marge Bot
parent e88a5842b2
commit 77f036d574
2 changed files with 23 additions and 0 deletions
+2
View File
@@ -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;
+21
View File
@@ -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;