zink: stop leaking separate shader nir
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 28 Mar 2023 20:50:24 +0000 (16:50 -0400)
committerMarge Bot <emma+marge@anholt.net>
Wed, 29 Mar 2023 08:14:01 +0000 (08:14 +0000)
this is a huge memleak

Fixes: e3b746e3a31 ("zink: use GPL to handle (simple) separate shader objects")

Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22175>

src/gallium/drivers/zink/zink_compiler.c
src/gallium/drivers/zink/zink_compiler.h
src/gallium/drivers/zink/zink_program.c

index 0e9a697..b309ca1 100644 (file)
@@ -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
index 30a3111..178c0d5 100644 (file)
@@ -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 *
index b2bee7f..bf8e7cf 100644 (file)
@@ -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);
 }