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

index 17d1abbbbd9b2f559c27bfd4ae25e478114fa132..801f1c5041b7530901b984190e6b69490678211c 100644 (file)
@@ -37,5 +37,7 @@ void foo()
     atomicCounterXor(aui, ui);           // ERROR, need 4.6\r
     atomicCounterExchange(aui, ui);      // ERROR, need 4.6\r
     atomicCounterCompSwap(aui, ui, ui);  // ERROR, need 4.6\r
+\r
+    int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID; // ERROR, need 4.6\r
 }\r
 ; // ERROR: no extraneous semicolons\r
index 1005642d0bc04d41a70d11fec123a2dc6f593d13..b05a9a0dd4e2c1a3ff2894169cb5a4935a814631 100644 (file)
@@ -11,8 +11,12 @@ ERROR: 0:36: 'atomicCounterOr' : no matching overloaded function found
 ERROR: 0:37: 'atomicCounterXor' : no matching overloaded function found 
 ERROR: 0:38: 'atomicCounterExchange' : no matching overloaded function found 
 ERROR: 0:39: 'atomicCounterCompSwap' : no matching overloaded function found 
-ERROR: 0:41: 'extraneous semicolon' : not supported for this version or the enabled extensions 
-ERROR: 13 compilation errors.  No code generated.
+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.
 
 
 Shader version: 450
diff --git a/Test/baseResults/spv.460.vert.out b/Test/baseResults/spv.460.vert.out
new file mode 100755 (executable)
index 0000000..6d57d07
--- /dev/null
@@ -0,0 +1,45 @@
+spv.460.vert
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 20
+
+                              Capability Shader
+                              Capability DrawParameters
+                              Extension  "SPV_KHR_shader_draw_parameters"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 12 15 18 19
+                              Source GLSL 460
+                              Name 4  "main"
+                              Name 8  "a"
+                              Name 10  "gl_BaseVertex"
+                              Name 12  "gl_BaseInstance"
+                              Name 15  "gl_DrawID"
+                              Name 18  "gl_VertexID"
+                              Name 19  "gl_InstanceID"
+                              Decorate 10(gl_BaseVertex) BuiltIn BaseVertex
+                              Decorate 12(gl_BaseInstance) BuiltIn BaseInstance
+                              Decorate 15(gl_DrawID) BuiltIn DrawIndex
+                              Decorate 18(gl_VertexID) BuiltIn VertexId
+                              Decorate 19(gl_InstanceID) BuiltIn InstanceId
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_BaseVertex):      9(ptr) Variable Input
+12(gl_BaseInstance):      9(ptr) Variable Input
+   15(gl_DrawID):      9(ptr) Variable Input
+ 18(gl_VertexID):      9(ptr) Variable Input
+19(gl_InstanceID):      9(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+            8(a):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_BaseVertex)
+              13:      6(int) Load 12(gl_BaseInstance)
+              14:      6(int) IAdd 11 13
+              16:      6(int) Load 15(gl_DrawID)
+              17:      6(int) IAdd 14 16
+                              Store 8(a) 17
+                              Return
+                              FunctionEnd
diff --git a/Test/spv.460.vert b/Test/spv.460.vert
new file mode 100644 (file)
index 0000000..72d4e77
--- /dev/null
@@ -0,0 +1,6 @@
+#version 460\r
+\r
+void main()\r
+{\r
+    int a = gl_BaseVertex + gl_BaseInstance + gl_DrawID;\r
+}\r
index 921d83a9f2d32445d81625816dddd7023174e60c..885be687f465f4d6eef925a2aac2f4f02062d6a3 100644 (file)
@@ -3416,6 +3416,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
                 "in int gl_DrawIDARB;"
                 );
         }
+        if (version >= 460) {
+            stageBuiltins[EShLangVertex].append(
+                "in int gl_BaseVertex;"
+                "in int gl_BaseInstance;"
+                "in int gl_DrawID;"
+                );
+        }
 
 #ifdef NV_EXTENSIONS
         if (version >= 450)
@@ -5230,16 +5237,19 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
     switch(language) {
     case EShLangVertex:
         if (profile != EEsProfile) {
-            symbolTable.setVariableExtensions("gl_BaseVertexARB",   1, &E_GL_ARB_shader_draw_parameters);
-            symbolTable.setVariableExtensions("gl_BaseInstanceARB", 1, &E_GL_ARB_shader_draw_parameters);
-            symbolTable.setVariableExtensions("gl_DrawIDARB",       1, &E_GL_ARB_shader_draw_parameters);
-
-            BuiltInVariable("gl_BaseVertexARB",   EbvBaseVertex,   symbolTable);
-            BuiltInVariable("gl_BaseInstanceARB", EbvBaseInstance, symbolTable);
-            BuiltInVariable("gl_DrawIDARB",       EbvDrawId,       symbolTable);
-        }
-
-        if (profile != EEsProfile) {
+            if (version >= 440) {
+                symbolTable.setVariableExtensions("gl_BaseVertexARB",   1, &E_GL_ARB_shader_draw_parameters);
+                symbolTable.setVariableExtensions("gl_BaseInstanceARB", 1, &E_GL_ARB_shader_draw_parameters);
+                symbolTable.setVariableExtensions("gl_DrawIDARB",       1, &E_GL_ARB_shader_draw_parameters);
+                BuiltInVariable("gl_BaseVertexARB",   EbvBaseVertex,   symbolTable);
+                BuiltInVariable("gl_BaseInstanceARB", EbvBaseInstance, symbolTable);
+                BuiltInVariable("gl_DrawIDARB",       EbvDrawId,       symbolTable);
+            }
+            if (version >= 460) {
+                BuiltInVariable("gl_BaseVertex",   EbvBaseVertex,   symbolTable);
+                BuiltInVariable("gl_BaseInstance", EbvBaseInstance, symbolTable);
+                BuiltInVariable("gl_DrawID",       EbvDrawId,       symbolTable);
+            }
             symbolTable.setVariableExtensions("gl_SubGroupSizeARB",       1, &E_GL_ARB_shader_ballot);
             symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
             symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB",     1, &E_GL_ARB_shader_ballot);
index 3a236b7f3170de05c70bc2729e047bd13ab13572..a0d042c85e38ece02b64d39f75ef324033af11ff 100644 (file)
@@ -361,6 +361,7 @@ INSTANTIATE_TEST_CASE_P(
     Glsl, CompileOpenGLToSpirvTest,
     ::testing::ValuesIn(std::vector<std::string>({
         "spv.460.frag",
+        "spv.460.vert",
         "spv.atomic.comp",
         "spv.glFragColor.frag",
         "spv.specConst.vert",