From d94c003fb7d2be208d0a80e1f2707f0553c8ed41 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Mon, 30 May 2016 19:29:40 -0600 Subject: [PATCH] Front-end: Complete GL_ARB_compute_shader implementation. Core compute shaders were working, but the extension wasn't implemented. --- SPIRV/GlslangToSpv.cpp | 2 +- Test/420.comp | 17 +++- Test/baseResults/420.comp.out | 94 +++++++++++++++++++--- glslang/MachineIndependent/Initialize.cpp | 10 ++- glslang/MachineIndependent/ParseHelper.cpp | 4 +- glslang/MachineIndependent/Versions.cpp | 2 +- glslang/MachineIndependent/glslang.y | 2 +- glslang/MachineIndependent/glslang_tab.cpp | 2 +- 8 files changed, 116 insertions(+), 17 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index d6ae9415..5609769b 100755 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -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 dimConstId; diff --git a/Test/420.comp b/Test/420.comp index 4e6885be..e8cee3c7 100755 --- a/Test/420.comp +++ b/Test/420.comp @@ -4,4 +4,19 @@ layout(local_size_x = 2) in; // ERROR, no compute #extension GL_ARB_compute_shader : enable -layout(local_size_x = 2) in; +layout(local_size_x = 2, local_size_y = 4, local_size_z = 6) in; + +shared vec3 sfoo; + +void main() +{ + sfoo = vec3(gl_WorkGroupSize.x, gl_WorkGroupSize.y, gl_WorkGroupSize.z); + sfoo += gl_WorkGroupSize + gl_NumWorkGroups + gl_WorkGroupID + gl_LocalInvocationID + gl_GlobalInvocationID; + sfoo *= gl_LocalInvocationIndex; + sfoo += gl_MaxComputeWorkGroupCount + gl_MaxComputeWorkGroupSize; + sfoo *= gl_MaxComputeUniformComponents + + gl_MaxComputeTextureImageUnits + + gl_MaxComputeImageUniforms + + gl_MaxComputeAtomicCounters + + gl_MaxComputeAtomicCounterBuffers; +} \ No newline at end of file diff --git a/Test/baseResults/420.comp.out b/Test/baseResults/420.comp.out index c21df076..719054df 100755 --- a/Test/baseResults/420.comp.out +++ b/Test/baseResults/420.comp.out @@ -1,32 +1,108 @@ 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) diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp index c4ffdf20..35d7be13 100644 --- a/glslang/MachineIndependent/Initialize.cpp +++ b/glslang/MachineIndependent/Initialize.cpp @@ -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; diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 39344cf5..31a94d26 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -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; diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp index eeff270a..c1192071 100644 --- a/glslang/MachineIndependent/Versions.cpp +++ b/glslang/MachineIndependent/Versions.cpp @@ -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; diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y index f4c7857c..4f8e3fc1 100644 --- a/glslang/MachineIndependent/glslang.y +++ b/glslang/MachineIndependent/glslang.y @@ -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); diff --git a/glslang/MachineIndependent/glslang_tab.cpp b/glslang/MachineIndependent/glslang_tab.cpp index 9d632d8a..a284fda4 100644 --- a/glslang/MachineIndependent/glslang_tab.cpp +++ b/glslang/MachineIndependent/glslang_tab.cpp @@ -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);