spirv: Add subgroup vote support
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 24 Aug 2017 18:01:22 +0000 (11:01 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 7 Mar 2018 20:13:47 +0000 (12:13 -0800)
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/compiler/shader_info.h
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_subgroup.c

index f876111b0b182e37348dc0dba4757f0b68594bc6..c8ac0b90b33fe8da23525b7094cb5ea61a72406c 100644 (file)
@@ -47,6 +47,7 @@ struct spirv_supported_capabilities {
    bool shader_viewport_index_layer;
    bool subgroup_ballot;
    bool subgroup_basic;
+   bool subgroup_vote;
 };
 
 typedef struct shader_info {
index 38a1df9fd2106a07d001bb50fe778801327a82b1..1358d0749933bb7dd85f17f3bfa651b6982c4f4b 100644 (file)
@@ -3296,6 +3296,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
          spv_check_supported(subgroup_basic, cap);
          break;
 
+      case SpvCapabilityGroupNonUniformVote:
+         spv_check_supported(subgroup_vote, cap);
+         break;
+
       case SpvCapabilitySubgroupBallotKHR:
       case SpvCapabilityGroupNonUniformBallot:
          spv_check_supported(subgroup_ballot, cap);
index a86f0cb2832a0f3791f10f12a67a417623f45405..09e4e598b26e497013899fba813dc08486639cb6 100644 (file)
@@ -180,7 +180,52 @@ vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode,
 
    case SpvOpGroupNonUniformAll:
    case SpvOpGroupNonUniformAny:
-   case SpvOpGroupNonUniformAllEqual:
+   case SpvOpGroupNonUniformAllEqual: {
+      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:
+         op = nir_intrinsic_vote_all;
+         break;
+      case SpvOpGroupNonUniformAny:
+         op = nir_intrinsic_vote_any;
+         break;
+      case SpvOpGroupNonUniformAllEqual: {
+         switch (glsl_get_base_type(val->type->type)) {
+         case GLSL_TYPE_FLOAT:
+         case GLSL_TYPE_DOUBLE:
+            op = nir_intrinsic_vote_feq;
+            break;
+         case GLSL_TYPE_UINT:
+         case GLSL_TYPE_INT:
+         case GLSL_TYPE_UINT64:
+         case GLSL_TYPE_INT64:
+         case GLSL_TYPE_BOOL:
+            op = nir_intrinsic_vote_ieq;
+            break;
+         default:
+            unreachable("Unhandled type");
+         }
+         break;
+      }
+      default:
+         unreachable("Unhandled opcode");
+      }
+
+      nir_ssa_def *src0 = vtn_ssa_value(b, w[4])->def;
+
+      nir_intrinsic_instr *intrin =
+         nir_intrinsic_instr_create(b->nb.shader, op);
+      intrin->num_components = src0->num_components;
+      intrin->src[0] = nir_src_for_ssa(src0);
+      nir_ssa_dest_init(&intrin->instr, &intrin->dest, 1, 32, NULL);
+      nir_builder_instr_insert(&b->nb, &intrin->instr);
+
+      val->ssa->def = &intrin->dest.ssa;
+      break;
+   }
+
    case SpvOpGroupNonUniformShuffle:
    case SpvOpGroupNonUniformShuffleXor:
    case SpvOpGroupNonUniformShuffleUp: