GL_ARB_enhanced_layouts, part 1: Track whether constants are literals, to enable...
authorJohn Kessenich <cepheus@frii.com>
Tue, 7 Jan 2014 18:14:48 +0000 (18:14 +0000)
committerJohn Kessenich <cepheus@frii.com>
Tue, 7 Jan 2014 18:14:48 +0000 (18:14 +0000)
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24675 e7fa87d3-cd2b-0410-9028-fcbf551c1848

12 files changed:
Test/330.frag
Test/baseResults/330.frag.out
glslang/Include/intermediate.h
glslang/Include/revision.h
glslang/MachineIndependent/Constant.cpp
glslang/MachineIndependent/Intermediate.cpp
glslang/MachineIndependent/ParseHelper.cpp
glslang/MachineIndependent/ParseHelper.h
glslang/MachineIndependent/Versions.cpp
glslang/MachineIndependent/Versions.h
glslang/MachineIndependent/glslang.y
glslang/MachineIndependent/localintermediate.h

index 22143f8..b90ae54 100644 (file)
@@ -39,3 +39,15 @@ in gl_PerVertex {  // ERROR
 in gl_PerVertex {  // ERROR
     vec4 gl_FragCoord;
 };  // ERROR
+
+const int start = 6;
+layout(location = -2) in vec4 v1;         // ERROR
+layout(location = start + 2) in vec4 v2;  // ERROR
+layout(location = 4.7e10) in vec4 v20;    // ERROR
+
+#extension GL_ARB_enhanced_layouts : enable
+
+layout(location = start) in vec4 v3;
+layout(location = -2) in vec4 v4;         // ERROR
+layout(location = -start) in vec4 v5;     // ERROR
+layout(location = start*start - 2) in vec4 v6;
index cb28b8e..0ada059 100644 (file)
@@ -5,7 +5,14 @@ ERROR: 0:31: 'gl_' : reserved built-in name: gl_name
 ERROR: 0:32: 'gl_' : reserved built-in name: gl_i\r
 ERROR: 0:35: 'gl_in' : no declaration found for redeclaration \r
 ERROR: 0:39: 'gl_FragCoord' : cannot redeclare a non block as a block \r
-ERROR: 5 compilation errors.  No code generated.\r
+ERROR: 0:44: 'non-literal layout-id value' : not supported for this version or the enabled extensions \r
+ERROR: 0:44: 'layout-id value' : cannot be negative \r
+ERROR: 0:45: 'non-literal layout-id value' : not supported for this version or the enabled extensions \r
+ERROR: 0:46: 'layout-id value' : scalar integer expression required \r
+ERROR: 0:46: 'location' : location is too large \r
+ERROR: 0:51: 'layout-id value' : cannot be negative \r
+ERROR: 0:52: 'layout-id value' : cannot be negative \r
+ERROR: 12 compilation errors.  No code generated.\r
 \r
 \r
 ERROR: node is still EOpNull!\r
@@ -45,6 +52,15 @@ ERROR: node is still EOpNull!
 0:?     'varyingVar' (smooth in 4-component vector of float)\r
 0:?     '__anon__0' (in block{in 4-component vector of float gl_Color, })\r
 0:?     'gl_name' (in block{in int gl_i})\r
+0:?     'start' (const int)\r
+0:?       6 (const int)\r
+0:?     'v1' (smooth in 4-component vector of float)\r
+0:?     'v2' (layout(location=8 ) smooth in 4-component vector of float)\r
+0:?     'v20' (smooth in 4-component vector of float)\r
+0:?     'v3' (layout(location=6 ) smooth in 4-component vector of float)\r
+0:?     'v4' (smooth in 4-component vector of float)\r
+0:?     'v5' (smooth in 4-component vector of float)\r
+0:?     'v6' (layout(location=34 ) smooth in 4-component vector of float)\r
 \r
 \r
 Linked fragment stage:\r
index 6b0570a..b73083a 100644 (file)
@@ -494,15 +494,18 @@ protected:
 
 class TIntermConstantUnion : public TIntermTyped {
 public:
-    TIntermConstantUnion(const TConstUnionArray& ua, const TType& t) : TIntermTyped(t), unionArray(ua) { }
+    TIntermConstantUnion(const TConstUnionArray& ua, const TType& t) : TIntermTyped(t), unionArray(ua), literal(false) { }
     const TConstUnionArray& getConstArray() const { return unionArray; }
     virtual       TIntermConstantUnion* getAsConstantUnion()       { return this; }
     virtual const TIntermConstantUnion* getAsConstantUnion() const { return this; }
     virtual void traverse(TIntermTraverser*);
     virtual TIntermTyped* fold(TOperator, const TIntermTyped*) const;
     virtual TIntermTyped* fold(TOperator, const TType&) const;
+    void setLiteral() { literal = true; }
+    bool isLiteral() const { return literal; }
 protected:
     const TConstUnionArray unionArray;
+    bool literal;  // true if node represents a literal in the source code
 };
 
 //
index a24f55d..90a7e27 100644 (file)
@@ -9,5 +9,5 @@
 // source have to figure out how to create revision.h just to get a build\r
 // going.  However, if it is not updated, it can be a version behind.\r
 \r
-#define GLSLANG_REVISION "24664"\r
-#define GLSLANG_DATE     "2014/01/06 14:27:56"\r
+#define GLSLANG_REVISION "24674"\r
+#define GLSLANG_DATE     "2014/01/07 10:44:41"\r
index 7e045b6..801cf1d 100644 (file)
@@ -85,7 +85,7 @@ namespace glslang {
 //
 // Returns a new node representing the result.
 //
-TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* constantNode) const 
+TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* constantNode) const
 {
     // For most cases, the return type matches the argument type, so set that
     // up and just code to exceptions below.
index eaa070e..952d103 100644 (file)
@@ -782,10 +782,12 @@ TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermTyped* true
 // Returns the constant union node created.
 //
 
-TIntermConstantUnion* TIntermediate::addConstantUnion(const TConstUnionArray& unionArray, const TType& t, TSourceLoc loc)
+TIntermConstantUnion* TIntermediate::addConstantUnion(const TConstUnionArray& unionArray, const TType& t, TSourceLoc loc, bool literal)
 {
     TIntermConstantUnion* node = new TIntermConstantUnion(unionArray, t);
     node->setLoc(loc);
+    if (literal)
+        node->setLiteral();
 
     return node;
 }
index 00b8b88..12cfb59 100644 (file)
@@ -2808,12 +2808,24 @@ void TParseContext::setLayoutQualifier(TSourceLoc loc, TPublicType& publicType,
 
 // Put the id's layout qualifier value into the public type.  This is before we know any
 // type information for error checking.
-void TParseContext::setLayoutQualifier(TSourceLoc loc, TPublicType& publicType, TString& id, int value)
+void TParseContext::setLayoutQualifier(TSourceLoc loc, TPublicType& publicType, TString& id, const TIntermTyped* node)
 {
+    const char* feature = "layout-id value";
+    const char* nonLiteralFeature = "non-literal layout-id value";
+
+    integerCheck(node, feature);
+    const TIntermConstantUnion* constUnion = node->getAsConstantUnion();
+    assert(constUnion);
+    int value = node->getAsConstantUnion()->getConstArray()[0].getIConst();
+
+    if (! constUnion->isLiteral()) {
+        requireProfile(loc, ECoreProfile | ECompatibilityProfile, nonLiteralFeature);
+        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, GL_ARB_enhanced_layouts, nonLiteralFeature);
+    }
+
     if (value < 0) {
-        error(loc, "cannot be negative", "layout qualifier value", "");
+        error(loc, "cannot be negative", feature, "");
         return;
-        // TODO: 4.4: test the above, once expressions are allowed; until then, can't even express a negative location
     }
 
     std::transform(id.begin(), id.end(), id.begin(), ::tolower);
index b8c7906..a2dcc60 100644 (file)
@@ -148,7 +148,7 @@ public:
     void constantIndexExpressionCheck(TIntermNode*);
 
     void setLayoutQualifier(TSourceLoc, TPublicType&, TString&);
-    void setLayoutQualifier(TSourceLoc, TPublicType&, TString&, int);
+    void setLayoutQualifier(TSourceLoc, TPublicType&, TString&, const TIntermTyped*);
     void mergeObjectLayoutQualifiers(TSourceLoc, TQualifier& dest, const TQualifier& src, bool inheritOnly);
     void layoutTypeCheck(TSourceLoc, const TSymbol&);
     void layoutQualifierCheck(TSourceLoc, const TQualifier&);
index 6fc97f7..5fe2de3 100644 (file)
@@ -162,6 +162,7 @@ void TParseContext::initializeExtensionBehavior()
     extensionBehavior[GL_ARB_gpu_shader5]              = EBhDisablePartial;
     extensionBehavior[GL_ARB_separate_shader_objects]  = EBhDisable;
     extensionBehavior[GL_ARB_tessellation_shader]      = EBhDisable;
+    extensionBehavior[GL_ARB_enhanced_layouts]         = EBhDisable;
 }
 
 // Get code that is not part of a shared symbol table, is specific to this shader,
@@ -184,7 +185,8 @@ const char* TParseContext::getPreamble()
             "#define GL_ARB_texture_gather 1\n"
             "#define GL_ARB_gpu_shader5 1\n"
             "#define GL_ARB_separate_shader_objects 1\n"
-            "#define GL_ARB_tessellation_shader 1\n";
+            "#define GL_ARB_tessellation_shader 1\n"
+            "#define GL_ARB_enhanced_layouts 1\n";
     }
 }
 
