diff --git a/Test/450.vert b/Test/450.vert index 801f1c504..51e9b1004 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 3c32bc6f9..43a7c3b38 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 17a916b4f..fd87d8b11 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 b05a9a0dd..64143de56 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 cf4d5e2c7..883d949b2 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 63d75f3a5..8fa659b30 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 000000000..b9037b97c --- /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 000000000..eb671a38b --- /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 885be687f..1beff7713 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 a0d042c85..86d5bbab1 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -362,6 +362,7 @@ INSTANTIATE_TEST_CASE_P( ::testing::ValuesIn(std::vector({ "spv.460.frag", "spv.460.vert", + "spv.460.comp", "spv.atomic.comp", "spv.glFragColor.frag", "spv.specConst.vert",