From c720f3e639c75284bf5f35839b6eb3f71d98cf67 Mon Sep 17 00:00:00 2001 From: Ashwin Kolhe Date: Wed, 18 Jan 2017 14:16:49 -0800 Subject: [PATCH] Implement SPV_KHR_subgroup_vote 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 | 2 +- SPIRV/GlslangToSpv.cpp | 19 ++++++------ SPIRV/doc.cpp | 16 ++++++++++ SPIRV/spirv.hpp | 4 +++ Test/baseResults/spv.shaderGroupVote.comp.out | 43 +++++++++++++-------------- 5 files changed, 50 insertions(+), 34 deletions(-) diff --git a/SPIRV/GLSL.ext.KHR.h b/SPIRV/GLSL.ext.KHR.h index 344dd39..4614a3c 100644 --- a/SPIRV/GLSL.ext.KHR.h +++ b/SPIRV/GLSL.ext.KHR.h @@ -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 diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 5e3dc52..c061318 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -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)) diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp index de401c7..0bb9e01 100755 --- a/SPIRV/doc.cpp +++ b/SPIRV/doc.cpp @@ -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'"); diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp index 088b1af..c7b3d5f 100755 --- a/SPIRV/spirv.hpp +++ b/SPIRV/spirv.hpp @@ -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, + OpSubgroupAnyKHR = 4429, + OpSubgroupAllEqualKHR = 4430, OpMax = 0x7fffffff, }; diff --git a/Test/baseResults/spv.shaderGroupVote.comp.out b/Test/baseResults/spv.shaderGroupVote.comp.out index f8bfae8..464787f 100644 --- a/Test/baseResults/spv.shaderGroupVote.comp.out +++ b/Test/baseResults/spv.shaderGroupVote.comp.out @@ -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 -- 2.7.4