Mesa (staging/22.1): zink: fix generated tcs deletion

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 15 16:22:56 UTC 2022


Module: Mesa
Branch: staging/22.1
Commit: 64e5a702fbba7445c9dcfa35541de7d756ae6bb7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=64e5a702fbba7445c9dcfa35541de7d756ae6bb7

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>
(cherry picked from commit 44cf6f7564d4bdcc15299007fc12b32e2e9ad1f2)

---

 .pick_status.json                        |  2 +-
 src/gallium/drivers/zink/zink_compiler.c | 16 ++++++++++------
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index bcb0725f6fb..adb1922e9bf 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1183,7 +1183,7 @@
         "description": "zink: fix generated tcs deletion",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null
     },
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 87ca8933df7..e004825ef18 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -2238,15 +2238,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