atomicCounterCompSwap(aui, ui, ui); // ERROR, need 4.6\r
\r
int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; // ERROR, need 4.6\r
+\r
+ bool b1;\r
+ anyInvocation(b1); // ERROR, need 4.6\r
+ allInvocations(b1); // ERROR, need 4.6\r
+ allInvocationsEqual(b1); // ERROR, need 4.6\r
}\r
; // ERROR: no extraneous semicolons\r
void main()\r
{\r
interpolateAtCentroid(s.v);\r
+ bool b1;\r
+ b1 = anyInvocation(b1);\r
+ b1 = allInvocations(b1);\r
+ b1 = allInvocationsEqual(b1);\r
}\r
\r
void main()\r
{\r
+ bool b1;\r
+ b1 = anyInvocation(b1);\r
+ b1 = allInvocations(b1);\r
+ b1 = allInvocationsEqual(b1);\r
}\r
;\r
;\r
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
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)
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})
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})
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)
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)
--- /dev/null
+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
--- /dev/null
+#version 460\r
+\r
+void main()\r
+{\r
+ bool b1;\r
+ b1 = anyInvocation(b1);\r
+ b1 = allInvocations(b1);\r
+ b1 = allInvocationsEqual(b1);\r
+}\r
"\n");
}
- // GL_ARB_shader_group_vote
+ // GL_ARB_shader_group_vote
if (profile != EEsProfile && version >= 430) {
commonBuiltins.append(
"bool anyInvocationARB(bool);"
"\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) {
// 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
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);
::testing::ValuesIn(std::vector<std::string>({
"spv.460.frag",
"spv.460.vert",
+ "spv.460.comp",
"spv.atomic.comp",
"spv.glFragColor.frag",
"spv.specConst.vert",