Front-end: Complete GL_ARB_compute_shader implementation.
authorJohn Kessenich <cepheus@frii.com>
Tue, 31 May 2016 01:29:40 +0000 (19:29 -0600)
committerJohn Kessenich <cepheus@frii.com>
Tue, 31 May 2016 01:29:40 +0000 (19:29 -0600)
Core compute shaders were working, but the extension wasn't implemented.

SPIRV/GlslangToSpv.cpp
Test/420.comp
Test/baseResults/420.comp.out
glslang/MachineIndependent/Initialize.cpp
glslang/MachineIndependent/ParseHelper.cpp
glslang/MachineIndependent/Versions.cpp
glslang/MachineIndependent/glslang.y
glslang/MachineIndependent/glslang_tab.cpp

index d6ae941..5609769 100755 (executable)
@@ -4042,7 +4042,7 @@ spv::Id TGlslangToSpvTraverser::createSpvConstant(const glslang::TIntermTyped& n
 
     // We now know we have a specialization constant to build
 
-    // gl_WorkgroupSize is a special case until the front-end handles hierarchical specialization constants,
+    // gl_WorkGroupSize is a special case until the front-end handles hierarchical specialization constants,
     // even then, it's specialization ids are handled by special case syntax in GLSL: layout(local_size_x = ...
     if (node.getType().getQualifier().builtIn == glslang::EbvWorkGroupSize) {
         std::vector<spv::Id> dimConstId;
index 4e6885b..e8cee3c 100755 (executable)
@@ -4,4 +4,19 @@ layout(local_size_x = 2) in;  // ERROR, no compute
 \r
 #extension GL_ARB_compute_shader : enable\r
 \r
-layout(local_size_x = 2) in;\r
+layout(local_size_x = 2, local_size_y = 4, local_size_z = 6) in;\r
+\r
+shared vec3 sfoo;\r
+\r
+void main()\r
+{\r
+    sfoo = vec3(gl_WorkGroupSize.x, gl_WorkGroupSize.y, gl_WorkGroupSize.z);\r
+    sfoo += gl_WorkGroupSize + gl_NumWorkGroups + gl_WorkGroupID + gl_LocalInvocationID + gl_GlobalInvocationID;\r
+    sfoo *= gl_LocalInvocationIndex;\r
+    sfoo += gl_MaxComputeWorkGroupCount + gl_MaxComputeWorkGroupSize;\r
+    sfoo *= gl_MaxComputeUniformComponents +\r
+            gl_MaxComputeTextureImageUnits +\r
+            gl_MaxComputeImageUniforms +\r
+            gl_MaxComputeAtomicCounters +\r
+            gl_MaxComputeAtomicCounterBuffers;\r
+}
\ No newline at end of file
index c21df07..719054d 100755 (executable)
 420.comp
 Warning, version 420 is not yet complete; most version-specific features are present, but some are missing.
-ERROR: 0:3: 'gl_WorkgroupSize' : not supported for this version or the enabled extensions 
-WARNING: 0:5: '#extension' : extension is only partially supported: GL_ARB_compute_shader
+ERROR: 0:3: 'gl_WorkGroupSize' : not supported for this version or the enabled extensions 
 ERROR: 1 compilation errors.  No code generated.
 
 
 Shader version: 420
 Requested GL_ARB_compute_shader
-local_size = (2, 1, 1)
+local_size = (2, 4, 6)
 ERROR: node is still EOpNull!
+0:11  Function Definition: main( (global void)
+0:11    Function Parameters: 
+0:13    Sequence
+0:13      move second child to first child (temp 3-component vector of float)
+0:13        'sfoo' (shared 3-component vector of float)
+0:13        Constant:
+0:13          2.000000
+0:13          4.000000
+0:13          6.000000
+0:14      add second child into first child (temp 3-component vector of float)
+0:14        'sfoo' (shared 3-component vector of float)
+0:14        Convert uint to float (temp 3-component vector of float)
+0:14          add (temp 3-component vector of uint)
+0:14            add (temp 3-component vector of uint)
+0:14              add (temp 3-component vector of uint)
+0:14                add (temp 3-component vector of uint)
+0:14                  Constant:
+0:14                    2 (const uint)
+0:14                    4 (const uint)
+0:14                    6 (const uint)
+0:14                  'gl_NumWorkGroups' (in 3-component vector of uint NumWorkGroups)
+0:14                'gl_WorkGroupID' (in 3-component vector of uint WorkGroupID)
+0:14              'gl_LocalInvocationID' (in 3-component vector of uint LocalInvocationID)
+0:14            'gl_GlobalInvocationID' (in 3-component vector of uint GlobalInvocationID)
+0:15      vector scale second child into first child (temp 3-component vector of float)
+0:15        'sfoo' (shared 3-component vector of float)
+0:15        Convert uint to float (temp float)
+0:15          'gl_LocalInvocationIndex' (in uint LocalInvocationIndex)
+0:16      add second child into first child (temp 3-component vector of float)
+0:16        'sfoo' (shared 3-component vector of float)
+0:16        Constant:
+0:16          66559.000000
+0:16          66559.000000
+0:16          65599.000000
+0:17      vector scale second child into first child (temp 3-component vector of float)
+0:17        'sfoo' (shared 3-component vector of float)
+0:17        Constant:
+0:17          1057.000000
 0:?   Linker Objects
 0:?     'gl_WorkGroupSize' (const 3-component vector of uint WorkGroupSize)
 0:?       2 (const uint)
-0:?       1 (const uint)
-0:?       1 (const uint)
+0:?       4 (const uint)
+0:?       6 (const uint)
+0:?     'sfoo' (shared 3-component vector of float)
 
 
 Linked compute stage:
 
-ERROR: Linking compute stage: Missing entry point: Each stage requires one "void main()" entry point
 
 Shader version: 420
 Requested GL_ARB_compute_shader
-local_size = (2, 1, 1)
+local_size = (2, 4, 6)
 ERROR: node is still EOpNull!
+0:11  Function Definition: main( (global void)
+0:11    Function Parameters: 
+0:13    Sequence
+0:13      move second child to first child (temp 3-component vector of float)
+0:13        'sfoo' (shared 3-component vector of float)
+0:13        Constant:
+0:13          2.000000
+0:13          4.000000
+0:13          6.000000
+0:14      add second child into first child (temp 3-component vector of float)
+0:14        'sfoo' (shared 3-component vector of float)
+0:14        Convert uint to float (temp 3-component vector of float)
+0:14          add (temp 3-component vector of uint)
+0:14            add (temp 3-component vector of uint)
+0:14              add (temp 3-component vector of uint)
+0:14                add (temp 3-component vector of uint)
+0:14                  Constant:
+0:14                    2 (const uint)
+0:14                    4 (const uint)
+0:14                    6 (const uint)
+0:14                  'gl_NumWorkGroups' (in 3-component vector of uint NumWorkGroups)
+0:14                'gl_WorkGroupID' (in 3-component vector of uint WorkGroupID)
+0:14              'gl_LocalInvocationID' (in 3-component vector of uint LocalInvocationID)
+0:14            'gl_GlobalInvocationID' (in 3-component vector of uint GlobalInvocationID)
+0:15      vector scale second child into first child (temp 3-component vector of float)
+0:15        'sfoo' (shared 3-component vector of float)
+0:15        Convert uint to float (temp float)
+0:15          'gl_LocalInvocationIndex' (in uint LocalInvocationIndex)
+0:16      add second child into first child (temp 3-component vector of float)
+0:16        'sfoo' (shared 3-component vector of float)
+0:16        Constant:
+0:16          66559.000000
+0:16          66559.000000
+0:16          65599.000000
+0:17      vector scale second child into first child (temp 3-component vector of float)
+0:17        'sfoo' (shared 3-component vector of float)
+0:17        Constant:
+0:17          1057.000000
 0:?   Linker Objects
 0:?     'gl_WorkGroupSize' (const 3-component vector of uint WorkGroupSize)
 0:?       2 (const uint)
-0:?       1 (const uint)
-0:?       1 (const uint)
+0:?       4 (const uint)
+0:?       6 (const uint)
+0:?     'sfoo' (shared 3-component vector of float)
 
index c4ffdf2..35d7be1 100644 (file)
@@ -3421,7 +3421,7 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf
 
 
     // compute
-    if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 430)) {
+    if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 420)) {
         snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxComputeWorkGroupCount = ivec3(%d,%d,%d);", resources.maxComputeWorkGroupCountX,
                                                                                                          resources.maxComputeWorkGroupCountY,
                                                                                                          resources.maxComputeWorkGroupCountZ);                
@@ -3904,6 +3904,14 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, int spv, int vul
             symbolTable.setVariableExtensions("gl_LocalInvocationID",    1, &E_GL_ARB_compute_shader);
             symbolTable.setVariableExtensions("gl_GlobalInvocationID",   1, &E_GL_ARB_compute_shader);
             symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_ARB_compute_shader);
