Module: Mesa Branch: staging/23.3 Commit: 64e82b1d586ae62204820fb7ca6565cf6ea487cd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=64e82b1d586ae62204820fb7ca6565cf6ea487cd
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> (cherry picked from commit d434a127f9df32f67f901362b8d02ef9b564115e) --- .pick_status.json | 2 +- src/compiler/nir/nir_opt_move_discards_to_top.c | 43 +++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 80d351de5d5..80ce161b92c 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -74,7 +74,7 @@ "description": "nir/opt_move_discards_to_top: don't schedule discard/demote across subgroup operations", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "b447f5049b6d68fd80b7337bc1f7c79b1b1a4765", "notes": null 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..e7f245a37c5 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,47 @@ 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_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; }