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>
This commit is contained in:
Timur Kristóf
2024-04-12 00:01:24 +02:00
committed by Marge Bot
parent 91dd9c35be
commit 2b1031ec10
6 changed files with 15 additions and 5 deletions

View File

@@ -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

View File

@@ -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) \

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)