Mesa (main): zink: fix generated tcs deletion

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 14 19:34:38 UTC 2022


Module: Mesa
Branch: main
Commit: 44cf6f7564d4bdcc15299007fc12b32e2e9ad1f2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=44cf6f7564d4bdcc15299007fc12b32e2e9ad1f2

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Wed Jun  8 15:48:17 2022 -0400

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 <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17010>

---

 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 a02232add52..f3fac35f2f6 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);



More information about the mesa-commit mailing list