Module: Mesa
Branch: main
Commit: 1cfb0ae92cdb2b6b248aebd528f0c28d238f7930
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1cfb0ae92cdb2b6b248aebd528f0c28d238f7930

Author: Connor Abbott <cwabbo...@gmail.com>
Date:   Mon Feb  4 12:47:53 2019 +0100

nir: Add quad vote intrinsics

Both Intel and AMD have special hardware support for these.

Reviewed-by: Ian Romanick <ian.d.roman...@intel.com>
Reviewed-by: Georg Lehmann <dadschoo...@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/218>

---

 src/compiler/nir/nir_divergence_analysis.c | 2 ++
 src/compiler/nir/nir_gather_info.c         | 2 ++
 src/compiler/nir/nir_intrinsics.py         | 6 ++++++
 3 files changed, 10 insertions(+)

diff --git a/src/compiler/nir/nir_divergence_analysis.c 
b/src/compiler/nir/nir_divergence_analysis.c
index 91a5135deb2..9e295c01624 100644
--- a/src/compiler/nir/nir_divergence_analysis.c
+++ b/src/compiler/nir/nir_divergence_analysis.c
@@ -420,6 +420,8 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr 
*instr)
    case nir_intrinsic_quad_swap_horizontal:
    case nir_intrinsic_quad_swap_vertical:
    case nir_intrinsic_quad_swap_diagonal:
+   case nir_intrinsic_quad_vote_any:
+   case nir_intrinsic_quad_vote_all:
    case nir_intrinsic_load_deref:
    case nir_intrinsic_load_shared:
    case nir_intrinsic_load_shared2_amd:
diff --git a/src/compiler/nir/nir_gather_info.c 
b/src/compiler/nir/nir_gather_info.c
index 040949fe1b4..d363d176343 100644
--- a/src/compiler/nir/nir_gather_info.c
+++ b/src/compiler/nir/nir_gather_info.c
@@ -724,6 +724,8 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, 
nir_shader *shader,
       }
       break;
 
+   case nir_intrinsic_quad_vote_any:
+   case nir_intrinsic_quad_vote_all:
    case nir_intrinsic_quad_broadcast:
    case nir_intrinsic_quad_swap_horizontal:
    case nir_intrinsic_quad_swap_vertical:
diff --git a/src/compiler/nir/nir_intrinsics.py 
b/src/compiler/nir/nir_intrinsics.py
index 93b8b5280cf..bc1f81ed0cb 100644
--- a/src/compiler/nir/nir_intrinsics.py
+++ b/src/compiler/nir/nir_intrinsics.py
@@ -499,6 +499,12 @@ intrinsic("quad_swap_horizontal", src_comp=[0], 
dest_comp=0, bit_sizes=src0, fla
 intrinsic("quad_swap_vertical", src_comp=[0], dest_comp=0, bit_sizes=src0, 
flags=[CAN_ELIMINATE])
 intrinsic("quad_swap_diagonal", src_comp=[0], dest_comp=0, bit_sizes=src0, 
flags=[CAN_ELIMINATE])
 
+# Similar to vote_any and vote_all, but per-quad instead of per-wavefront.
+# Equivalent to subgroupOr(val, 4) and subgroupAnd(val, 4) assuming val is
+# boolean.
+intrinsic("quad_vote_any", src_comp=[1], dest_comp=1, flags=[CAN_ELIMINATE])
+intrinsic("quad_vote_all", src_comp=[1], dest_comp=1, flags=[CAN_ELIMINATE])
+
 # Rotate operation from SPIR-V: SpvOpGroupNonUniformRotateKHR.
 intrinsic("rotate", src_comp=[0, 1], dest_comp=0, bit_sizes=src0,
           indices=[EXECUTION_SCOPE, CLUSTER_SIZE], flags=[CAN_ELIMINATE]);

Reply via email to