From 9b76fc40335e8d42d58d28acefdee2dd28f07d3b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Sun, 25 Sep 2022 12:18:12 -0400 Subject: [PATCH] zink: reorder zink_destroy_gfx_program() this ensures that pipeline cache entries are freed before shaders Reviewed-by: Adam Jackson Part-of: --- src/gallium/drivers/zink/zink_program.c | 38 ++++++++++++------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 881a6af0c70..fdbe00e68ef 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -1132,25 +1132,6 @@ void zink_destroy_gfx_program(struct zink_screen *screen, struct zink_gfx_program *prog) { - deinit_program(screen, &prog->base); - - for (int i = 0; i < ZINK_GFX_SHADER_COUNT; ++i) { - if (prog->shaders[i]) { - _mesa_set_remove_key(prog->shaders[i]->programs, prog); - prog->shaders[i] = NULL; - } - destroy_shader_cache(screen, &prog->shader_cache[i][0][0]); - destroy_shader_cache(screen, &prog->shader_cache[i][0][1]); - destroy_shader_cache(screen, &prog->shader_cache[i][1][0]); - destroy_shader_cache(screen, &prog->shader_cache[i][1][1]); - ralloc_free(prog->nir[i]); - } - - set_foreach_remove(&prog->libs, he) { - struct zink_gfx_library_key *gkey = (void*)he->key; - VKSCR(DestroyPipeline)(screen->dev, gkey->pipeline, NULL); - } - unsigned max_idx = ARRAY_SIZE(prog->pipelines[0]); if (screen->info.have_EXT_extended_dynamic_state) { /* only need first 3/4 for point/line/tri/patch */ @@ -1174,6 +1155,25 @@ zink_destroy_gfx_program(struct zink_screen *screen, } } + deinit_program(screen, &prog->base); + + for (int i = 0; i < ZINK_GFX_SHADER_COUNT; ++i) { + if (prog->shaders[i]) { + _mesa_set_remove_key(prog->shaders[i]->programs, prog); + prog->shaders[i] = NULL; + } + destroy_shader_cache(screen, &prog->shader_cache[i][0][0]); + destroy_shader_cache(screen, &prog->shader_cache[i][0][1]); + destroy_shader_cache(screen, &prog->shader_cache[i][1][0]); + destroy_shader_cache(screen, &prog->shader_cache[i][1][1]); + ralloc_free(prog->nir[i]); + } + + set_foreach_remove(&prog->libs, he) { + struct zink_gfx_library_key *gkey = (void*)he->key; + VKSCR(DestroyPipeline)(screen->dev, gkey->pipeline, NULL); + } + ralloc_free(prog); }