Implement SPV_KHR_subgroup_vote
authorAshwin Kolhe <ashwin.kolhe@gmail.com>
Wed, 18 Jan 2017 22:16:49 +0000 (14:16 -0800)
committerAshwin Kolhe <ashwin.kolhe@gmail.com>
Wed, 18 Jan 2017 22:16:49 +0000 (14:16 -0800)
doc.cpp: Add capabilities, scope to the opcodes. Add opcode and
capability strings.
GLSL.ext.KHR.h: Add extension
string.
GlslangToSpv.cpp: Fix handling of opcodes to generate
appropriate SPIR-V.
spirv.hpp: Add capability and opcode
enums.
spv.shaderGroupVote.comp.out: Update SPIR-V output for test
shader.

SPIRV/GLSL.ext.KHR.h
SPIRV/GlslangToSpv.cpp
SPIRV/doc.cpp
SPIRV/spirv.hpp
Test/baseResults/spv.shaderGroupVote.comp.out

index 344dd39..4614a3c 100644 (file)
@@ -32,5 +32,5 @@ static const char* const E_SPV_KHR_shader_ballot                = "SPV_KHR_shade
 
 // SPV_KHR_shader_draw_parameters
 static const char* const E_SPV_KHR_shader_draw_parameters       = "SPV_KHR_shader_draw_parameters";
-
+static const char* const E_SPV_KHR_subgroup_vote                = "SPV_KHR_subgroup_vote";
 #endif  // #ifndef GLSLextKHR_H
index 5e3dc52..c061318 100755 (executable)
@@ -4136,6 +4136,11 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
         op == glslang::EOpReadInvocation) {
         builder.addExtension(spv::E_SPV_KHR_shader_ballot);
         builder.addCapability(spv::CapabilitySubgroupBallotKHR);
+    } else if (op == glslang::EOpAnyInvocation ||
+        op == glslang::EOpAllInvocations ||
+        op == glslang::EOpAllInvocationsEqual) {
+        builder.addExtension(spv::E_SPV_KHR_subgroup_vote);
+        builder.addCapability(spv::CapabilitySubgroupVoteKHR);
     } else {
         builder.addCapability(spv::CapabilityGroups);
 #ifdef AMD_EXTENSIONS
@@ -4158,20 +4163,14 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
 
     switch (op) {
     case glslang::EOpAnyInvocation:
-        opCode = spv::OpGroupAny;
+        opCode = spv::OpSubgroupAnyKHR;
         break;
     case glslang::EOpAllInvocations:
-        opCode = spv::OpGroupAll;
+        opCode = spv::OpSubgroupAllKHR;
         break;
     case glslang::EOpAllInvocationsEqual:
-    {
-        spv::Id groupAll = builder.createOp(spv::OpGroupAll, typeId, spvGroupOperands);
-        spv::Id groupAny = builder.createOp(spv::OpGroupAny, typeId, spvGroupOperands);
-
-        return builder.createBinOp(spv::OpLogicalOr, typeId, groupAll,
-                                   builder.createUnaryOp(spv::OpLogicalNot, typeId, groupAny));
-    }
-
+        opCode = spv::OpSubgroupAllEqualKHR;
+        break;
     case glslang::EOpReadInvocation:
         opCode = spv::OpSubgroupReadInvocationKHR;
         if (builder.isVectorType(typeId))
index de401c7..0bb9e01 100755 (executable)
@@ -819,6 +819,7 @@ const char* CapabilityString(int info)
 
     case 4423: return "SubgroupBallotKHR";
     case 4427: return "DrawParameters";
+    case 4431: return "SubgroupVoteKHR";
 
 #ifdef NV_EXTENSIONS
     case 5251: return "GeometryShaderPassthroughNV";
@@ -1158,6 +1159,9 @@ const char* OpcodeString(int op)
 
     case 4421: return "OpSubgroupBallotKHR";
     case 4422: return "OpSubgroupFirstInvocationKHR";
+    case 4428: return "OpSubgroupAnyKHR";
+    case 4429: return "OpSubgroupAllKHR";
+    case 4430: return "OpSubgroupAllEqualKHR";
     case 4432: return "OpSubgroupReadInvocationKHR";
 
 #ifdef AMD_EXTENSIONS
@@ -2771,6 +2775,18 @@ void Parameterize()
 
     InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'");
 
+    InstructionDesc[OpSubgroupAnyKHR].capabilities.push_back(CapabilitySubgroupVoteKHR);
+    InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpSubgroupAnyKHR].operands.push(OperandId, "'Predicate'");
+
+    InstructionDesc[OpSubgroupAllKHR].capabilities.push_back(CapabilitySubgroupVoteKHR);
+    InstructionDesc[OpSubgroupAllKHR].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpSubgroupAllKHR].operands.push(OperandId, "'Predicate'");
+
+    InstructionDesc[OpSubgroupAllEqualKHR].capabilities.push_back(CapabilitySubgroupVoteKHR);
+    InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandScope, "'Execution'");
+    InstructionDesc[OpSubgroupAllEqualKHR].operands.push(OperandId, "'Predicate'");
+
     InstructionDesc[OpSubgroupReadInvocationKHR].capabilities.push_back(CapabilityGroups);
     InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'");
     InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'");
