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);
 }
 

Reply via email to