GLSL 4.6: Implement shader group vote.
authorJohn Kessenich <cepheus@frii.com>
Mon, 24 Jul 2017 05:31:44 +0000 (23:31 -0600)
committerJohn Kessenich <cepheus@frii.com>
Mon, 31 Jul 2017 09:00:04 +0000 (03:00 -0600)
Test/450.vert
Test/460.frag
Test/460.vert
Test/baseResults/450.vert.out
Test/baseResults/460.frag.out
Test/baseResults/460.vert.out
Test/baseResults/spv.460.comp.out [new file with mode: 0755]
Test/spv.460.comp [new file with mode: 0644]
glslang/MachineIndependent/Initialize.cpp
gtests/Spv.FromFile.cpp

index 801f1c5..51e9b10 100644 (file)
@@ -39,5 +39,10 @@ void foo()
     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
index 3c32bc6..43a7c3b 100644 (file)
@@ -10,4 +10,8 @@ in S s;
 void main()\r
 {\r
     interpolateAtCentroid(s.v);\r
+    bool b1;\r
+    b1 = anyInvocation(b1);\r
+    b1 = allInvocations(b1);\r
+    b1 = allInvocationsEqual(b1);\r
 }\r
index 17a916b..fd87d8b 100644 (file)
@@ -6,6 +6,10 @@ float f;;;
 \r
 void main()\r
 {\r
+    bool b1;\r
+    b1 = anyInvocation(b1);\r
+    b1 = allInvocations(b1);\r
+    b1 = allInvocationsEqual(b1);\r
 }\r
 ;\r
 ;\r
index b05a9a0..64143de 100644 (file)
@@ -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)
index cf4d5e2..883d949 100755 (executable)
@@ -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})
 
index 63d75f3..8fa659b 100755 (executable)
@@ -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 (executable)
index 0000000..b9037b9
--- /dev/null
@@ -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 (file)
index 0000000..eb671a3
--- /dev/null
@@ -0,0 +1,9 @@
+#version 460\r
+\r
+void main()\r
+{\r
+    bool b1;\r
+    b1 = anyInvocation(b1);\r
+    b1 = allInvocations(b1);\r
+    b1 = allInvocationsEqual(b1);\r
+}\r
index 885be68..1beff77 100644 (file)
@@ -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);
index a0d042c..86d5bba 100644 (file)
@@ -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",