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;
          }
 

Reply via email to