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

Reply via email to