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:
@@ -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
|
||||
|
@@ -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) \
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user