From a4ea1313c3d3e14e979da34345f78870b5957e66 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Fri, 11 Oct 2013 19:46:10 +0000 Subject: [PATCH] Turn on non-uniform blocks (in/out/buffer), and prevent new stages from working with "no profile" (before 150) shaders. git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@23470 e7fa87d3-cd2b-0410-9028-fcbf551c1848 --- Test/300layout.vert | 2 +- Test/baseResults/300layout.vert.out | 7 ++--- Test/baseResults/specExamples.frag.out | 9 ++++--- Test/baseResults/specExamples.vert.out | 21 +++++++-------- Test/specExamples.frag | 4 +-- Test/specExamples.vert | 10 ++++---- glslang/MachineIndependent/ParseHelper.cpp | 30 ++++++++++++++++++---- glslang/MachineIndependent/ParseHelper.h | 1 + glslang/MachineIndependent/ShaderLang.cpp | 15 +++++------ 9 files changed, 60 insertions(+), 39 deletions(-) diff --git a/Test/300layout.vert b/Test/300layout.vert index 361d8266..0d0f8fa9 100644 --- a/Test/300layout.vert +++ b/Test/300layout.vert @@ -36,7 +36,7 @@ out badout { // ERROR float f; }; -layout (location = 10) out vec4 badout; // ERROR +layout (location = 10) out vec4 badoutA; // ERROR void main() { diff --git a/Test/baseResults/300layout.vert.out b/Test/baseResults/300layout.vert.out index ae827335..7f2d0ddf 100644 --- a/Test/baseResults/300layout.vert.out +++ b/Test/baseResults/300layout.vert.out @@ -6,8 +6,8 @@ ERROR: 0:12: 'badm4' : cannot specify packing on a variable declaration ERROR: 0:15: 'badf' : member of uniform block cannot have an auxiliary or interpolation qualifier ERROR: 0:15: 'badg' : member storage qualifier cannot contradict block storage qualifier ERROR: 0:28: 'T3' : nameless block contains a member that already has a name at global scope -ERROR: 0:35: 'badout' : only uniform interface blocks are supported -ERROR: 0:39: 'badout' : can only use location layout qualifier on a vertex input or fragment output +ERROR: 0:35: 'in/out block' : not supported with this profile: es +ERROR: 0:39: 'badoutA' : can only use location layout qualifier on a vertex input or fragment output ERROR: 0:47: 'shared' : not supported with this profile: es ERROR: 0:47: 'shared' : not supported in this stage: vertex ERROR: 12 compilation errors. No code generated. @@ -62,7 +62,8 @@ ERROR: node is still EOpNull! 0:? 'badm4' (layout(column_major shared ) uniform highp 4X4 matrix of float) 0:? 'tblock' (layout(std140 ) uniform block) 0:? '__anon__0' (layout(shared ) uniform block) -0:? 'badout' (layout(location=10 ) smooth out highp 4-component vector of float) +0:? '__anon__2' (out block) +0:? 'badoutA' (layout(location=10 ) smooth out highp 4-component vector of float) 0:? 'compute_only' (shared highp 4-component vector of float) 0:? 'gl_VertexID' (gl_VertexId highp int) 0:? 'gl_InstanceID' (gl_InstanceId highp int) diff --git a/Test/baseResults/specExamples.frag.out b/Test/baseResults/specExamples.frag.out index 1c1fc94a..609a580a 100644 --- a/Test/baseResults/specExamples.frag.out +++ b/Test/baseResults/specExamples.frag.out @@ -4,9 +4,7 @@ ERROR: 0:20: '' : numeric literal too big ERROR: 0:21: '' : hexidecimal literal too big ERROR: 0:37: 'view' : redefinition ERROR: 0:68: 'lightPosition' : redefinition -ERROR: 0:71: 'Material' : only uniform interface blocks are supported -ERROR: 0:79: 'Light' : only uniform interface blocks are supported -ERROR: 0:83: 'ColoredTexture' : only uniform interface blocks are supported +ERROR: 0:71: 'Atten' : member storage qualifier cannot contradict block storage qualifier ERROR: 0:87: 'Color' : redefinition ERROR: 0:92: 'origin_upper_left' : unrecognized layout identifier ERROR: 0:93: 'pixel_center_integer' : unrecognized layout identifier @@ -54,7 +52,7 @@ ERROR: 0:226: 'in' : only allowed at global scope ERROR: 0:227: 'in' : only allowed at global scope ERROR: 0:228: 'in' : only allowed at global scope ERROR: 0:232: 'out' : only allowed at global scope -ERROR: 55 compilation errors. No code generated. +ERROR: 53 compilation errors. No code generated. ERROR: node is still EOpNull! 0:5 Sequence @@ -265,6 +263,9 @@ ERROR: node is still EOpNull! 0:? 0.700000 0:? 0.700000 0:? 0.200000 +0:? '__anon__0' (in block) +0:? '__anon__1' (in block) +0:? 'Materiala' (in block) 0:? 'gl_FragCoord' (gl_FragCoord 4-component vector of float) 0:? 'factor' (layout(location=3 ) out 4-component vector of float) 0:? 'colors' (layout(location=2 ) out 3-element array of 4-component vector of float) diff --git a/Test/baseResults/specExamples.vert.out b/Test/baseResults/specExamples.vert.out index 8141074c..5029175c 100644 --- a/Test/baseResults/specExamples.vert.out +++ b/Test/baseResults/specExamples.vert.out @@ -1,6 +1,4 @@ Warning, version 430 is not yet complete; some version-specific features are present, but many are missing. -ERROR: 0:5: 'Vertex' : only uniform interface blocks are supported -ERROR: 0:10: 'Vertex2' : only uniform interface blocks are supported ERROR: 0:23: 'transforms' : redeclaration of array with size ERROR: 0:29: 's' : location qualifiers only appy to uniform, in, or out storage qualifiers ERROR: 0:31: 'triangles' : unrecognized layout identifier @@ -15,9 +13,7 @@ ERROR: 0:43: 'stream' : there is no such layout identifier taking an assigned va ERROR: 0:45: 'stream' : there is no such layout identifier taking an assigned value ERROR: 0:46: 'stream' : there is no such layout identifier taking an assigned value ERROR: 0:47: 'stream' : there is no such layout identifier taking an assigned value -ERROR: 0:45: 'Block1' : only uniform interface blocks are supported ERROR: 0:50: 'stream' : there is no such layout identifier taking an assigned value -ERROR: 0:52: 'Block2' : only uniform interface blocks are supported ERROR: 0:55: 'stream' : there is no such layout identifier taking an assigned value ERROR: 0:77: 'binding' : not supported ERROR: 0:80: 's17' : redefinition @@ -37,8 +33,8 @@ ERROR: 0:96: 'binding' : not supported ERROR: 0:97: 'binding' : not supported ERROR: 0:106: '' : vertex input cannot be further qualified ERROR: 0:106: 'gl_' : reserved built-in name +ERROR: 0:112: 'ColorIvn' : identifier not previously declared ERROR: 0:119: 'a' : redefinition -ERROR: 0:127: 'Block2' : nameless block contains a member that already has a name at global scope ERROR: 0:132: 'shared' : not supported in this stage: vertex ERROR: 0:134: '' : function does not return a value: funcA ERROR: 0:136: '' : function does not return a value: funcB @@ -55,7 +51,7 @@ ERROR: 0:191: '=' : cannot convert from 'const 4-component vector of float' to ERROR: 0:192: 'constructor' : constructing from a non-dereferenced array ERROR: 0:193: 'constructor' : constructing from a non-dereferenced array ERROR: 0:194: 'constructor' : constructing from a non-dereferenced array -ERROR: 56 compilation errors. No code generated. +ERROR: 52 compilation errors. No code generated. ERROR: node is still EOpNull! 0:134 Function Definition: funcA(I21; (4-component vector of float) @@ -241,15 +237,19 @@ ERROR: node is still EOpNull! 0:193 Construct vec4 (3-element array of 4-component vector of float) 0:194 Construct vec4 (3-element array of 4-component vector of float) 0:? Linker Objects +0:? 'Coords' (out block) +0:? '__anon__0' (out block) 0:? 'transforms' (layout(shared ) uniform 4-element array of block) 0:? 'normal' (layout(location=3 ) in 4-component vector of float) 0:? 'colors' (layout(location=6 ) in 3-element array of 4-component vector of float) 0:? 's' (layout(location=3 ) structure) 0:? 'var1' (smooth out 4-component vector of float) +0:? '__anon__1' (out block) 0:? 'var5' (smooth out 4-component vector of float) +0:? '__anon__2' (out block) 0:? 'var7' (smooth out 4-component vector of float) -0:? '__anon__0' (layout(std140 ) uniform block) -0:? '__anon__1' (layout(shared ) uniform block) +0:? '__anon__3' (layout(std140 ) uniform block) +0:? '__anon__4' (layout(shared ) uniform block) 0:? 's17' (uniform sampler2D) 0:? 'a' (uniform int) 0:? 'bar' (uniform int) @@ -258,7 +258,7 @@ ERROR: node is still EOpNull! 0:? 'c2' (uniform int) 0:? 'd2' (uniform int) 0:? 'gl_FrontColor' (flat in 4-component vector of float) -0:? 'Color' (smooth out 3-component vector of float) +0:? 'ColorInv' (smooth out 3-component vector of float) 0:? 'Color4' (invariant centroid smooth out 3-component vector of float) 0:? 'position' (smooth out 4-component vector of float) 0:? 'Color5' (smooth out 3-component vector of float) @@ -266,7 +266,8 @@ ERROR: node is still EOpNull! 0:? 'c' (in 4-component vector of float) 0:? 'd' (in 4-component vector of float) 0:? 'v' (smooth out 4-component vector of float) -0:? '__anon__2' (layout(shared ) uniform block) +0:? '__anon__5' (layout(shared ) uniform block) +0:? '__anon__6' (layout(shared ) uniform block) 0:? 'shv' (shared 4-component vector of float) 0:? 'img1' (uniform image2D) 0:? 'img2' (coherent uniform image2D) diff --git a/Test/specExamples.frag b/Test/specExamples.frag index 3731ea04..7eec45e9 100644 --- a/Test/specExamples.frag +++ b/Test/specExamples.frag @@ -71,7 +71,7 @@ uniform vec3 color = vec3(0.7, 0.7, 0.2); // value assigned at link time in Material { smooth in vec4 Color1; // legal, input inside in block smooth vec4 Color2; // legal, 'in' inherited from 'in Material' - vec2 TexCoord; // legal, TexCoord is an input + vec2 TexCoordA; // legal, TexCoord is an input uniform float Atten; // illegal, mismatched storage qualifier }; @@ -83,7 +83,7 @@ in Light { in ColoredTexture { vec4 Color; vec2 TexCoord; -} Material; // instance name +} Materiala; // instance name vec3 Color; // different Color than Material.Color in vec4 gl_FragCoord; // redeclaration that changes nothing is allowed diff --git a/Test/specExamples.vert b/Test/specExamples.vert index bf148fa0..86a2d02c 100644 --- a/Test/specExamples.vert +++ b/Test/specExamples.vert @@ -108,8 +108,8 @@ flat out vec4 gl_FrontColor; // output from geometry shader invariant gl_Position; // make existing gl_Position be invariant -out vec3 Color; -invariant Color; // make existing Color be invariant +out vec3 ColorInv; +invariant ColorIvn; // make existing Color be invariant invariant centroid out vec3 Color4; precise out vec4 position; @@ -124,9 +124,9 @@ coherent buffer Block { vec4 member2; }; -buffer Block2 { - coherent readonly vec4 member1; - coherent vec4 member2; +buffer Block2a { + coherent readonly vec4 member1A; + coherent vec4 member2A; }; shared vec4 shv; diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 274aeea6..b0de06a9 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -97,6 +97,10 @@ TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, bool pb, globalUniformDefaults.layoutMatrix = ElmColumnMajor; globalUniformDefaults.layoutPacking = ElpShared; + globalBufferDefaults.clear(); + globalBufferDefaults.layoutMatrix = ElmColumnMajor; + globalBufferDefaults.layoutPacking = ElpShared; + globalInputDefaults.clear(); globalOutputDefaults.clear(); @@ -2356,12 +2360,21 @@ void TParseContext::addBlock(TSourceLoc loc, TTypeList& typeList, const TString* if (profile == EEsProfile && arraySizes) arraySizeRequiredCheck(loc, arraySizes->getSize()); - if (currentBlockDefaults.storage == EvqUniform) { - requireProfile(loc, ~ENoProfile, "uniform block"); + switch (currentBlockDefaults.storage) { + case EvqBuffer: + requireProfile(loc, ECoreProfile | ECompatibilityProfile, "buffer block"); + profileRequires(loc, ECoreProfile | ECompatibilityProfile, 430, 0, "buffer block"); + break; + case EvqUniform: profileRequires(loc, EEsProfile, 300, 0, "uniform block"); - } else { - error(loc, "only uniform interface blocks are supported", blockName->c_str(), ""); - + profileRequires(loc, ENoProfile, 140, 0, "uniform block"); + break; + case EvqIn: + case EvqOut: + requireProfile(loc, ECoreProfile | ECompatibilityProfile, "in/out block"); + break; + default: + error(loc, "only uniform, in, or out interface blocks are supported", blockName->c_str(), ""); return; } @@ -2384,6 +2397,7 @@ void TParseContext::addBlock(TSourceLoc loc, TTypeList& typeList, const TString* TQualifier defaultQualification; switch (currentBlockDefaults.storage) { + case EvqBuffer: defaultQualification = globalBufferDefaults; break; case EvqUniform: defaultQualification = globalUniformDefaults; break; case EvqIn: defaultQualification = globalInputDefaults; break; case EvqOut: defaultQualification = globalOutputDefaults; break; @@ -2471,6 +2485,12 @@ void TParseContext::addQualifierToExisting(TSourceLoc loc, TQualifier qualifier, void TParseContext::updateQualifierDefaults(TQualifier qualifier) { switch (qualifier.storage) { + case EvqBuffer: + if (qualifier.layoutMatrix != ElmNone) + globalBufferDefaults.layoutMatrix = qualifier.layoutMatrix; + if (qualifier.layoutPacking != ElpNone) + globalBufferDefaults.layoutPacking = qualifier.layoutPacking; + break; case EvqUniform: if (qualifier.layoutMatrix != ElmNone) globalUniformDefaults.layoutMatrix = qualifier.layoutMatrix; diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h index 37dac2aa..57b99b8d 100644 --- a/glslang/MachineIndependent/ParseHelper.h +++ b/glslang/MachineIndependent/ParseHelper.h @@ -208,6 +208,7 @@ protected: static const int maxSamplerIndex = EsdNumDims * (EbtNumTypes * (2 * 2)); // see computeSamplerTypeIndex() TPrecisionQualifier defaultSamplerPrecision[maxSamplerIndex]; bool afterEOF; + TQualifier globalBufferDefaults; TQualifier globalUniformDefaults; TQualifier globalInputDefaults; TQualifier globalOutputDefaults; diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp index 1421cefa..eae5a80f 100644 --- a/glslang/MachineIndependent/ShaderLang.cpp +++ b/glslang/MachineIndependent/ShaderLang.cpp @@ -340,31 +340,28 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo // Correct for stage type... switch (stage) { case EShLangGeometry: - if (version < 150 || profile == EEsProfile) { + if (version < 150 || (profile != ECoreProfile && profile != ECompatibilityProfile)) { correct = false; infoSink.info.message(EPrefixError, "#version: geometry shaders require non-es profile and version 150 or above"); version = 150; - if (profile == EEsProfile) - profile = ECoreProfile; + profile = ECoreProfile; } break; case EShLangTessControl: case EShLangTessEvaluation: - if (version < 400 || profile == EEsProfile) { + if (version < 400 || (profile != ECoreProfile && profile != ECompatibilityProfile)) { correct = false; infoSink.info.message(EPrefixError, "#version: tessellation shaders require non-es profile and version 400 or above"); version = 400; - if (profile == EEsProfile) - profile = ECoreProfile; + profile = ECoreProfile; } break; case EShLangCompute: - if (version < 430 || profile == EEsProfile) { + if (version < 430 || (profile != ECoreProfile && profile != ECompatibilityProfile)) { correct = false; infoSink.info.message(EPrefixError, "#version: compute shaders require non-es profile and version 430 or above"); version = 430; - if (profile == EEsProfile) - profile = ECoreProfile; + profile = ECoreProfile; } break; default: