[Mesa-dev] [PATCH 1/2] nir/spirv: add support for the SubgroupVoteKHR SPIR-V capability

Daniel Schürmann daniel.schuermann at campus.tu-berlin.de
Fri Mar 9 10:17:04 UTC 2018


This capability is required for the VK_EXT_shader_subgroup_vote extension.

Signed-off-by: Daniel Schürmann <daniel.schuermann at campus.tu-berlin.de>
---
 src/compiler/spirv/spirv_to_nir.c |  4 ++++
 src/compiler/spirv/vtn_subgroup.c | 20 ++++++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 6a358c5973..a7e01a705b 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -3299,6 +3299,7 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
          spv_check_supported(subgroup_basic, cap);
          break;
 
+      case SpvCapabilitySubgroupVoteKHR:
       case SpvCapabilityGroupNonUniformVote:
          spv_check_supported(subgroup_vote, cap);
          break;
@@ -3935,6 +3936,9 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
    case SpvOpGroupNonUniformLogicalXor:
    case SpvOpGroupNonUniformQuadBroadcast:
    case SpvOpGroupNonUniformQuadSwap:
+   case SpvOpSubgroupAllKHR:
+   case SpvOpSubgroupAnyKHR:
+   case SpvOpSubgroupAllEqualKHR:
       vtn_handle_subgroup(b, opcode, w, count);
       break;
 
diff --git a/src/compiler/spirv/vtn_subgroup.c b/src/compiler/spirv/vtn_subgroup.c
index 73420b7e43..0042217616 100644
--- a/src/compiler/spirv/vtn_subgroup.c
+++ b/src/compiler/spirv/vtn_subgroup.c
@@ -186,18 +186,24 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
 
    case SpvOpGroupNonUniformAll:
    case SpvOpGroupNonUniformAny:
-   case SpvOpGroupNonUniformAllEqual: {
+   case SpvOpGroupNonUniformAllEqual:
+   case SpvOpSubgroupAllKHR:
+   case SpvOpSubgroupAnyKHR:
+   case SpvOpSubgroupAllEqualKHR: {
       vtn_fail_if(val->type->type != glsl_bool_type(),
                   "OpGroupNonUniform(All|Any|AllEqual) must return a bool");
       nir_intrinsic_op op;
       switch (opcode) {
       case SpvOpGroupNonUniformAll:
+      case SpvOpSubgroupAllKHR:
          op = nir_intrinsic_vote_all;
          break;
       case SpvOpGroupNonUniformAny:
+      case SpvOpSubgroupAnyKHR:
          op = nir_intrinsic_vote_any;
          break;
-      case SpvOpGroupNonUniformAllEqual: {
+      case SpvOpGroupNonUniformAllEqual:
+      case SpvOpSubgroupAllEqualKHR: {
          switch (glsl_get_base_type(val->type->type)) {
          case GLSL_TYPE_FLOAT:
          case GLSL_TYPE_DOUBLE:
@@ -219,8 +225,14 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
          unreachable("Unhandled opcode");
       }
 
-      nir_ssa_def *src0 = vtn_ssa_value(b, w[4])->def;
-
+      nir_ssa_def *src0;
+      if (opcode == SpvOpGroupNonUniformAll ||
+          opcode == SpvOpGroupNonUniformAny ||
+          opcode == SpvOpGroupNonUniformAllEqual) {
+         src0 = vtn_ssa_value(b, w[4])->def;
+	  } else {
+         src0 = vtn_ssa_value(b, w[3])->def;
+      }
       nir_intrinsic_instr *intrin =
          nir_intrinsic_instr_create(b->nb.shader, op);
       intrin->num_components = src0->num_components;
-- 
2.14.1



More information about the mesa-dev mailing list