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(
// push should not have a corresponding pop, so that built-ins
// 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)
{
const char* builtInShaders = i->c_str();
......@@ -67,6 +70,8 @@ bool InitializeSymbolTable(
}
}
symbolTable.push(); // TODO: GLSL ES 3.0 built-ins.
IdentifyBuiltIns(type, spec, resources, symbolTable);
return true;
......
......@@ -567,58 +567,58 @@ void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec,
// expected to be resolved through a library of functions, versus as
// 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("notEqual", EOpVectorNotEqual);
symbolTable.relateToOperator("lessThan", EOpLessThan);
symbolTable.relateToOperator("greaterThan", EOpGreaterThan);
symbolTable.relateToOperator("lessThanEqual", EOpLessThanEqual);
symbolTable.relateToOperator("greaterThanEqual", EOpGreaterThanEqual);
symbolTable.relateToOperator(ESSL1_BUILTINS, "equal", EOpVectorEqual);
symbolTable.relateToOperator(ESSL1_BUILTINS, "notEqual", EOpVectorNotEqual);
symbolTable.relateToOperator(ESSL1_BUILTINS, "lessThan", EOpLessThan);
symbolTable.relateToOperator(ESSL1_BUILTINS, "greaterThan", EOpGreaterThan);
symbolTable.relateToOperator(ESSL1_BUILTINS, "lessThanEqual", EOpLessThanEqual);
symbolTable.relateToOperator(ESSL1_BUILTINS, "greaterThanEqual", EOpGreaterThanEqual);
symbolTable.relateToOperator("radians", EOpRadians);
symbolTable.relateToOperator("degrees", EOpDegrees);
symbolTable.relateToOperator("sin", EOpSin);
symbolTable.relateToOperator("cos", EOpCos);
symbolTable.relateToOperator("tan", EOpTan);
symbolTable.relateToOperator("asin", EOpAsin);
symbolTable.relateToOperator("acos", EOpAcos);
symbolTable.relateToOperator("atan", EOpAtan);
symbolTable.relateToOperator("pow", EOpPow);
symbolTable.relateToOperator("exp2", EOpExp2);
symbolTable.relateToOperator("log", EOpLog);
symbolTable.relateToOperator("exp", EOpExp);
symbolTable.relateToOperator("log2", EOpLog2);
symbolTable.relateToOperator("sqrt", EOpSqrt);
symbolTable.relateToOperator("inversesqrt", EOpInverseSqrt);
symbolTable.relateToOperator("abs", EOpAbs);
symbolTable.relateToOperator("sign", EOpSign);
symbolTable.relateToOperator("floor", EOpFloor);
symbolTable.relateToOperator("ceil", EOpCeil);
symbolTable.relateToOperator("fract", EOpFract);
symbolTable.relateToOperator("mod", EOpMod);
symbolTable.relateToOperator("min", EOpMin);
symbolTable.relateToOperator("max", EOpMax);
symbolTable.relateToOperator("clamp", EOpClamp);
symbolTable.relateToOperator("mix", EOpMix);
symbolTable.relateToOperator("step", EOpStep);
symbolTable.relateToOperator("smoothstep", EOpSmoothStep);
symbolTable.relateToOperator("length", EOpLength);
symbolTable.relateToOperator("distance", EOpDistance);
symbolTable.relateToOperator("dot", EOpDot);
symbolTable.relateToOperator("cross", EOpCross);
symbolTable.relateToOperator("normalize", EOpNormalize);
symbolTable.relateToOperator("faceforward", EOpFaceForward);
symbolTable.relateToOperator("reflect", EOpReflect);
symbolTable.relateToOperator("refract", EOpRefract);
symbolTable.relateToOperator(ESSL1_BUILTINS, "radians", EOpRadians);
symbolTable.relateToOperator(ESSL1_BUILTINS, "degrees", EOpDegrees);
symbolTable.relateToOperator(ESSL1_BUILTINS, "sin", EOpSin);
symbolTable.relateToOperator(ESSL1_BUILTINS, "cos", EOpCos);
symbolTable.relateToOperator(ESSL1_BUILTINS, "tan", EOpTan);
symbolTable.relateToOperator(ESSL1_BUILTINS, "asin", EOpAsin);
symbolTable.relateToOperator(ESSL1_BUILTINS, "acos", EOpAcos);
symbolTable.relateToOperator(ESSL1_BUILTINS, "atan", EOpAtan);
symbolTable.relateToOperator(ESSL1_BUILTINS, "pow", EOpPow);
symbolTable.relateToOperator(ESSL1_BUILTINS, "exp2", EOpExp2);
symbolTable.relateToOperator(ESSL1_BUILTINS, "log", EOpLog);
symbolTable.relateToOperator(ESSL1_BUILTINS, "exp", EOpExp);
symbolTable.relateToOperator(ESSL1_BUILTINS, "log2", EOpLog2);
symbolTable.relateToOperator(ESSL1_BUILTINS, "sqrt", EOpSqrt);
symbolTable.relateToOperator(ESSL1_BUILTINS, "inversesqrt", EOpInverseSqrt);
symbolTable.relateToOperator(ESSL1_BUILTINS, "abs", EOpAbs);
symbolTable.relateToOperator(ESSL1_BUILTINS, "sign", EOpSign);
symbolTable.relateToOperator(ESSL1_BUILTINS, "floor", EOpFloor);
symbolTable.relateToOperator(ESSL1_BUILTINS, "ceil", EOpCeil);
symbolTable.relateToOperator(ESSL1_BUILTINS, "fract", EOpFract);
symbolTable.relateToOperator(ESSL1_BUILTINS, "mod", EOpMod);
symbolTable.relateToOperator(ESSL1_BUILTINS, "min", EOpMin);
symbolTable.relateToOperator(ESSL1_BUILTINS, "max", EOpMax);
symbolTable.relateToOperator(ESSL1_BUILTINS, "clamp", EOpClamp);
symbolTable.relateToOperator(ESSL1_BUILTINS, "mix", EOpMix);
symbolTable.relateToOperator(ESSL1_BUILTINS, "step", EOpStep);
symbolTable.relateToOperator(ESSL1_BUILTINS, "smoothstep", EOpSmoothStep);
symbolTable.relateToOperator(ESSL1_BUILTINS, "length", EOpLength);
symbolTable.relateToOperator(ESSL1_BUILTINS, "distance", EOpDistance);
symbolTable.relateToOperator(ESSL1_BUILTINS, "dot", EOpDot);
symbolTable.relateToOperator(ESSL1_BUILTINS, "cross", EOpCross);
symbolTable.relateToOperator(ESSL1_BUILTINS, "normalize", EOpNormalize);
symbolTable.relateToOperator(ESSL1_BUILTINS, "faceforward", EOpFaceForward);
symbolTable.relateToOperator(ESSL1_BUILTINS, "reflect", EOpReflect);
symbolTable.relateToOperator(ESSL1_BUILTINS, "refract", EOpRefract);
symbolTable.relateToOperator("any", EOpAny);
symbolTable.relateToOperator("all", EOpAll);
symbolTable.relateToOperator(ESSL1_BUILTINS, "any", EOpAny);
symbolTable.relateToOperator(ESSL1_BUILTINS, "all", EOpAll);
// Map language-specific operators.
switch(type) {
......@@ -626,13 +626,13 @@ void IdentifyBuiltIns(ShShaderType type, ShShaderSpec spec,
break;
case SH_FRAGMENT_SHADER:
if (resources.OES_standard_derivatives) {
symbolTable.relateToOperator("dFdx", EOpDFdx);
symbolTable.relateToOperator("dFdy", EOpDFdy);
symbolTable.relateToOperator("fwidth", EOpFwidth);
symbolTable.relateToOperator(ESSL1_BUILTINS, "dFdx", EOpDFdx);
symbolTable.relateToOperator(ESSL1_BUILTINS, "dFdy", EOpDFdy);
symbolTable.relateToOperator(ESSL1_BUILTINS, "fwidth", EOpFwidth);
symbolTable.relateToExtension("dFdx", "GL_OES_standard_derivatives");
symbolTable.relateToExtension("dFdy", "GL_OES_standard_derivatives");
symbolTable.relateToExtension("fwidth", "GL_OES_standard_derivatives");
symbolTable.relateToExtension(ESSL1_BUILTINS, "dFdx", "GL_OES_standard_derivatives");
symbolTable.relateToExtension(ESSL1_BUILTINS, "dFdy", "GL_OES_standard_derivatives");
symbolTable.relateToExtension(ESSL1_BUILTINS, "fwidth", "GL_OES_standard_derivatives");
}
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
// found in the LICENSE file.
//
......@@ -237,6 +237,15 @@ protected:
tLevel level;
};
enum ESymbolLevel
{
COMMON_BUILTINS = 0,
ESSL1_BUILTINS = 1,
ESSL3_BUILTINS = 2,
LAST_BUILTIN_LEVEL = ESSL3_BUILTINS,
GLOBAL_LEVEL = 3
};
class TSymbolTable {
public:
TSymbolTable() : uniqueId(0)
......@@ -250,8 +259,7 @@ public:
~TSymbolTable()
{
// level 0 is always built In symbols, so we never pop that out
while (table.size() > 1)
while (table.size() > 0)
pop();
}
......@@ -260,9 +268,9 @@ public:
// 'push' calls, so that built-ins are at level 0 and the shader
// globals are at level 1.
//
bool isEmpty() { return table.size() == 0; }
bool atBuiltInLevel() { return table.size() == 1; }
bool atGlobalLevel() { return table.size() <= 2; }
bool isEmpty() { return table.empty(); }
bool atBuiltInLevel() { return currentLevel() <= LAST_BUILTIN_LEVEL; }
bool atGlobalLevel() { return currentLevel() <= GLOBAL_LEVEL; }
void push()
{
table.push_back(new TSymbolTableLevel);
......@@ -282,7 +290,7 @@ public:
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();
TSymbol* symbol;
......@@ -292,32 +300,34 @@ public:
} while (symbol == 0 && level >= 0);
level++;
if (builtIn)
*builtIn = level == 0;
*builtIn = (level <= LAST_BUILTIN_LEVEL);
if (sameScope)
*sameScope = level == currentLevel();
*sameScope = (level == currentLevel());
return symbol;
}
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() {
assert(table.size() >= 2);
return table[1];
}
if (symbol)
return symbol;
}
TSymbolTableLevel* getOuterLevel() {
assert(table.size() >= 2);
return 0;
}
TSymbolTableLevel *getOuterLevel() {
assert(currentLevel() >= 1);
return table[currentLevel() - 1];
}
void relateToOperator(const char* name, TOperator op) {
table[0]->relateToOperator(name, op);
void relateToOperator(ESymbolLevel level, const char* name, TOperator op) {
table[level]->relateToOperator(name, op);
}
void relateToExtension(const char* name, const TString& ext) {
table[0]->relateToExtension(name, ext);
void relateToExtension(ESymbolLevel level, const char* name, const TString& ext) {
table[level]->relateToExtension(name, ext);
}
int getMaxSymbolId() { return uniqueId; }
void dump(TInfoSink &infoSink) const;
......@@ -353,7 +363,7 @@ public:
return prec;
}
protected:
protected:
int currentLevel() const { return static_cast<int>(table.size()) - 1; }
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