nir/opt_varyings: Add workaround for RADV mesh shader multiview.

The layer output is added in ac_nir_lower_ngg which is called
later than this pass; prevent deleting layer input from FS here.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28685>
diff --git a/src/compiler/nir/nir_opt_varyings.c b/src/compiler/nir/nir_opt_varyings.c
index ae60918..7d62f52 100644
--- a/src/compiler/nir/nir_opt_varyings.c
+++ b/src/compiler/nir/nir_opt_varyings.c
@@ -893,6 +893,14 @@
           location == VARYING_SLOT_FOGC)
          return true;
 
+      /* Workaround for mesh shader multiview in RADV.
+       * A layer output is inserted by ac_nir_lower_ngg which is called later.
+       * Prevent removing the layer input from FS when producer is MS.
+       */
+      if (linkage->producer_stage == MESA_SHADER_MESH &&
+          location == VARYING_SLOT_LAYER)
+         return false;
+
       /* These can be removed as varyings, which means they will be demoted to
        * sysval-only outputs keeping their culling/rasterization functions
        * while not passing the values to FS. Drivers should handle
diff --git a/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp b/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp
index 8835295..5929a88 100644
--- a/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp
+++ b/src/compiler/nir/tests/opt_varyings_tests_dead_output.cpp
@@ -40,7 +40,9 @@
    ASSERT_TRUE(nir_intrinsic_io_semantics(intr).no_varying == \
                (VARYING_SLOT_##slot != VARYING_SLOT_POS && \
                 VARYING_SLOT_##slot != VARYING_SLOT_PSIZ && \
-                VARYING_SLOT_##slot != VARYING_SLOT_CLIP_VERTEX)); \
+                VARYING_SLOT_##slot != VARYING_SLOT_CLIP_VERTEX && \
+                /* RADV mesh multiview workaround */ \
+                (MESA_SHADER_##producer_stage != MESA_SHADER_MESH || VARYING_SLOT_##slot != VARYING_SLOT_LAYER))); \
 }
 
 #define TEST_DEAD_OUTPUT_KEPT_XFB(producer_stage, consumer_stage, slot, bitsize) \
diff --git a/src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp b/src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp
index 1648464..8346008 100644
--- a/src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp
+++ b/src/compiler/nir/tests/opt_varyings_tests_prop_const.cpp
@@ -408,7 +408,7 @@
 TEST_CONST_PROP(MESH, FRAGMENT, CLIP_DIST1, 0, float, 32, 314)
 TEST_CONST_PROP(MESH, FRAGMENT, CULL_DIST0, 0, float, 32, 314)
 TEST_CONST_PROP(MESH, FRAGMENT, CULL_DIST1, 0, float, 32, 314)
-TEST_CONST_PROP(MESH, FRAGMENT, LAYER, 0, float, 32, 314)
+TEST_CONST_KEPT(MESH, FRAGMENT, LAYER, 0, float, 32, 314) /* RADV mesh multiview workaround */
 TEST_CONST_PROP(MESH, FRAGMENT, VIEWPORT, 0, float, 32, 314)
 TEST_CONST_PROP(MESH, FRAGMENT, VAR0, 0, float, 32, 314)
 TEST_CONST_PROP(MESH, FRAGMENT, VAR0, 0, float, 16, 314)
diff --git a/src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp b/src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp
index 2b1a047..9af2aca 100644
--- a/src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp
+++ b/src/compiler/nir/tests/opt_varyings_tests_prop_ubo.cpp
@@ -372,7 +372,7 @@
 TEST_UBO_PROP(MESH, FRAGMENT, CLIP_DIST1, 0, float, 32)
 TEST_UBO_PROP(MESH, FRAGMENT, CULL_DIST0, 0, float, 32)
 TEST_UBO_PROP(MESH, FRAGMENT, CULL_DIST1, 0, float, 32)
-TEST_UBO_PROP(MESH, FRAGMENT, LAYER, 0, float, 32)
+TEST_UBO_KEPT(MESH, FRAGMENT, LAYER, 0, float, 32) /* RADV mesh multiview workaround */
 TEST_UBO_PROP(MESH, FRAGMENT, VIEWPORT, 0, float, 32)
 TEST_UBO_PROP(MESH, FRAGMENT, VAR0, 0, float, 32)
 TEST_UBO_PROP(MESH, FRAGMENT, VAR0, 0, float, 16)
diff --git a/src/compiler/nir/tests/opt_varyings_tests_prop_uniform.cpp b/src/compiler/nir/tests/opt_varyings_tests_prop_uniform.cpp
index 987b9d6..51852c8 100644
--- a/src/compiler/nir/tests/opt_varyings_tests_prop_uniform.cpp
+++ b/src/compiler/nir/tests/opt_varyings_tests_prop_uniform.cpp
@@ -372,7 +372,7 @@
 TEST_UNIFORM_PROP(MESH, FRAGMENT, CLIP_DIST1, 0, float, 32)
 TEST_UNIFORM_PROP(MESH, FRAGMENT, CULL_DIST0, 0, float, 32)
 TEST_UNIFORM_PROP(MESH, FRAGMENT, CULL_DIST1, 0, float, 32)
-TEST_UNIFORM_PROP(MESH, FRAGMENT, LAYER, 0, float, 32)
+TEST_UNIFORM_KEPT(MESH, FRAGMENT, LAYER, 0, float, 32) /* RADV mesh multiview workaround */
 TEST_UNIFORM_PROP(MESH, FRAGMENT, VIEWPORT, 0, float, 32)
 TEST_UNIFORM_PROP(MESH, FRAGMENT, VAR0, 0, float, 32)
 TEST_UNIFORM_PROP(MESH, FRAGMENT, VAR0, 0, float, 16)
diff --git a/src/compiler/nir/tests/opt_varyings_tests_prop_uniform_expr.cpp b/src/compiler/nir/tests/opt_varyings_tests_prop_uniform_expr.cpp
index 75579f3..fd8c2b6 100644
--- a/src/compiler/nir/tests/opt_varyings_tests_prop_uniform_expr.cpp
+++ b/src/compiler/nir/tests/opt_varyings_tests_prop_uniform_expr.cpp
@@ -371,7 +371,7 @@
 TEST_UNI_EXPR_PROP(MESH, FRAGMENT, CLIP_DIST1, 0, float, 32)
 TEST_UNI_EXPR_PROP(MESH, FRAGMENT, CULL_DIST0, 0, float, 32)
 TEST_UNI_EXPR_PROP(MESH, FRAGMENT, CULL_DIST1, 0, float, 32)
-TEST_UNI_EXPR_PROP(MESH, FRAGMENT, LAYER, 0, float, 32)
+TEST_UNI_EXPR_KEPT(MESH, FRAGMENT, LAYER, 0, float, 32) /* RADV mesh multiview workaround */
 TEST_UNI_EXPR_PROP(MESH, FRAGMENT, VIEWPORT, 0, float, 32)
 TEST_UNI_EXPR_PROP(MESH, FRAGMENT, VAR0, 0, float, 32)
 TEST_UNI_EXPR_PROP(MESH, FRAGMENT, VAR0, 0, float, 16)