index 088b1af..c7b3d5f 100755 (executable)
@@ -605,6 +605,7 @@ enum Capability {
     CapabilityMultiViewport = 57,
     CapabilitySubgroupBallotKHR = 4423,
     CapabilityDrawParameters = 4427,
+    CapabilitySubgroupVoteKHR = 4431,
     CapabilityMax = 0x7fffffff,
 };
 
@@ -906,6 +907,9 @@ enum Op {
     OpSubgroupBallotKHR = 4421,
     OpSubgroupFirstInvocationKHR = 4422,
     OpSubgroupReadInvocationKHR = 4432,
+    OpSubgroupAllKHR = 4428,\r
+    OpSubgroupAnyKHR = 4429,\r
+    OpSubgroupAllEqualKHR = 4430,
     OpMax = 0x7fffffff,
 };
 
index f8bfae8..464787f 100644 (file)
@@ -3,10 +3,11 @@ Warning, version 450 is not yet complete; most version-specific features are pre
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 37
+// Id's are bound by 33
 
                               Capability Shader
-                              Capability Groups
+                              Capability SubgroupVoteKHR
+                              Extension  "SPV_KHR_subgroup_vote"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               EntryPoint GLCompute 4  "main"
@@ -22,7 +23,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               Decorate 10(Buffers) BufferBlock
                               Decorate 12 DescriptorSet 0
                               Decorate 12 Binding 0
-                              Decorate 36 BuiltIn WorkgroupSize
+                              Decorate 32 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeBool
@@ -35,11 +36,10 @@ Warning, version 450 is not yet complete; most version-specific features are pre
               14:     13(int) Constant 0
               15:             TypePointer Uniform 9(int)
               18:      9(int) Constant 0
-              21:      9(int) Constant 3
-              31:      9(int) Constant 1
-              34:             TypeVector 9(int) 3
-              35:      9(int) Constant 4
-              36:   34(ivec3) ConstantComposite 35 35 31
+              27:      9(int) Constant 1
+              30:             TypeVector 9(int) 3
+              31:      9(int) Constant 4
+              32:   30(ivec3) ConstantComposite 31 31 27
          4(main):           2 Function None 3
                5:             Label
            8(b1):      7(ptr) Variable Function
@@ -48,20 +48,17 @@ Warning, version 450 is not yet complete; most version-specific features are pre
               19:     6(bool) INotEqual 17 18
                               Store 8(b1) 19
               20:     6(bool) Load 8(b1)
-              22:     6(bool) GroupAny 21 20
-                              Store 8(b1) 22
-              23:     6(bool) Load 8(b1)
-              24:     6(bool) GroupAll 21 23
-                              Store 8(b1) 24
-              25:     6(bool) Load 8(b1)
-              26:     6(bool) GroupAll 21 25
-              27:     6(bool) GroupAny 21 25
-              28:     6(bool) LogicalNot 27
-              29:     6(bool) LogicalOr 26 28
-                              Store 8(b1) 29
-              30:     6(bool) Load 8(b1)
-              32:      9(int) Select 30 31 18
-              33:     15(ptr) AccessChain 12 14
-                              Store 33 32
+              21:     6(bool) SubgroupAllKHR 20
+                              Store 8(b1) 21
+              22:     6(bool) Load 8(b1)
+              23:     6(bool) SubgroupAnyKHR 22
+                              Store 8(b1) 23
+              24:     6(bool) Load 8(b1)
+              25:     6(bool) SubgroupAllEqualKHR 24
+                              Store 8(b1) 25
+              26:     6(bool) Load 8(b1)
+              28:      9(int) Select 26 27 18
+              29:     15(ptr) AccessChain 12 14
+                              Store 29 28
                               Return
                               FunctionEnd