From 44cf6f7564d4bdcc15299007fc12b32e2e9ad1f2 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 8 Jun 2022 15:48:17 -0400 Subject: [PATCH] zink: fix generated tcs deletion deleting the generated shader on the first loop iteration like this was broken if the shader was used in multiple programs, so delete at the end cc: mesa-stable Reviewed-by: Adam Jackson Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index a02232a..f3fac35 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -2896,15 +2896,19 @@ zink_shader_free(struct zink_context *ctx, struct zink_shader *shader) _mesa_hash_table_remove_key(&ctx->program_cache[prog->stages_present >> 2], prog->shaders); prog->base.removed = true; } - prog->shaders[pstage] = NULL; - if (shader->nir->info.stage == MESA_SHADER_TESS_EVAL && shader->generated) { - /* automatically destroy generated tcs shaders when tes is destroyed */ - zink_shader_free(ctx, shader->generated); - shader->generated = NULL; - } + if (shader->nir->info.stage != MESA_SHADER_TESS_CTRL || !shader->is_generated) + prog->shaders[pstage] = NULL; + /* only remove generated tcs during parent tes destruction */ + if (shader->nir->info.stage == MESA_SHADER_TESS_EVAL && shader->generated) + prog->shaders[PIPE_SHADER_TESS_CTRL] = NULL; zink_gfx_program_reference(ctx, &prog, NULL); } } + if (shader->nir->info.stage == MESA_SHADER_TESS_EVAL && shader->generated) { + /* automatically destroy generated tcs shaders when tes is destroyed */ + zink_shader_free(ctx, shader->generated); + shader->generated = NULL; + } _mesa_set_destroy(shader->programs, NULL); ralloc_free(shader->nir); ralloc_free(shader->spirv); -- 2.7.4