Module: Mesa Branch: main Commit: d434a127f9df32f67f901362b8d02ef9b564115e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d434a127f9df32f67f901362b8d02ef9b564115e
Author: Daniel Schürmann <dan...@schuermann.dev> Date: Wed Aug 24 18:05:32 2022 +0200 nir/opt_move_discards_to_top: don't schedule discard/demote across subgroup operations Fixes: b447f5049b6d68fd80b7337bc1f7c79b1b1a4765 ('nir: Add a discard optimization pass') Reviewed-by: Georg Lehmann <dadschoo...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18249> --- src/compiler/nir/nir_opt_move_discards_to_top.c | 45 +++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/compiler/nir/nir_opt_move_discards_to_top.c b/src/compiler/nir/nir_opt_move_discards_to_top.c index 051e271def3..201ccd79eeb 100644 --- a/src/compiler/nir/nir_opt_move_discards_to_top.c +++ b/src/compiler/nir/nir_opt_move_discards_to_top.c @@ -165,10 +165,49 @@ opt_move_discards_to_top_impl(nir_function_impl *impl) instr->pass_flags = STOP_PROCESSING_INSTR_FLAG; goto break_all; } - - if ((intrin->intrinsic == nir_intrinsic_discard_if && consider_discards) || - intrin->intrinsic == nir_intrinsic_demote_if) + switch (intrin->intrinsic) { + case nir_intrinsic_quad_broadcast: + case nir_intrinsic_quad_swap_horizontal: + case nir_intrinsic_quad_swap_vertical: + case nir_intrinsic_quad_swap_diagonal: + case nir_intrinsic_quad_vote_all: + case nir_intrinsic_quad_vote_any: + case nir_intrinsic_quad_swizzle_amd: + consider_discards = false; + break; + case nir_intrinsic_vote_any: + case nir_intrinsic_vote_all: + case nir_intrinsic_vote_feq: + case nir_intrinsic_vote_ieq: + case nir_intrinsic_ballot: + case nir_intrinsic_first_invocation: + case nir_intrinsic_read_invocation: + case nir_intrinsic_read_first_invocation: + case nir_intrinsic_elect: + case nir_intrinsic_reduce: + case nir_intrinsic_inclusive_scan: + case nir_intrinsic_exclusive_scan: + case nir_intrinsic_shuffle: + case nir_intrinsic_shuffle_xor: + case nir_intrinsic_shuffle_up: + case nir_intrinsic_shuffle_down: + case nir_intrinsic_rotate: + case nir_intrinsic_masked_swizzle_amd: + instr->pass_flags = STOP_PROCESSING_INSTR_FLAG; + goto break_all; + case nir_intrinsic_discard_if: + if (!consider_discards) { + /* assume that a shader either uses discard or demote, but not both */ + instr->pass_flags = STOP_PROCESSING_INSTR_FLAG; + goto break_all; + } + FALLTHROUGH; + case nir_intrinsic_demote_if: moved = moved || try_move_discard(intrin); + break; + default: + break; + } continue; }