index d0997b8..e7ccd2e 100644 (file)
@@ -86,6 +86,7 @@ const char* const GL_ARB_texture_gather           = "GL_ARB_texture_gather";
 const char* const GL_ARB_gpu_shader5              = "GL_ARB_gpu_shader5";
 const char* const GL_ARB_separate_shader_objects  = "GL_ARB_separate_shader_objects";
 const char* const GL_ARB_tessellation_shader      = "GL_ARB_tessellation_shader";
+const char* const GL_ARB_enhanced_layouts         = "GL_ARB_enhanced_layouts";
 
 } // end namespace glslang
 
index a1dda87..11d6038 100644 (file)
@@ -228,29 +228,29 @@ primary_expression
     | INTCONSTANT {\r
         TConstUnionArray unionArray(1);\r
         unionArray[0].setIConst($1.i);\r
-        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtInt, EvqConst), $1.loc);\r
+        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtInt, EvqConst), $1.loc, true);\r
     }\r
     | UINTCONSTANT {        \r
         parseContext.fullIntegerCheck($1.loc, "unsigned literal");\r
         TConstUnionArray unionArray(1);\r
         unionArray[0].setUConst($1.u);\r
-        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtUint, EvqConst), $1.loc);\r
+        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtUint, EvqConst), $1.loc, true);\r
     }\r
     | FLOATCONSTANT {\r
         TConstUnionArray unionArray(1);\r
         unionArray[0].setDConst($1.d);\r
-        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtFloat, EvqConst), $1.loc);\r
+        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtFloat, EvqConst), $1.loc, true);\r
     }\r
     | DOUBLECONSTANT {\r
         parseContext.doubleCheck($1.loc, "double literal");\r
         TConstUnionArray unionArray(1);\r
         unionArray[0].setDConst($1.d);\r
-        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtDouble, EvqConst), $1.loc);\r
+        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtDouble, EvqConst), $1.loc, true);\r
     }\r
     | BOOLCONSTANT {\r
         TConstUnionArray unionArray(1);\r
         unionArray[0].setBConst($1.b);\r
-        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $1.loc);\r
+        $$ = parseContext.intermediate.addConstantUnion(unionArray, TType(EbtBool, EvqConst), $1.loc, true);\r
     }\r
     | LEFT_PAREN expression RIGHT_PAREN {\r
         $$ = $2;\r
@@ -1110,13 +1110,9 @@ layout_qualifier_id
         $$.init($1.loc);\r
         parseContext.setLayoutQualifier($1.loc, $$, *$1.string);\r
     }\r