+
+            symbolTable.setVariableExtensions("gl_MaxComputeWorkGroupCount",       1, &E_GL_ARB_compute_shader);
+            symbolTable.setVariableExtensions("gl_MaxComputeWorkGroupSize",        1, &E_GL_ARB_compute_shader);
+            symbolTable.setVariableExtensions("gl_MaxComputeUniformComponents",    1, &E_GL_ARB_compute_shader);
+            symbolTable.setVariableExtensions("gl_MaxComputeTextureImageUnits",    1, &E_GL_ARB_compute_shader);
+            symbolTable.setVariableExtensions("gl_MaxComputeImageUniforms",        1, &E_GL_ARB_compute_shader);
+            symbolTable.setVariableExtensions("gl_MaxComputeAtomicCounters",       1, &E_GL_ARB_compute_shader);
+            symbolTable.setVariableExtensions("gl_MaxComputeAtomicCounterBuffers", 1, &E_GL_ARB_compute_shader);
         }
         break;
 
index 39344cf..31a94d2 100644 (file)
@@ -4232,8 +4232,8 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
 
     case EShLangCompute:
         if (id.compare(0, 11, "local_size_") == 0) {
-            profileRequires(loc, EEsProfile, 310, 0, "gl_WorkgroupSize");
-            profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_compute_shader, "gl_WorkgroupSize");
+            profileRequires(loc, EEsProfile, 310, 0, "gl_WorkGroupSize");
+            profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_compute_shader, "gl_WorkGroupSize");
             if (id == "local_size_x") {
                 publicType.shaderQualifiers.localSize[0] = value;
                 return;
index eeff270..c119207 100644 (file)
@@ -162,7 +162,7 @@ void TParseVersions::initializeExtensionBehavior()
     extensionBehavior[E_GL_ARB_texture_gather]               = EBhDisable;
     extensionBehavior[E_GL_ARB_gpu_shader5]                  = EBhDisablePartial;
     extensionBehavior[E_GL_ARB_separate_shader_objects]      = EBhDisable;
-    extensionBehavior[E_GL_ARB_compute_shader]               = EBhDisablePartial;
+    extensionBehavior[E_GL_ARB_compute_shader]               = EBhDisable;
     extensionBehavior[E_GL_ARB_tessellation_shader]          = EBhDisable;
     extensionBehavior[E_GL_ARB_enhanced_layouts]             = EBhDisable;
     extensionBehavior[E_GL_ARB_texture_cube_map_array]       = EBhDisable;
index f4c7857..4f8e3fc 100644 (file)
@@ -1208,7 +1208,7 @@ storage_qualifier
         $$.qualifier.storage = EvqBuffer;
     }
     | SHARED {
-        parseContext.profileRequires($1.loc, ECoreProfile | ECompatibilityProfile, 430, 0, "shared");
+        parseContext.profileRequires($1.loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
         parseContext.profileRequires($1.loc, EEsProfile, 310, 0, "shared");
         parseContext.requireStage($1.loc, EShLangCompute, "shared");
         $$.init($1.loc);
index 9d632d8..a284fda 100644 (file)
@@ -4737,7 +4737,7 @@ yyreduce:
   case 155:
 #line 1210 "MachineIndependent/glslang.y" /* yacc.c:1646  */
     {
-        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, 0, "shared");
+        parseContext.profileRequires((yyvsp[0].lex).loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
         parseContext.profileRequires((yyvsp[0].lex).loc, EEsProfile, 310, 0, "shared");
         parseContext.requireStage((yyvsp[0].lex).loc, EShLangCompute, "shared");
         (yyval.interm.type).init((yyvsp[0].lex).loc);