diff --git a/Test/450.vert b/Test/450.vert index 801f1c5041b7530901b984190e6b69490678211c..51e9b100430fd2879141ddad920baaa1d932d1e6 100644 --- a/Test/450.vert +++ b/Test/450.vert @@ -39,5 +39,10 @@ void foo() atomicCounterCompSwap(aui, ui, ui); // ERROR, need 4.6 int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; // ERROR, need 4.6 + + bool b1; + anyInvocation(b1); // ERROR, need 4.6 + allInvocations(b1); // ERROR, need 4.6 + allInvocationsEqual(b1); // ERROR, need 4.6 } ; // ERROR: no extraneous semicolons diff --git a/Test/460.frag b/Test/460.frag index 3c32bc6f964398f7eb93a30421acdb1b3fa44bb7..43a7c3b389476b1b0e804891c31873ce650f1e7b 100644 --- a/Test/460.frag +++ b/Test/460.frag @@ -10,4 +10,8 @@ in S s; void main() { interpolateAtCentroid(s.v); + bool b1; + b1 = anyInvocation(b1); + b1 = allInvocations(b1); + b1 = allInvocationsEqual(b1); } diff --git a/Test/460.vert b/Test/460.vert index 17a916b4f610d781d7106216e6e6a16322c1bd51..fd87d8b1177d4b61a2f84daf53923c4ebd65eea9 100644 --- a/Test/460.vert +++ b/Test/460.vert @@ -6,6 +6,10 @@ float f;;; void main() { + bool b1; + b1 = anyInvocation(b1); + b1 = allInvocations(b1); + b1 = allInvocationsEqual(b1); } ; ; diff --git a/Test/baseResults/450.vert.out b/Test/baseResults/450.vert.out index b05a9a0dd4e2c1a3ff2894169cb5a4935a814631..64143de566024b5fb9c770e5eb808629c07fc840 100644 --- a/Test/baseResults/450.vert.out +++ b/Test/baseResults/450.vert.out @@ -15,8 +15,11 @@ ERROR: 0:41: 'gl_BaseVertex' : undeclared identifier ERROR: 0:41: 'gl_BaseInstance' : undeclared identifier ERROR: 0:41: 'gl_DrawID' : undeclared identifier ERROR: 0:41: '=' : cannot convert from ' temp float' to ' temp int' -ERROR: 0:43: 'extraneous semicolon' : not supported for this version or the enabled extensions -ERROR: 17 compilation errors. No code generated. +ERROR: 0:44: 'anyInvocation' : no matching overloaded function found +ERROR: 0:45: 'allInvocations' : no matching overloaded function found +ERROR: 0:46: 'allInvocationsEqual' : no matching overloaded function found +ERROR: 0:48: 'extraneous semicolon' : not supported for this version or the enabled extensions +ERROR: 20 compilation errors. No code generated. Shader version: 450 @@ -55,6 +58,12 @@ ERROR: node is still EOpNull! 0:38 0.000000 0:39 Constant: 0:39 0.000000 +0:44 Constant: +0:44 0.000000 +0:45 Constant: +0:45 0.000000 +0:46 Constant: +0:46 0.000000 0:? Linker Objects 0:? 'anon@0' ( out block{ out 3-element array of float CullDistance gl_CullDistance}) 0:? 'outb' ( smooth out bool) diff --git a/Test/baseResults/460.frag.out b/Test/baseResults/460.frag.out index cf4d5e2c746eae1c045595b6a921eb18f469fbcc..883d949b23c3bedd2cd833d2e95a9212fdffdb77 100755 --- a/Test/baseResults/460.frag.out +++ b/Test/baseResults/460.frag.out @@ -9,6 +9,18 @@ Shader version: 460 0:12 's' ( smooth in structure{ global float f, global 4-component vector of float v}) 0:12 Constant: 0:12 1 (const int) +0:14 move second child to first child ( temp bool) +0:14 'b1' ( temp bool) +0:14 anyInvocation ( global bool) +0:14 'b1' ( temp bool) +0:15 move second child to first child ( temp bool) +0:15 'b1' ( temp bool) +0:15 allInvocations ( global bool) +0:15 'b1' ( temp bool) +0:16 move second child to first child ( temp bool) +0:16 'b1' ( temp bool) +0:16 allInvocationsEqual ( global bool) +0:16 'b1' ( temp bool) 0:? Linker Objects 0:? 's' ( smooth in structure{ global float f, global 4-component vector of float v}) @@ -26,6 +38,18 @@ Shader version: 460 0:12 's' ( smooth in structure{ global float f, global 4-component vector of float v}) 0:12 Constant: 0:12 1 (const int) +0:14 move second child to first child ( temp bool) +0:14 'b1' ( temp bool) +0:14 anyInvocation ( global bool) +0:14 'b1' ( temp bool) +0:15 move second child to first child ( temp bool) +0:15 'b1' ( temp bool) +0:15 allInvocations ( global bool) +0:15 'b1' ( temp bool) +0:16 move second child to first child ( temp bool) +0:16 'b1' ( temp bool) +0:16 allInvocationsEqual ( global bool) +0:16 'b1' ( temp bool) 0:? Linker Objects 0:? 's' ( smooth in structure{ global float f, global 4-component vector of float v}) diff --git a/Test/baseResults/460.vert.out b/Test/baseResults/460.vert.out index 63d75f3a551013bd5ad8de0d9b45dbbcb7e7e9ca..8fa659b307a3b1e37dbdb20bbb0a150608ed8bad 100755 --- a/Test/baseResults/460.vert.out +++ b/Test/baseResults/460.vert.out @@ -3,6 +3,19 @@ Shader version: 460 0:? Sequence 0:7 Function Definition: main( ( global void) 0:7 Function Parameters: +0:? Sequence +0:10 move second child to first child ( temp bool) +0:10 'b1' ( temp bool) +0:10 anyInvocation ( global bool) +0:10 'b1' ( temp bool) +0:11 move second child to first child ( temp bool) +0:11 'b1' ( temp bool) +0:11 allInvocations ( global bool) +0:11 'b1' ( temp bool) +0:12 move second child to first child ( temp bool) +0:12 'b1' ( temp bool) +0:12 allInvocationsEqual ( global bool) +0:12 'b1' ( temp bool) 0:? Linker Objects 0:? 'i' ( global int) 0:? 'f' ( global float) @@ -17,6 +30,19 @@ Shader version: 460 0:? Sequence 0:7 Function Definition: main( ( global void) 0:7 Function Parameters: +0:? Sequence +0:10 move second child to first child ( temp bool) +0:10 'b1' ( temp bool) +0:10 anyInvocation ( global bool) +0:10 'b1' ( temp bool) +0:11 move second child to first child ( temp bool) +0:11 'b1' ( temp bool) +0:11 allInvocations ( global bool) +0:11 'b1' ( temp bool) +0:12 move second child to first child ( temp bool) +0:12 'b1' ( temp bool) +0:12 allInvocationsEqual ( global bool) +0:12 'b1' ( temp bool) 0:? Linker Objects 0:? 'i' ( global int) 0:? 'f' ( global float) diff --git a/Test/baseResults/spv.460.comp.out b/Test/baseResults/spv.460.comp.out new file mode 100755 index 0000000000000000000000000000000000000000..b9037b97c267d9fe9afd9a2cefa92013094aafff --- /dev/null +++ b/Test/baseResults/spv.460.comp.out @@ -0,0 +1,33 @@ +spv.460.comp +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 15 + + Capability Shader + Capability SubgroupVoteKHR + Extension "SPV_KHR_subgroup_vote" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint GLCompute 4 "main" + ExecutionMode 4 LocalSize 1 1 1 + Source GLSL 460 + Name 4 "main" + Name 8 "b1" + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeBool + 7: TypePointer Function 6(bool) + 4(main): 2 Function None 3 + 5: Label + 8(b1): 7(ptr) Variable Function + 9: 6(bool) Load 8(b1) + 10: 6(bool) SubgroupAnyKHR 9 + Store 8(b1) 10 + 11: 6(bool) Load 8(b1) + 12: 6(bool) SubgroupAllKHR 11 + Store 8(b1) 12 + 13: 6(bool) Load 8(b1) + 14: 6(bool) SubgroupAllEqualKHR 13 + Store 8(b1) 14 + Return + FunctionEnd diff --git a/Test/spv.460.comp b/Test/spv.460.comp new file mode 100644 index 0000000000000000000000000000000000000000..eb671a38b3d773b85947e03c3b85ff76fab17961 --- /dev/null +++ b/Test/spv.460.comp @@ -0,0 +1,9 @@ +#version 460 + +void main() +{ + bool b1; + b1 = anyInvocation(b1); + b1 = allInvocations(b1); + b1 = allInvocationsEqual(b1); +} diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp index 885be687f465f4d6eef925a2aac2f4f02062d6a3..1beff771313efbf7347b011f09ddbf925768cca1 100644 --- a/glslang/MachineIndependent/Initialize.cpp +++ b/glslang/MachineIndependent/Initialize.cpp @@ -1576,7 +1576,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } - // GL_ARB_shader_group_vote + // GL_ARB_shader_group_vote if (profile != EEsProfile && version >= 430) { commonBuiltins.append( "bool anyInvocationARB(bool);" @@ -1586,6 +1586,15 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } + if (profile != EEsProfile && version >= 460) { + commonBuiltins.append( + "bool anyInvocation(bool);" + "bool allInvocations(bool);" + "bool allInvocationsEqual(bool);" + + "\n"); + } + #ifdef AMD_EXTENSIONS // GL_AMD_shader_ballot if (profile != EEsProfile && version >= 450) { @@ -5273,9 +5282,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable); - symbolTable.setFunctionExtensions("anyInvocationARB", 1, &E_GL_ARB_shader_group_vote); - symbolTable.setFunctionExtensions("allInvocationsARB", 1, &E_GL_ARB_shader_group_vote); - symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote); + if (version >= 430) { + symbolTable.setFunctionExtensions("anyInvocationARB", 1, &E_GL_ARB_shader_group_vote); + symbolTable.setFunctionExtensions("allInvocationsARB", 1, &E_GL_ARB_shader_group_vote); + symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote); + } } #ifdef AMD_EXTENSIONS @@ -6087,10 +6098,16 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.relateToOperator("readInvocationARB", EOpReadInvocation); symbolTable.relateToOperator("readFirstInvocationARB", EOpReadFirstInvocation); - symbolTable.relateToOperator("anyInvocationARB", EOpAnyInvocation); - symbolTable.relateToOperator("allInvocationsARB", EOpAllInvocations); - symbolTable.relateToOperator("allInvocationsEqualARB", EOpAllInvocationsEqual); - + if (version >= 430) { + symbolTable.relateToOperator("anyInvocationARB", EOpAnyInvocation); + symbolTable.relateToOperator("allInvocationsARB", EOpAllInvocations); + symbolTable.relateToOperator("allInvocationsEqualARB", EOpAllInvocationsEqual); + } + if (version >= 460) { + symbolTable.relateToOperator("anyInvocation", EOpAnyInvocation); + symbolTable.relateToOperator("allInvocations", EOpAllInvocations); + symbolTable.relateToOperator("allInvocationsEqual", EOpAllInvocationsEqual); + } #ifdef AMD_EXTENSIONS symbolTable.relateToOperator("minInvocationsAMD", EOpMinInvocations); symbolTable.relateToOperator("maxInvocationsAMD", EOpMaxInvocations); diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index a0d042c85e38ece02b64d39f75ef324033af11ff..86d5bbab10b904e0c5df891f4a4a44a9ceba1b32 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -362,6 +362,7 @@ INSTANTIATE_TEST_CASE_P( ::testing::ValuesIn(std::vector<std::string>({ "spv.460.frag", "spv.460.vert", + "spv.460.comp", "spv.atomic.comp", "spv.glFragColor.frag", "spv.specConst.vert",