-    | IDENTIFIER EQUAL INTCONSTANT {\r
+    | IDENTIFIER EQUAL constant_expression {\r
         $$.init($1.loc);\r
-        parseContext.setLayoutQualifier($1.loc, $$, *$1.string, $3.i);\r
-    }\r
-    | IDENTIFIER EQUAL UINTCONSTANT {\r
-        $$.init($1.loc);\r
-        parseContext.setLayoutQualifier($1.loc, $$, *$1.string, (int)$3.u);\r
+        parseContext.setLayoutQualifier($1.loc, $$, *$1.string, $3);\r
     }\r
     | SHARED { // because "shared" is both an identifier and a keyword\r
         $$.init($1.loc);\r
index 2ce1f1f..eb85daf 100644 (file)
@@ -96,7 +96,7 @@ public:
     TIntermTyped* addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, TSourceLoc);
     TIntermTyped* addComma(TIntermTyped* left, TIntermTyped* right, TSourceLoc);
     TIntermTyped* addMethod(TIntermTyped*, const TType&, const TString*, TSourceLoc);
-    TIntermConstantUnion* addConstantUnion(const TConstUnionArray&, const TType&, TSourceLoc);
+    TIntermConstantUnion* addConstantUnion(const TConstUnionArray&, const TType&, TSourceLoc, bool literal = false);
     TIntermTyped* promoteConstantUnion(TBasicType, TIntermConstantUnion*) ;
     bool parseConstTree(TIntermNode*, TConstUnionArray, TOperator, const TType&, bool singleConstantParam = false);
     TIntermLoop* addLoop(TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, TSourceLoc);