diff --git a/src/compiler/nir/nir_opt_varyings.c b/src/compiler/nir/nir_opt_varyings.c index ae609185fcf..7d62f528dd4 100644 --- a/src/compiler/nir/nir_opt_varyings.c +++ b/src/compiler/nir/nir_opt_varyings.c @@ -893,6 +893,14 @@ can_remove_varying(struct linkage_info *linkage, gl_varying_slot location) 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 88352954211..5929a88f63d 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 @@ TEST_F(nir_opt_varyings_test_dead_output, \ 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 1648464ba0f..8346008c4c1 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_DIST0, 0, float, 32, 314) 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 2b1a0470f5c..9af2acae970 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_DIST0, 0, float, 32) 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 987b9d6d384..51852c827dd 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_DIST0, 0, float, 32) 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 75579f34fd0..fd8c2b6ffd9 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_DIST0, 0, float, 32) 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)