Module: Mesa Branch: main Commit: 66fe427ebc21a2c3b02e8be4489c55fda2228a38 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=66fe427ebc21a2c3b02e8be4489c55fda2228a38
Author: Mike Blumenkrantz <[email protected]> Date: Tue Mar 28 16:50:24 2023 -0400 zink: stop leaking separate shader nir this is a huge memleak Fixes: e3b746e3a31 ("zink: use GPL to handle (simple) separate shader objects") Reviewed-by: Daniel Schürmann <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22175> --- src/gallium/drivers/zink/zink_compiler.c | 7 ++++--- src/gallium/drivers/zink/zink_compiler.h | 2 +- src/gallium/drivers/zink/zink_program.c | 5 ++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 0e9a6978e83..b309ca1d9c6 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -3275,7 +3275,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, } VkShaderModule -zink_shader_compile_separate(struct zink_screen *screen, struct zink_shader *zs, nir_shader **ret_nir) +zink_shader_compile_separate(struct zink_screen *screen, struct zink_shader *zs) { nir_shader *nir = nir_shader_clone(NULL, zs->nir); int set = nir->info.stage == MESA_SHADER_FRAGMENT; @@ -3303,8 +3303,9 @@ zink_shader_compile_separate(struct zink_screen *screen, struct zink_shader *zs, } } optimize_nir(nir, zs); - *ret_nir = nir; - return compile_module(screen, zs, nir); + VkShaderModule mod = compile_module(screen, zs, nir); + ralloc_free(nir); + return mod; } static bool diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index 30a3111e68f..178c0d5c638 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -63,7 +63,7 @@ zink_compiler_assign_io(struct zink_screen *screen, nir_shader *producer, nir_sh VkShaderModule zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shader *nir, const struct zink_shader_key *key, const void *extra_data); VkShaderModule -zink_shader_compile_separate(struct zink_screen *screen, struct zink_shader *zs, nir_shader **ret_nir); +zink_shader_compile_separate(struct zink_screen *screen, struct zink_shader *zs); VkShaderModule zink_shader_spirv_compile(struct zink_screen *screen, struct zink_shader *zs, struct spirv_shader *spirv); struct zink_shader * diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index b2bee7fc68c..bf8e7cf6659 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -2018,11 +2018,10 @@ precompile_separate_shader_job(void *data, void *gdata, int thread_index) struct zink_screen *screen = gdata; struct zink_shader *zs = data; - nir_shader *nir; - zs->precompile.mod = zink_shader_compile_separate(screen, zs, &nir); + zs->precompile.mod = zink_shader_compile_separate(screen, zs); zink_descriptor_shader_init(screen, zs); VkShaderModule mods[ZINK_GFX_SHADER_COUNT] = {0}; - mods[nir->info.stage] = zs->precompile.mod; + mods[zs->nir->info.stage] = zs->precompile.mod; zs->precompile.gpl = zink_create_gfx_pipeline_separate(screen, mods, zs->precompile.layout); }
