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)