Split the built-in symbols over multiple symbol table levels.

TRAC #22954 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2268 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 644f766c
...@@ -51,8 +51,11 @@ bool InitializeSymbolTable( ...@@ -51,8 +51,11 @@ bool InitializeSymbolTable(
// push should not have a corresponding pop, so that built-ins // push should not have a corresponding pop, so that built-ins
// are preserved, and the test for an empty table fails. // are preserved, and the test for an empty table fails.
// //
symbolTable.push();
symbolTable.push(); // TODO: Common built-ins.
// GLSL ES 1.0 built-ins
symbolTable.push();
for (TBuiltInStrings::const_iterator i = builtInStrings.begin(); i != builtInStrings.end(); ++i) for (TBuiltInStrings::const_iterator i = builtInStrings.begin(); i != builtInStrings.end(); ++i)
{ {
const char* builtInShaders = i->c_str(); const char* builtInShaders = i->c_str();
...@@ -67,6 +70,8 @@ bool InitializeSymbolTable( ...@@ -67,6 +70,8 @@ bool InitializeSymbolTable(
} }
} }
symbolTable.push(); // TODO: GLSL ES 3.0 built-ins.
IdentifyBuiltIns(type, spec, resources, symbolTable); IdentifyBuiltIns(type, spec, resources, symbolTable);
return true; return true;
......
...@@ -567,58 +567,58 @@ void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec, ...@@ -567,58 +567,58 @@ void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec,
// expected to be resolved through a library of functions, versus as // expected to be resolved through a library of functions, versus as
// operations. // operations.
// //
symbolTable.relateToOperator("not", EOpVectorLogicalNot); symbolTable.relateToOperator(ESSL1_BUILTINS, "not", EOpVectorLogicalNot);
symbolTable.relateToOperator("matrixCompMult", EOpMul); symbolTable.relateToOperator(ESSL1_BUILTINS, "matrixCompMult", EOpMul);
symbolTable.relateToOperator("equal", EOpVectorEqual); symbolTable.relateToOperator(ESSL1_BUILTINS, "equal", EOpVectorEqual);
symbolTable.relateToOperator("notEqual", EOpVectorNotEqual); symbolTable.relateToOperator(ESSL1_BUILTINS, "notEqual", EOpVectorNotEqual);
symbolTable.relateToOperator("lessThan", EOpLessThan); symbolTable.relateToOperator(ESSL1_BUILTINS, "lessThan", EOpLessThan);
symbolTable.relateToOperator("greaterThan", EOpGreaterThan); symbolTable.relateToOperator(ESSL1_BUILTINS, "greaterThan", EOpGreaterThan);
symbolTable.relateToOperator("lessThanEqual", EOpLessThanEqual); symbolTable.relateToOperator(ESSL1_BUILTINS, "lessThanEqual", EOpLessThanEqual);
symbolTable.relateToOperator("greaterThanEqual", EOpGreaterThanEqual); symbolTable.relateToOperator(ESSL1_BUILTINS, "greaterThanEqual", EOpGreaterThanEqual);
symbolTable.relateToOperator("radians", EOpRadians); symbolTable.relateToOperator(ESSL1_BUILTINS, "radians", EOpRadians);
symbolTable.relateToOperator("degrees", EOpDegrees); symbolTable.relateToOperator(ESSL1_BUILTINS, "degrees", EOpDegrees);
symbolTable.relateToOperator("sin", EOpSin); symbolTable.relateToOperator(ESSL1_BUILTINS, "sin", EOpSin);
symbolTable.relateToOperator("cos", EOpCos); symbolTable.relateToOperator(ESSL1_BUILTINS, "cos", EOpCos);
symbolTable.relateToOperator("tan", EOpTan); symbolTable.relateToOperator(ESSL1_BUILTINS, "tan", EOpTan);
symbolTable.relateToOperator("asin", EOpAsin); symbolTable.relateToOperator(ESSL1_BUILTINS, "asin", EOpAsin);
symbolTable.relateToOperator("acos", EOpAcos); symbolTable.relateToOperator(ESSL1_BUILTINS, "acos", EOpAcos);
symbolTable.relateToOperator("atan", EOpAtan); symbolTable.relateToOperator(ESSL1_BUILTINS, "atan", EOpAtan);
symbolTable.relateToOperator("pow", EOpPow); symbolTable.relateToOperator(ESSL1_BUILTINS, "pow", EOpPow);
symbolTable.relateToOperator("exp2", EOpExp2); symbolTable.relateToOperator(ESSL1_BUILTINS, "exp2", EOpExp2);
symbolTable.relateToOperator("log", EOpLog); symbolTable.relateToOperator(ESSL1_BUILTINS, "log", EOpLog);
symbolTable.relateToOperator("exp", EOpExp); symbolTable.relateToOperator(ESSL1_BUILTINS, "exp", EOpExp);
symbolTable.relateToOperator("log2", EOpLog2); symbolTable.relateToOperator(ESSL1_BUILTINS, "log2", EOpLog2);
symbolTable.relateToOperator("sqrt", EOpSqrt); symbolTable.relateToOperator(ESSL1_BUILTINS, "sqrt", EOpSqrt);
symbolTable.relateToOperator("inversesqrt", EOpInverseSqrt); symbolTable.relateToOperator(ESSL1_BUILTINS, "inversesqrt", EOpInverseSqrt);
symbolTable.relateToOperator("abs", EOpAbs); symbolTable.relateToOperator(ESSL1_BUILTINS, "abs", EOpAbs);
symbolTable.relateToOperator("sign", EOpSign); symbolTable.relateToOperator(ESSL1_BUILTINS, "sign", EOpSign);
symbolTable.relateToOperator("floor", EOpFloor); symbolTable.relateToOperator(ESSL1_BUILTINS, "floor", EOpFloor);
symbolTable.relateToOperator("ceil", EOpCeil); symbolTable.relateToOperator(ESSL1_BUILTINS, "ceil", EOpCeil);
symbolTable.relateToOperator("fract", EOpFract); symbolTable.relateToOperator(ESSL1_BUILTINS, "fract", EOpFract);
symbolTable.relateToOperator("mod", EOpMod); symbolTable.relateToOperator(ESSL1_BUILTINS, "mod", EOpMod);
symbolTable.relateToOperator("min", EOpMin); symbolTable.relateToOperator(ESSL1_BUILTINS, "min", EOpMin);
symbolTable.relateToOperator("max", EOpMax); symbolTable.relateToOperator(ESSL1_BUILTINS, "max", EOpMax);
symbolTable.relateToOperator("clamp", EOpClamp); symbolTable.relateToOperator(ESSL1_BUILTINS, "clamp", EOpClamp);
symbolTable.relateToOperator("mix", EOpMix); symbolTable.relateToOperator(ESSL1_BUILTINS, "mix", EOpMix);
symbolTable.relateToOperator("step", EOpStep); symbolTable.relateToOperator(ESSL1_BUILTINS, "step", EOpStep);
symbolTable.relateToOperator("smoothstep", EOpSmoothStep); symbolTable.relateToOperator(ESSL1_BUILTINS, "smoothstep", EOpSmoothStep);
symbolTable.relateToOperator("length", EOpLength); symbolTable.relateToOperator(ESSL1_BUILTINS, "length", EOpLength);
symbolTable.relateToOperator("distance", EOpDistance); symbolTable.relateToOperator(ESSL1_BUILTINS, "distance", EOpDistance);
symbolTable.relateToOperator("dot", EOpDot); symbolTable.relateToOperator(ESSL1_BUILTINS, "dot", EOpDot);
symbolTable.relateToOperator("cross", EOpCross); symbolTable.relateToOperator(ESSL1_BUILTINS, "cross", EOpCross);
symbolTable.relateToOperator("normalize", EOpNormalize); symbolTable.relateToOperator(ESSL1_BUILTINS, "normalize", EOpNormalize);
symbolTable.relateToOperator("faceforward", EOpFaceForward); symbolTable.relateToOperator(ESSL1_BUILTINS, "faceforward", EOpFaceForward);
symbolTable.relateToOperator("reflect", EOpReflect); symbolTable.relateToOperator(ESSL1_BUILTINS, "reflect", EOpReflect);
symbolTable.relateToOperator("refract", EOpRefract); symbolTable.relateToOperator(ESSL1_BUILTINS, "refract", EOpRefract);
symbolTable.relateToOperator("any", EOpAny); symbolTable.relateToOperator(ESSL1_BUILTINS, "any", EOpAny);
symbolTable.relateToOperator("all", EOpAll); symbolTable.relateToOperator(ESSL1_BUILTINS, "all", EOpAll);
// Map language-specific operators. // Map language-specific operators.
switch(type) { switch(type) {
...@@ -626,13 +626,13 @@ void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec, ...@@ -626,13 +626,13 @@ void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec,
break; break;
case SH_FRAGMENT_SHADER: case SH_FRAGMENT_SHADER:
if (resources.OES_standard_derivatives) { if (resources.OES_standard_derivatives) {
symbolTable.relateToOperator("dFdx", EOpDFdx); symbolTable.relateToOperator(ESSL1_BUILTINS, "dFdx", EOpDFdx);
symbolTable.relateToOperator("dFdy", EOpDFdy); symbolTable.relateToOperator(ESSL1_BUILTINS, "dFdy", EOpDFdy);
symbolTable.relateToOperator("fwidth", EOpFwidth); symbolTable.relateToOperator(ESSL1_BUILTINS, "fwidth", EOpFwidth);
symbolTable.relateToExtension("dFdx", "GL_OES_standard_derivatives"); symbolTable.relateToExtension(ESSL1_BUILTINS, "dFdx", "GL_OES_standard_derivatives");
symbolTable.relateToExtension("dFdy", "GL_OES_standard_derivatives"); symbolTable.relateToExtension(ESSL1_BUILTINS, "dFdy", "GL_OES_standard_derivatives");
symbolTable.relateToExtension("fwidth", "GL_OES_standard_derivatives"); symbolTable.relateToExtension(ESSL1_BUILTINS, "fwidth", "GL_OES_standard_derivatives");
} }
break; break;
default: break; default: break;
......
// //
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// //
...@@ -237,6 +237,15 @@ protected: ...@@ -237,6 +237,15 @@ protected:
tLevel level; tLevel level;
}; };
enum ESymbolLevel
{
COMMON_BUILTINS = 0,
ESSL1_BUILTINS = 1,
ESSL3_BUILTINS = 2,
LAST_BUILTIN_LEVEL = ESSL3_BUILTINS,
GLOBAL_LEVEL = 3
};
class TSymbolTable { class TSymbolTable {
public: public:
TSymbolTable() : uniqueId(0) TSymbolTable() : uniqueId(0)
...@@ -250,8 +259,7 @@ public: ...@@ -250,8 +259,7 @@ public:
~TSymbolTable() ~TSymbolTable()
{ {
// level 0 is always built In symbols, so we never pop that out while (table.size() > 0)
while (table.size() > 1)
pop(); pop();
} }
...@@ -260,9 +268,9 @@ public: ...@@ -260,9 +268,9 @@ public:
// 'push' calls, so that built-ins are at level 0 and the shader // 'push' calls, so that built-ins are at level 0 and the shader
// globals are at level 1. // globals are at level 1.
// //
bool isEmpty() { return table.size() == 0; } bool isEmpty() { return table.empty(); }
bool atBuiltInLevel() { return table.size() == 1; } bool atBuiltInLevel() { return currentLevel() <= LAST_BUILTIN_LEVEL; }
bool atGlobalLevel() { return table.size() <= 2; } bool atGlobalLevel() { return currentLevel() <= GLOBAL_LEVEL; }
void push() void push()
{ {
table.push_back(new TSymbolTableLevel); table.push_back(new TSymbolTableLevel);
...@@ -282,7 +290,7 @@ public: ...@@ -282,7 +290,7 @@ public:
return table[currentLevel()]->insert(symbol); return table[currentLevel()]->insert(symbol);
} }
TSymbol* find(const TString& name, bool* builtIn = 0, bool *sameScope = 0) TSymbol *find(const TString &name, bool *builtIn = false, bool *sameScope = false)
{ {
int level = currentLevel(); int level = currentLevel();
TSymbol* symbol; TSymbol* symbol;
...@@ -292,32 +300,34 @@ public: ...@@ -292,32 +300,34 @@ public:
} while (symbol == 0 && level >= 0); } while (symbol == 0 && level >= 0);
level++; level++;
if (builtIn) if (builtIn)
*builtIn = level == 0; *builtIn = (level <= LAST_BUILTIN_LEVEL);
if (sameScope) if (sameScope)
*sameScope = level == currentLevel(); *sameScope = (level == currentLevel());
return symbol; return symbol;
} }
TSymbol *findBuiltIn(const TString &name) TSymbol *findBuiltIn(const TString &name)
{ {
return table[0]->find(name); for (int i = LAST_BUILTIN_LEVEL; i >= 0; i--) {
} TSymbol *symbol = table[i]->find(name);
TSymbolTableLevel* getGlobalLevel() { if (symbol)
assert(table.size() >= 2); return symbol;
return table[1]; }
}
TSymbolTableLevel* getOuterLevel() { return 0;
assert(table.size() >= 2); }
TSymbolTableLevel *getOuterLevel() {
assert(currentLevel() >= 1);
return table[currentLevel() - 1]; return table[currentLevel() - 1];
} }
void relateToOperator(const char* name, TOperator op) { void relateToOperator(ESymbolLevel level, const char* name, TOperator op) {
table[0]->relateToOperator(name, op); table[level]->relateToOperator(name, op);
} }
void relateToExtension(const char* name, const TString& ext) { void relateToExtension(ESymbolLevel level, const char* name, const TString& ext) {
table[0]->relateToExtension(name, ext); table[level]->relateToExtension(name, ext);
} }
int getMaxSymbolId() { return uniqueId; } int getMaxSymbolId() { return uniqueId; }
void dump(TInfoSink &infoSink) const; void dump(TInfoSink &infoSink) const;
...@@ -353,7 +363,7 @@ public: ...@@ -353,7 +363,7 @@ public:
return prec; return prec;
} }
protected: protected:
int currentLevel() const { return static_cast<int>(table.size()) - 1; } int currentLevel() const { return static_cast<int>(table.size()) - 1; }
std::vector<TSymbolTableLevel*> table; std::vector<TSymbolTableLevel*> table;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment