From d4500d9b56d8a8a97cb09f11130b9b7259f297f0 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 23 Jul 2025 15:46:55 +0200 Subject: [PATCH] radv: fix a memleak with GS copy shader NIR Really need to refactor this code... Cc: mesa-stable Signed-off-by: Samuel Pitoiset Part-of: (cherry picked from commit 0cd745c386a342e2bc8b1cc5cfd26f33b771910d) --- .pick_status.json | 2 +- src/amd/vulkan/radv_pipeline_graphics.c | 5 +++++ src/amd/vulkan/radv_shader_object.c | 9 +++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index c8531ac6e05..7d63c0a9fd9 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2474,7 +2474,7 @@ "description": "radv: fix a memleak with GS copy shader NIR", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/vulkan/radv_pipeline_graphics.c b/src/amd/vulkan/radv_pipeline_graphics.c index 543a21dfc3e..eb02c7bcdb9 100644 --- a/src/amd/vulkan/radv_pipeline_graphics.c +++ b/src/amd/vulkan/radv_pipeline_graphics.c @@ -2849,6 +2849,10 @@ radv_graphics_pipeline_state_finish(struct radv_device *device, struct radv_grap if (gfx_state->stages) { for (uint32_t i = 0; i < MESA_VULKAN_SHADER_STAGES; i++) ralloc_free(gfx_state->stages[i].nir); + + if (gfx_state->stages[MESA_SHADER_GEOMETRY].gs_copy_shader) + ralloc_free(gfx_state->stages[MESA_SHADER_GEOMETRY].gs_copy_shader); + free(gfx_state->stages); } } @@ -2915,6 +2919,7 @@ radv_generate_graphics_pipeline_state(struct radv_device *device, const VkGraphi for (unsigned i = 0; i < MESA_VULKAN_SHADER_STAGES; i++) { gfx_state->stages[i].stage = MESA_SHADER_NONE; gfx_state->stages[i].nir = NULL; + gfx_state->stages[i].gs_copy_shader = NULL; gfx_state->stages[i].spirv.size = 0; gfx_state->stages[i].next_stage = MESA_SHADER_NONE; } diff --git a/src/amd/vulkan/radv_shader_object.c b/src/amd/vulkan/radv_shader_object.c index 468ae72c147..ea82dd8cf48 100644 --- a/src/amd/vulkan/radv_shader_object.c +++ b/src/amd/vulkan/radv_shader_object.c @@ -128,6 +128,7 @@ radv_shader_object_init_graphics(struct radv_shader_object *shader_obj, struct r for (unsigned i = 0; i < MESA_VULKAN_SHADER_STAGES; i++) { stages[i].stage = MESA_SHADER_NONE; + stages[i].gs_copy_shader = NULL; stages[i].nir = NULL; stages[i].spirv.size = 0; stages[i].next_stage = MESA_SHADER_NONE; @@ -162,6 +163,8 @@ radv_shader_object_init_graphics(struct radv_shader_object *shader_obj, struct r binary = binaries[stage]; ralloc_free(stages[stage].nir); + if (stages[MESA_SHADER_GEOMETRY].gs_copy_shader) + ralloc_free(stages[MESA_SHADER_GEOMETRY].gs_copy_shader); shader_obj->shader = shader; shader_obj->binary = binary; @@ -189,6 +192,8 @@ radv_shader_object_init_graphics(struct radv_shader_object *shader_obj, struct r binary = binaries[stage]; ralloc_free(stages[stage].nir); + if (stages[MESA_SHADER_GEOMETRY].gs_copy_shader) + ralloc_free(stages[MESA_SHADER_GEOMETRY].gs_copy_shader); if (stage == MESA_SHADER_VERTEX) { if (next_stage == MESA_SHADER_TESS_CTRL) { @@ -414,6 +419,7 @@ radv_shader_object_create_linked(VkDevice _device, uint32_t createInfoCount, con for (unsigned i = 0; i < MESA_VULKAN_SHADER_STAGES; i++) { stages[i].stage = MESA_SHADER_NONE; + stages[i].gs_copy_shader = NULL; stages[i].nir = NULL; stages[i].spirv.size = 0; stages[i].next_stage = MESA_SHADER_NONE; @@ -539,6 +545,9 @@ radv_shader_object_create_linked(VkDevice _device, uint32_t createInfoCount, con pShaders[i] = radv_shader_object_to_handle(shader_obj); } + if (stages[MESA_SHADER_GEOMETRY].gs_copy_shader) + ralloc_free(stages[MESA_SHADER_GEOMETRY].gs_copy_shader); + return VK_SUCCESS; }