Mesa (master): zink: clone shader before lowering clip_halfz

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 22 20:12:32 UTC 2021


Module: Mesa
Branch: master
Commit: 92ec7b577c8cb47b308bba1d21b4c2ec05f35f9f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=92ec7b577c8cb47b308bba1d21b4c2ec05f35f9f

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Fri Jan 22 16:14:32 2021 +0100

zink: clone shader before lowering clip_halfz

If we don't clone the shader before lowering clip_halfz, we risk ending
up performing the same lowering multiple times, each time we compile a
new variant.

This fixes rendering in Neverball.

Fixes: 15f478fe840 ("zink: only run nir_lower_clip_halfz for last vertex processing stage")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4147
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8652>

---

 src/gallium/drivers/zink/zink_compiler.c | 35 +++++++++++++++++---------------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 01b5be7f6df..040e9c8339b 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -313,6 +313,17 @@ update_so_info(struct zink_shader *sh,
    }
 }
 
+static bool
+last_vertex_stage(struct zink_shader *zs)
+{
+   assert(zs->nir->info.stage != MESA_SHADER_FRAGMENT);
+   if (zs->has_geometry_shader)
+      return zs->nir->info.stage == MESA_SHADER_GEOMETRY;
+   if (zs->has_tess_shader)
+      return zs->nir->info.stage == MESA_SHADER_TESS_EVAL;
+   return true;
+}
+
 VkShaderModule
 zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct zink_shader_key *key,
                     unsigned char *shader_slot_map, unsigned char *shader_slots_reserved)
@@ -321,26 +332,18 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
    void *streamout = NULL;
    nir_shader *nir = zs->nir;
    /* TODO: use a separate mem ctx here for ralloc */
-   if (zs->has_geometry_shader) {
-      if (zs->nir->info.stage == MESA_SHADER_GEOMETRY) {
-         streamout = &zs->streamout;
-         NIR_PASS_V(nir, nir_lower_clip_halfz);
-      }
-   } else if (zs->has_tess_shader) {
-      if (zs->nir->info.stage == MESA_SHADER_TESS_EVAL) {
-         streamout = &zs->streamout;
+   if (zs->nir->info.stage != MESA_SHADER_FRAGMENT) {
+      if (last_vertex_stage(zs)) {
+         if (zs->streamout.so_info_slots)
+            streamout = &zs->streamout;
+
+         nir = nir_shader_clone(NULL, zs->nir);
          NIR_PASS_V(nir, nir_lower_clip_halfz);
       }
    } else {
-      streamout = &zs->streamout;
-      NIR_PASS_V(nir, nir_lower_clip_halfz);
-   }
-   if (!zs->streamout.so_info_slots)
-       streamout = NULL;
-   if (zs->nir->info.stage == MESA_SHADER_FRAGMENT) {
-      nir = nir_shader_clone(NULL, nir);
       if (!zink_fs_key(key)->samples &&
           nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) {
+         nir = nir_shader_clone(NULL, zs->nir);
          /* VK will always use gl_SampleMask[] values even if sample count is 0,
           * so we need to skip this write here to mimic GL's behavior of ignoring it
           */
@@ -376,7 +379,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
    if (vkCreateShaderModule(screen->dev, &smci, NULL, &mod) != VK_SUCCESS)
       mod = VK_NULL_HANDLE;
 
-   if (zs->nir->info.stage == MESA_SHADER_FRAGMENT)
+   if (nir != zs->nir)
       ralloc_free(nir);
 
    /* TODO: determine if there's any reason to cache spirv output? */



More information about the mesa-commit mailing list