Commit a5e693af by Olli Etuaho Committed by Commit Bot

Make unique id counter a member of TSymbolTable

This makes unique id counting thread-safe. BUG=angleproject:624 TEST=angle_unittests Change-Id: Ie0f2c7e574470b39750d37d2181c790bc874b275 Reviewed-on: https://chromium-review.googlesource.com/570419 Commit-Queue: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent e5285d29
...@@ -60,10 +60,10 @@ TIntermAggregate *CreateReplacementCall(TIntermAggregate *originalCall, ...@@ -60,10 +60,10 @@ TIntermAggregate *CreateReplacementCall(TIntermAggregate *originalCall,
class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser
{ {
public: public:
static void apply(TIntermNode *root, TSymbolUniqueId *temporaryId); static void apply(TIntermNode *root, TSymbolTable *symbolTable);
private: private:
ArrayReturnValueToOutParameterTraverser(); ArrayReturnValueToOutParameterTraverser(TSymbolTable *symbolTable);
bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override; bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override;
bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override;
...@@ -74,16 +74,16 @@ class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser ...@@ -74,16 +74,16 @@ class ArrayReturnValueToOutParameterTraverser : private TIntermTraverser
bool mInFunctionWithArrayReturnValue; bool mInFunctionWithArrayReturnValue;
}; };
void ArrayReturnValueToOutParameterTraverser::apply(TIntermNode *root, TSymbolUniqueId *temporaryId) void ArrayReturnValueToOutParameterTraverser::apply(TIntermNode *root, TSymbolTable *symbolTable)
{ {
ArrayReturnValueToOutParameterTraverser arrayReturnValueToOutParam; ArrayReturnValueToOutParameterTraverser arrayReturnValueToOutParam(symbolTable);
arrayReturnValueToOutParam.useTemporaryId(temporaryId);
root->traverse(&arrayReturnValueToOutParam); root->traverse(&arrayReturnValueToOutParam);
arrayReturnValueToOutParam.updateTree(); arrayReturnValueToOutParam.updateTree();
} }
ArrayReturnValueToOutParameterTraverser::ArrayReturnValueToOutParameterTraverser() ArrayReturnValueToOutParameterTraverser::ArrayReturnValueToOutParameterTraverser(
: TIntermTraverser(true, false, true), mInFunctionWithArrayReturnValue(false) TSymbolTable *symbolTable)
: TIntermTraverser(true, false, true, symbolTable), mInFunctionWithArrayReturnValue(false)
{ {
} }
...@@ -194,9 +194,9 @@ bool ArrayReturnValueToOutParameterTraverser::visitBinary(Visit visit, TIntermBi ...@@ -194,9 +194,9 @@ bool ArrayReturnValueToOutParameterTraverser::visitBinary(Visit visit, TIntermBi
} // namespace } // namespace
void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolUniqueId *temporaryId) void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolTable *symbolTable)
{ {
ArrayReturnValueToOutParameterTraverser::apply(root, temporaryId); ArrayReturnValueToOutParameterTraverser::apply(root, symbolTable);
} }
} // namespace sh } // namespace sh
...@@ -14,9 +14,9 @@ namespace sh ...@@ -14,9 +14,9 @@ namespace sh
{ {
class TIntermNode; class TIntermNode;
class TSymbolUniqueId; class TSymbolTable;
void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolUniqueId *temporaryId); void ArrayReturnValueToOutParameter(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
......
...@@ -241,8 +241,7 @@ TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output) ...@@ -241,8 +241,7 @@ TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output)
builtInFunctionEmulator(), builtInFunctionEmulator(),
mDiagnostics(infoSink.info), mDiagnostics(infoSink.info),
mSourcePath(nullptr), mSourcePath(nullptr),
mComputeShaderLocalSizeDeclared(false), mComputeShaderLocalSizeDeclared(false)
mTemporaryId()
{ {
mComputeShaderLocalSize.fill(1); mComputeShaderLocalSize.fill(1);
} }
...@@ -395,7 +394,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], ...@@ -395,7 +394,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
if (success && shouldRunLoopAndIndexingValidation(compileOptions)) if (success && shouldRunLoopAndIndexingValidation(compileOptions))
success = success =
ValidateLimitations(root, shaderType, symbolTable, shaderVersion, &mDiagnostics); ValidateLimitations(root, shaderType, &symbolTable, shaderVersion, &mDiagnostics);
bool multiview2 = IsExtensionEnabled(extensionBehavior, "GL_OVR_multiview2"); bool multiview2 = IsExtensionEnabled(extensionBehavior, "GL_OVR_multiview2");
if (success && compileResources.OVR_multiview && IsWebGLBasedSpec(shaderSpec) && if (success && compileResources.OVR_multiview && IsWebGLBasedSpec(shaderSpec) &&
...@@ -432,12 +431,12 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], ...@@ -432,12 +431,12 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
parseContext.isMultiviewExtensionEnabled() && getShaderType() != GL_COMPUTE_SHADER) parseContext.isMultiviewExtensionEnabled() && getShaderType() != GL_COMPUTE_SHADER)
{ {
DeclareAndInitBuiltinsForInstancedMultiview(root, mNumViews, shaderType, compileOptions, DeclareAndInitBuiltinsForInstancedMultiview(root, mNumViews, shaderType, compileOptions,
outputType, symbolTable); outputType, &symbolTable);
} }
// This pass might emit short circuits so keep it before the short circuit unfolding // This pass might emit short circuits so keep it before the short circuit unfolding
if (success && (compileOptions & SH_REWRITE_DO_WHILE_LOOPS)) if (success && (compileOptions & SH_REWRITE_DO_WHILE_LOOPS))
RewriteDoWhile(root, getTemporaryId()); RewriteDoWhile(root, &symbolTable);
if (success && (compileOptions & SH_ADD_AND_TRUE_TO_LOOP_CONDITION)) if (success && (compileOptions & SH_ADD_AND_TRUE_TO_LOOP_CONDITION))
sh::AddAndTrueToLoopCondition(root); sh::AddAndTrueToLoopCondition(root);
...@@ -458,7 +457,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], ...@@ -458,7 +457,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
{ {
ASSERT(!variablesCollected); ASSERT(!variablesCollected);
CollectVariables(root, &attributes, &outputVariables, &uniforms, &varyings, CollectVariables(root, &attributes, &outputVariables, &uniforms, &varyings,
&interfaceBlocks, hashFunction, symbolTable, shaderVersion, &interfaceBlocks, hashFunction, &symbolTable, shaderVersion,
extensionBehavior); extensionBehavior);
variablesCollected = true; variablesCollected = true;
if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS) if (compileOptions & SH_USE_UNUSED_STANDARD_SHARED_BLOCKS)
...@@ -504,12 +503,12 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], ...@@ -504,12 +503,12 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
if (success && (compileOptions & SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS)) if (success && (compileOptions & SH_SCALARIZE_VEC_AND_MAT_CONSTRUCTOR_ARGS))
{ {
ScalarizeVecAndMatConstructorArgs(root, shaderType, fragmentPrecisionHigh, ScalarizeVecAndMatConstructorArgs(root, shaderType, fragmentPrecisionHigh,
getTemporaryId()); &symbolTable);
} }
if (success && (compileOptions & SH_REGENERATE_STRUCT_NAMES)) if (success && (compileOptions & SH_REGENERATE_STRUCT_NAMES))
{ {
RegenerateStructNames gen(symbolTable, shaderVersion); RegenerateStructNames gen(&symbolTable, shaderVersion);
root->traverse(&gen); root->traverse(&gen);
} }
...@@ -518,7 +517,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], ...@@ -518,7 +517,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
IsExtensionEnabled(extensionBehavior, "GL_EXT_draw_buffers")) IsExtensionEnabled(extensionBehavior, "GL_EXT_draw_buffers"))
{ {
EmulateGLFragColorBroadcast(root, compileResources.MaxDrawBuffers, &outputVariables, EmulateGLFragColorBroadcast(root, compileResources.MaxDrawBuffers, &outputVariables,
symbolTable, shaderVersion); &symbolTable, shaderVersion);
} }
if (success) if (success)
...@@ -541,7 +540,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[], ...@@ -541,7 +540,7 @@ TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
IntermNodePatternMatcher::kMultiDeclaration | IntermNodePatternMatcher::kMultiDeclaration |
IntermNodePatternMatcher::kArrayDeclaration | IntermNodePatternMatcher::kArrayDeclaration |
IntermNodePatternMatcher::kNamelessStructDeclaration, IntermNodePatternMatcher::kNamelessStructDeclaration,
getTemporaryId(), getSymbolTable(), getShaderVersion()); &getSymbolTable(), getShaderVersion());
} }
// We only really need to separate array declarations and nameless struct declarations, // We only really need to separate array declarations and nameless struct declarations,
// but it's simpler to just use the regular SeparateDeclarations. // but it's simpler to just use the regular SeparateDeclarations.
...@@ -748,7 +747,6 @@ void TCompiler::clearResults() ...@@ -748,7 +747,6 @@ void TCompiler::clearResults()
nameMap.clear(); nameMap.clear();
mSourcePath = nullptr; mSourcePath = nullptr;
mTemporaryId = TSymbolUniqueId();
} }
bool TCompiler::initCallDag(TIntermNode *root) bool TCompiler::initCallDag(TIntermNode *root)
......
...@@ -157,7 +157,6 @@ class TCompiler : public TShHandleBase ...@@ -157,7 +157,6 @@ class TCompiler : public TShHandleBase
const char *getSourcePath() const; const char *getSourcePath() const;
const TPragma &getPragma() const { return mPragma; } const TPragma &getPragma() const { return mPragma; }
void writePragma(ShCompileOptions compileOptions); void writePragma(ShCompileOptions compileOptions);
TSymbolUniqueId *getTemporaryId() { return &mTemporaryId; }
// Relies on collectVariables having been called. // Relies on collectVariables having been called.
bool isVaryingDefined(const char *varyingName); bool isVaryingDefined(const char *varyingName);
...@@ -247,8 +246,6 @@ class TCompiler : public TShHandleBase ...@@ -247,8 +246,6 @@ class TCompiler : public TShHandleBase
NameMap nameMap; NameMap nameMap;
TPragma mPragma; TPragma mPragma;
TSymbolUniqueId mTemporaryId;
}; };
// //
......
...@@ -135,12 +135,12 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root, ...@@ -135,12 +135,12 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root,
GLenum shaderType, GLenum shaderType,
ShCompileOptions compileOptions, ShCompileOptions compileOptions,
ShShaderOutput shaderOutput, ShShaderOutput shaderOutput,
const TSymbolTable &symbolTable) TSymbolTable *symbolTable)
{ {
ASSERT(shaderType == GL_VERTEX_SHADER || shaderType == GL_FRAGMENT_SHADER); ASSERT(shaderType == GL_VERTEX_SHADER || shaderType == GL_FRAGMENT_SHADER);
TQualifier viewIDQualifier = (shaderType == GL_VERTEX_SHADER) ? EvqFlatOut : EvqFlatIn; TQualifier viewIDQualifier = (shaderType == GL_VERTEX_SHADER) ? EvqFlatOut : EvqFlatIn;
TIntermSymbol *viewIDSymbol = new TIntermSymbol(TSymbolTable::nextUniqueId(), "ViewID_OVR", TIntermSymbol *viewIDSymbol = new TIntermSymbol(symbolTable->nextUniqueId(), "ViewID_OVR",
TType(EbtUInt, EbpHigh, viewIDQualifier)); TType(EbtUInt, EbpHigh, viewIDQualifier));
viewIDSymbol->setInternal(true); viewIDSymbol->setInternal(true);
...@@ -151,13 +151,13 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root, ...@@ -151,13 +151,13 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root,
// Replacing gl_InstanceID with InstanceID should happen before adding the initializers of // Replacing gl_InstanceID with InstanceID should happen before adding the initializers of
// InstanceID and ViewID. // InstanceID and ViewID.
TIntermSymbol *instanceIDSymbol = new TIntermSymbol( TIntermSymbol *instanceIDSymbol = new TIntermSymbol(
TSymbolTable::nextUniqueId(), "InstanceID", TType(EbtInt, EbpHigh, EvqGlobal)); symbolTable->nextUniqueId(), "InstanceID", TType(EbtInt, EbpHigh, EvqGlobal));
instanceIDSymbol->setInternal(true); instanceIDSymbol->setInternal(true);
DeclareGlobalVariable(root, instanceIDSymbol); DeclareGlobalVariable(root, instanceIDSymbol);
ReplaceSymbol(root, "gl_InstanceID", instanceIDSymbol); ReplaceSymbol(root, "gl_InstanceID", instanceIDSymbol);
TIntermSequence *initializers = new TIntermSequence(); TIntermSequence *initializers = new TIntermSequence();
InitializeViewIDAndInstanceID(viewIDSymbol, instanceIDSymbol, numberOfViews, symbolTable, InitializeViewIDAndInstanceID(viewIDSymbol, instanceIDSymbol, numberOfViews, *symbolTable,
initializers); initializers);
// The AST transformation which adds the expression to select the viewport index should // The AST transformation which adds the expression to select the viewport index should
......
...@@ -35,7 +35,7 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root, ...@@ -35,7 +35,7 @@ void DeclareAndInitBuiltinsForInstancedMultiview(TIntermBlock *root,
GLenum shaderType, GLenum shaderType,
ShCompileOptions compileOptions, ShCompileOptions compileOptions,
ShShaderOutput shaderOutput, ShShaderOutput shaderOutput,
const TSymbolTable &symbolTable); TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
......
...@@ -26,13 +26,10 @@ namespace ...@@ -26,13 +26,10 @@ namespace
class GLFragColorBroadcastTraverser : public TIntermTraverser class GLFragColorBroadcastTraverser : public TIntermTraverser
{ {
public: public:
GLFragColorBroadcastTraverser(int maxDrawBuffers, GLFragColorBroadcastTraverser(int maxDrawBuffers, TSymbolTable *symbolTable, int shaderVersion)
const TSymbolTable &symbolTable, : TIntermTraverser(true, false, false, symbolTable),
int shaderVersion)
: TIntermTraverser(true, false, false),
mGLFragColorUsed(false), mGLFragColorUsed(false),
mMaxDrawBuffers(maxDrawBuffers), mMaxDrawBuffers(maxDrawBuffers),
mSymbolTable(symbolTable),
mShaderVersion(shaderVersion) mShaderVersion(shaderVersion)
{ {
} }
...@@ -50,14 +47,13 @@ class GLFragColorBroadcastTraverser : public TIntermTraverser ...@@ -50,14 +47,13 @@ class GLFragColorBroadcastTraverser : public TIntermTraverser
private: private:
bool mGLFragColorUsed; bool mGLFragColorUsed;
int mMaxDrawBuffers; int mMaxDrawBuffers;
const TSymbolTable &mSymbolTable;
const int mShaderVersion; const int mShaderVersion;
}; };
TIntermBinary *GLFragColorBroadcastTraverser::constructGLFragDataNode(int index) const TIntermBinary *GLFragColorBroadcastTraverser::constructGLFragDataNode(int index) const
{ {
TIntermSymbol *symbol = TIntermSymbol *symbol =
ReferenceBuiltInVariable(TString("gl_FragData"), mSymbolTable, mShaderVersion); ReferenceBuiltInVariable(TString("gl_FragData"), *mSymbolTable, mShaderVersion);
TIntermTyped *indexNode = CreateIndexNode(index); TIntermTyped *indexNode = CreateIndexNode(index);
TIntermBinary *binary = new TIntermBinary(EOpIndexDirect, symbol, indexNode); TIntermBinary *binary = new TIntermBinary(EOpIndexDirect, symbol, indexNode);
...@@ -98,7 +94,7 @@ void GLFragColorBroadcastTraverser::broadcastGLFragColor(TIntermBlock *root) ...@@ -98,7 +94,7 @@ void GLFragColorBroadcastTraverser::broadcastGLFragColor(TIntermBlock *root)
{ {
broadcastBlock->appendStatement(constructGLFragDataAssignNode(colorIndex)); broadcastBlock->appendStatement(constructGLFragDataAssignNode(colorIndex));
} }
RunAtTheEndOfShader(root, broadcastBlock); RunAtTheEndOfShader(root, broadcastBlock, mSymbolTable);
} }
} // namespace anonymous } // namespace anonymous
...@@ -106,7 +102,7 @@ void GLFragColorBroadcastTraverser::broadcastGLFragColor(TIntermBlock *root) ...@@ -106,7 +102,7 @@ void GLFragColorBroadcastTraverser::broadcastGLFragColor(TIntermBlock *root)
void EmulateGLFragColorBroadcast(TIntermBlock *root, void EmulateGLFragColorBroadcast(TIntermBlock *root,
int maxDrawBuffers, int maxDrawBuffers,
std::vector<sh::OutputVariable> *outputVariables, std::vector<sh::OutputVariable> *outputVariables,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion) int shaderVersion)
{ {
ASSERT(maxDrawBuffers > 1); ASSERT(maxDrawBuffers > 1);
......
...@@ -24,7 +24,7 @@ class TSymbolTable; ...@@ -24,7 +24,7 @@ class TSymbolTable;
void EmulateGLFragColorBroadcast(TIntermBlock *root, void EmulateGLFragColorBroadcast(TIntermBlock *root,
int maxDrawBuffers, int maxDrawBuffers,
std::vector<OutputVariable> *outputVariables, std::vector<OutputVariable> *outputVariables,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion); int shaderVersion);
} }
......
...@@ -513,7 +513,7 @@ bool ParentConstructorTakesCareOfRounding(TIntermNode *parent, TIntermTyped *nod ...@@ -513,7 +513,7 @@ bool ParentConstructorTakesCareOfRounding(TIntermNode *parent, TIntermTyped *nod
} // namespace anonymous } // namespace anonymous
EmulatePrecision::EmulatePrecision(const TSymbolTable &symbolTable, int shaderVersion) EmulatePrecision::EmulatePrecision(TSymbolTable *symbolTable, int shaderVersion)
: TLValueTrackingTraverser(true, true, true, symbolTable, shaderVersion), : TLValueTrackingTraverser(true, true, true, symbolTable, shaderVersion),
mDeclaringVariables(false) mDeclaringVariables(false)
{ {
......
...@@ -24,7 +24,7 @@ namespace sh ...@@ -24,7 +24,7 @@ namespace sh
class EmulatePrecision : public TLValueTrackingTraverser class EmulatePrecision : public TLValueTrackingTraverser
{ {
public: public:
EmulatePrecision(const TSymbolTable &symbolTable, int shaderVersion); EmulatePrecision(TSymbolTable *symbolTable, int shaderVersion);
void visitSymbol(TIntermSymbol *node) override; void visitSymbol(TIntermSymbol *node) override;
bool visitBinary(Visit visit, TIntermBinary *node) override; bool visitBinary(Visit visit, TIntermBinary *node) override;
......
...@@ -22,10 +22,10 @@ namespace ...@@ -22,10 +22,10 @@ namespace
class Traverser : public TIntermTraverser class Traverser : public TIntermTraverser
{ {
public: public:
static void Apply(TIntermNode *root, TSymbolUniqueId *temporaryId); static void Apply(TIntermNode *root, TSymbolTable *symbolTable);
private: private:
Traverser(); Traverser(TSymbolTable *symbolTable);
bool visitAggregate(Visit visit, TIntermAggregate *node) override; bool visitAggregate(Visit visit, TIntermAggregate *node) override;
void nextIteration(); void nextIteration();
...@@ -33,10 +33,9 @@ class Traverser : public TIntermTraverser ...@@ -33,10 +33,9 @@ class Traverser : public TIntermTraverser
}; };
// static // static
void Traverser::Apply(TIntermNode *root, TSymbolUniqueId *temporaryId) void Traverser::Apply(TIntermNode *root, TSymbolTable *symbolTable)
{ {
Traverser traverser; Traverser traverser(symbolTable);
traverser.useTemporaryId(temporaryId);
do do
{ {
traverser.nextIteration(); traverser.nextIteration();
...@@ -48,7 +47,7 @@ void Traverser::Apply(TIntermNode *root, TSymbolUniqueId *temporaryId) ...@@ -48,7 +47,7 @@ void Traverser::Apply(TIntermNode *root, TSymbolUniqueId *temporaryId)
} while (traverser.mFound); } while (traverser.mFound);
} }
Traverser::Traverser() : TIntermTraverser(true, false, false) Traverser::Traverser(TSymbolTable *symbolTable) : TIntermTraverser(true, false, false, symbolTable)
{ {
} }
...@@ -146,9 +145,9 @@ bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -146,9 +145,9 @@ bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node)
} // anonymous namespace } // anonymous namespace
void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolUniqueId *temporaryId) void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolTable *symbolTable)
{ {
Traverser::Apply(root, temporaryId); Traverser::Apply(root, symbolTable);
} }
} // namespace sh } // namespace sh
...@@ -20,9 +20,9 @@ namespace sh ...@@ -20,9 +20,9 @@ namespace sh
{ {
class TIntermNode; class TIntermNode;
class TSymbolUniqueId; class TSymbolTable;
void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolUniqueId *temporaryId); void ExpandIntegerPowExpressions(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
......
...@@ -689,7 +689,7 @@ void InsertBuiltInFunctions(sh::GLenum type, ...@@ -689,7 +689,7 @@ void InsertBuiltInFunctions(sh::GLenum type,
fields->push_back(far); fields->push_back(far);
fields->push_back(diff); fields->push_back(diff);
TStructure *depthRangeStruct = TStructure *depthRangeStruct =
new TStructure(NewPoolTString("gl_DepthRangeParameters"), fields); new TStructure(&symbolTable, NewPoolTString("gl_DepthRangeParameters"), fields);
symbolTable.insertStructType(COMMON_BUILTINS, depthRangeStruct); symbolTable.insertStructType(COMMON_BUILTINS, depthRangeStruct);
TType depthRangeType(depthRangeStruct); TType depthRangeType(depthRangeStruct);
depthRangeType.setQualifier(EvqUniform); depthRangeType.setQualifier(EvqUniform);
......
...@@ -102,13 +102,17 @@ void TIntermBranch::traverse(TIntermTraverser *it) ...@@ -102,13 +102,17 @@ void TIntermBranch::traverse(TIntermTraverser *it)
it->traverseBranch(this); it->traverseBranch(this);
} }
TIntermTraverser::TIntermTraverser(bool preVisit, bool inVisit, bool postVisit) TIntermTraverser::TIntermTraverser(bool preVisit,
bool inVisit,
bool postVisit,
TSymbolTable *symbolTable)
: preVisit(preVisit), : preVisit(preVisit),
inVisit(inVisit), inVisit(inVisit),
postVisit(postVisit), postVisit(postVisit),
mDepth(-1), mDepth(-1),
mMaxDepth(0), mMaxDepth(0),
mInGlobalScope(true), mInGlobalScope(true),
mSymbolTable(symbolTable),
mTemporaryId(nullptr) mTemporaryId(nullptr)
{ {
} }
...@@ -218,15 +222,15 @@ TIntermBinary *TIntermTraverser::createTempAssignment(TIntermTyped *rightNode) ...@@ -218,15 +222,15 @@ TIntermBinary *TIntermTraverser::createTempAssignment(TIntermTyped *rightNode)
return assignment; return assignment;
} }
void TIntermTraverser::useTemporaryId(TSymbolUniqueId *temporaryId)
{
mTemporaryId = temporaryId;
}
void TIntermTraverser::nextTemporaryId() void TIntermTraverser::nextTemporaryId()
{ {
ASSERT(mTemporaryId != nullptr); ASSERT(mSymbolTable);
*mTemporaryId = TSymbolUniqueId(); if (!mTemporaryId)
{
mTemporaryId = new TSymbolUniqueId(mSymbolTable);
return;
}
*mTemporaryId = TSymbolUniqueId(mSymbolTable);
} }
void TLValueTrackingTraverser::addToFunctionMap(const TSymbolUniqueId &id, void TLValueTrackingTraverser::addToFunctionMap(const TSymbolUniqueId &id,
...@@ -716,14 +720,14 @@ void TIntermTraverser::queueReplacementWithParent(TIntermNode *parent, ...@@ -716,14 +720,14 @@ void TIntermTraverser::queueReplacementWithParent(TIntermNode *parent,
TLValueTrackingTraverser::TLValueTrackingTraverser(bool preVisit, TLValueTrackingTraverser::TLValueTrackingTraverser(bool preVisit,
bool inVisit, bool inVisit,
bool postVisit, bool postVisit,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion) int shaderVersion)
: TIntermTraverser(preVisit, inVisit, postVisit), : TIntermTraverser(preVisit, inVisit, postVisit, symbolTable),
mOperatorRequiresLValue(false), mOperatorRequiresLValue(false),
mInFunctionCallOutParameter(false), mInFunctionCallOutParameter(false),
mSymbolTable(symbolTable),
mShaderVersion(shaderVersion) mShaderVersion(shaderVersion)
{ {
ASSERT(symbolTable);
} }
void TLValueTrackingTraverser::traverseFunctionPrototype(TIntermFunctionPrototype *node) void TLValueTrackingTraverser::traverseFunctionPrototype(TIntermFunctionPrototype *node)
...@@ -796,7 +800,7 @@ void TLValueTrackingTraverser::traverseAggregate(TIntermAggregate *node) ...@@ -796,7 +800,7 @@ void TLValueTrackingTraverser::traverseAggregate(TIntermAggregate *node)
if (!node->isFunctionCall() && !node->isConstructor()) if (!node->isFunctionCall() && !node->isConstructor())
{ {
builtInFunc = static_cast<TFunction *>( builtInFunc = static_cast<TFunction *>(
mSymbolTable.findBuiltIn(node->getSymbolTableMangledName(), mShaderVersion)); mSymbolTable->findBuiltIn(node->getSymbolTableMangledName(), mShaderVersion));
} }
size_t paramIndex = 0; size_t paramIndex = 0;
......
...@@ -39,7 +39,10 @@ class TIntermTraverser : angle::NonCopyable ...@@ -39,7 +39,10 @@ class TIntermTraverser : angle::NonCopyable
{ {
public: public:
POOL_ALLOCATOR_NEW_DELETE(); POOL_ALLOCATOR_NEW_DELETE();
TIntermTraverser(bool preVisit, bool inVisit, bool postVisit); TIntermTraverser(bool preVisit,
bool inVisit,
bool postVisit,
TSymbolTable *symbolTable = nullptr);
virtual ~TIntermTraverser(); virtual ~TIntermTraverser();
virtual void visitSymbol(TIntermSymbol *node) {} virtual void visitSymbol(TIntermSymbol *node) {}
...@@ -99,9 +102,6 @@ class TIntermTraverser : angle::NonCopyable ...@@ -99,9 +102,6 @@ class TIntermTraverser : angle::NonCopyable
// this function after traversal to perform them. // this function after traversal to perform them.
void updateTree(); void updateTree();
// Start creating temporary symbols from the given temporary symbol index + 1.
void useTemporaryId(TSymbolUniqueId *temporaryId);
protected: protected:
// Should only be called from traverse*() functions // Should only be called from traverse*() functions
void incrementDepth(TIntermNode *current) void incrementDepth(TIntermNode *current)
...@@ -246,6 +246,8 @@ class TIntermTraverser : angle::NonCopyable ...@@ -246,6 +246,8 @@ class TIntermTraverser : angle::NonCopyable
std::vector<NodeReplaceWithMultipleEntry> mMultiReplacements; std::vector<NodeReplaceWithMultipleEntry> mMultiReplacements;
std::vector<NodeInsertMultipleEntry> mInsertions; std::vector<NodeInsertMultipleEntry> mInsertions;
TSymbolTable *mSymbolTable;
private: private:
static bool CompareInsertion(const NodeInsertMultipleEntry &a, static bool CompareInsertion(const NodeInsertMultipleEntry &a,
const NodeInsertMultipleEntry &b); const NodeInsertMultipleEntry &b);
...@@ -300,7 +302,7 @@ class TLValueTrackingTraverser : public TIntermTraverser ...@@ -300,7 +302,7 @@ class TLValueTrackingTraverser : public TIntermTraverser
TLValueTrackingTraverser(bool preVisit, TLValueTrackingTraverser(bool preVisit,
bool inVisit, bool inVisit,
bool postVisit, bool postVisit,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion); int shaderVersion);
virtual ~TLValueTrackingTraverser() {} virtual ~TLValueTrackingTraverser() {}
...@@ -345,7 +347,6 @@ class TLValueTrackingTraverser : public TIntermTraverser ...@@ -345,7 +347,6 @@ class TLValueTrackingTraverser : public TIntermTraverser
// Map from function symbol id values to their parameter sequences // Map from function symbol id values to their parameter sequences
TMap<int, TIntermSequence *> mFunctionMap; TMap<int, TIntermSequence *> mFunctionMap;
const TSymbolTable &mSymbolTable;
const int mShaderVersion; const int mShaderVersion;
}; };
......
...@@ -13,7 +13,7 @@ TOutputESSL::TOutputESSL(TInfoSinkBase &objSink, ...@@ -13,7 +13,7 @@ TOutputESSL::TOutputESSL(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy, ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
NameMap &nameMap, NameMap &nameMap,
TSymbolTable &symbolTable, TSymbolTable *symbolTable,
sh::GLenum shaderType, sh::GLenum shaderType,
int shaderVersion, int shaderVersion,
bool forceHighp, bool forceHighp,
......
...@@ -19,7 +19,7 @@ class TOutputESSL : public TOutputGLSLBase ...@@ -19,7 +19,7 @@ class TOutputESSL : public TOutputGLSLBase
ShArrayIndexClampingStrategy clampingStrategy, ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
NameMap &nameMap, NameMap &nameMap,
TSymbolTable &symbolTable, TSymbolTable *symbolTable,
sh::GLenum shaderType, sh::GLenum shaderType,
int shaderVersion, int shaderVersion,
bool forceHighp, bool forceHighp,
......
...@@ -15,7 +15,7 @@ TOutputGLSL::TOutputGLSL(TInfoSinkBase &objSink, ...@@ -15,7 +15,7 @@ TOutputGLSL::TOutputGLSL(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy, ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
NameMap &nameMap, NameMap &nameMap,
TSymbolTable &symbolTable, TSymbolTable *symbolTable,
sh::GLenum shaderType, sh::GLenum shaderType,
int shaderVersion, int shaderVersion,
ShShaderOutput output, ShShaderOutput output,
......
...@@ -19,7 +19,7 @@ class TOutputGLSL : public TOutputGLSLBase ...@@ -19,7 +19,7 @@ class TOutputGLSL : public TOutputGLSLBase
ShArrayIndexClampingStrategy clampingStrategy, ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
NameMap &nameMap, NameMap &nameMap,
TSymbolTable &symbolTable, TSymbolTable *symbolTable,
sh::GLenum shaderType, sh::GLenum shaderType,
int shaderVersion, int shaderVersion,
ShShaderOutput output, ShShaderOutput output,
......
...@@ -121,18 +121,17 @@ TOutputGLSLBase::TOutputGLSLBase(TInfoSinkBase &objSink, ...@@ -121,18 +121,17 @@ TOutputGLSLBase::TOutputGLSLBase(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy, ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
NameMap &nameMap, NameMap &nameMap,
TSymbolTable &symbolTable, TSymbolTable *symbolTable,
sh::GLenum shaderType, sh::GLenum shaderType,
int shaderVersion, int shaderVersion,
ShShaderOutput output, ShShaderOutput output,
ShCompileOptions compileOptions) ShCompileOptions compileOptions)
: TIntermTraverser(true, true, true), : TIntermTraverser(true, true, true, symbolTable),
mObjSink(objSink), mObjSink(objSink),
mDeclaringVariables(false), mDeclaringVariables(false),
mClampingStrategy(clampingStrategy), mClampingStrategy(clampingStrategy),
mHashFunction(hashFunction), mHashFunction(hashFunction),
mNameMap(nameMap), mNameMap(nameMap),
mSymbolTable(symbolTable),
mShaderType(shaderType), mShaderType(shaderType),
mShaderVersion(shaderVersion), mShaderVersion(shaderVersion),
mOutput(output), mOutput(output),
...@@ -600,7 +599,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node) ...@@ -600,7 +599,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node)
const TField *field = structure->fields()[index->getIConst(0)]; const TField *field = structure->fields()[index->getIConst(0)];
TString fieldName = field->name(); TString fieldName = field->name();
if (!mSymbolTable.findBuiltIn(structure->name(), mShaderVersion)) if (!mSymbolTable->findBuiltIn(structure->name(), mShaderVersion))
fieldName = hashName(TName(fieldName)); fieldName = hashName(TName(fieldName));
out << fieldName; out << fieldName;
...@@ -617,7 +616,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node) ...@@ -617,7 +616,7 @@ bool TOutputGLSLBase::visitBinary(Visit visit, TIntermBinary *node)
const TField *field = interfaceBlock->fields()[index->getIConst(0)]; const TField *field = interfaceBlock->fields()[index->getIConst(0)];
TString fieldName = field->name(); TString fieldName = field->name();
ASSERT(!mSymbolTable.findBuiltIn(interfaceBlock->name(), mShaderVersion)); ASSERT(!mSymbolTable->findBuiltIn(interfaceBlock->name(), mShaderVersion));
fieldName = hashName(TName(fieldName)); fieldName = hashName(TName(fieldName));
out << fieldName; out << fieldName;
...@@ -1168,7 +1167,7 @@ TString TOutputGLSLBase::hashName(const TName &name) ...@@ -1168,7 +1167,7 @@ TString TOutputGLSLBase::hashName(const TName &name)
TString TOutputGLSLBase::hashVariableName(const TName &name) TString TOutputGLSLBase::hashVariableName(const TName &name)
{ {
if (mSymbolTable.findBuiltIn(name.getString(), mShaderVersion) != nullptr) if (mSymbolTable->findBuiltIn(name.getString(), mShaderVersion) != nullptr)
{ {
if (mCompileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM && if (mCompileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM &&
name.getString() == "gl_ViewID_OVR") name.getString() == "gl_ViewID_OVR")
......
...@@ -23,7 +23,7 @@ class TOutputGLSLBase : public TIntermTraverser ...@@ -23,7 +23,7 @@ class TOutputGLSLBase : public TIntermTraverser
ShArrayIndexClampingStrategy clampingStrategy, ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
NameMap &nameMap, NameMap &nameMap,
TSymbolTable &symbolTable, TSymbolTable *symbolTable,
sh::GLenum shaderType, sh::GLenum shaderType,
int shaderVersion, int shaderVersion,
ShShaderOutput output, ShShaderOutput output,
...@@ -100,8 +100,6 @@ class TOutputGLSLBase : public TIntermTraverser ...@@ -100,8 +100,6 @@ class TOutputGLSLBase : public TIntermTraverser
NameMap &mNameMap; NameMap &mNameMap;
TSymbolTable &mSymbolTable;
sh::GLenum mShaderType; sh::GLenum mShaderType;
const int mShaderVersion; const int mShaderVersion;
......
...@@ -18,7 +18,7 @@ TOutputVulkanGLSL::TOutputVulkanGLSL(TInfoSinkBase &objSink, ...@@ -18,7 +18,7 @@ TOutputVulkanGLSL::TOutputVulkanGLSL(TInfoSinkBase &objSink,
ShArrayIndexClampingStrategy clampingStrategy, ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
NameMap &nameMap, NameMap &nameMap,
TSymbolTable &symbolTable, TSymbolTable *symbolTable,
sh::GLenum shaderType, sh::GLenum shaderType,
int shaderVersion, int shaderVersion,
ShShaderOutput output, ShShaderOutput output,
......
...@@ -21,7 +21,7 @@ class TOutputVulkanGLSL : public TOutputGLSLBase ...@@ -21,7 +21,7 @@ class TOutputVulkanGLSL : public TOutputGLSLBase
ShArrayIndexClampingStrategy clampingStrategy, ShArrayIndexClampingStrategy clampingStrategy,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
NameMap &nameMap, NameMap &nameMap,
TSymbolTable &symbolTable, TSymbolTable *symbolTable,
sh::GLenum shaderType, sh::GLenum shaderType,
int shaderVersion, int shaderVersion,
ShShaderOutput output, ShShaderOutput output,
......
...@@ -3080,13 +3080,13 @@ TFunction *TParseContext::parseFunctionHeader(const TPublicType &type, ...@@ -3080,13 +3080,13 @@ TFunction *TParseContext::parseFunctionHeader(const TPublicType &type,
} }
// Add the function as a prototype after parsing it (we do not support recursion) // Add the function as a prototype after parsing it (we do not support recursion)
return new TFunction(name, new TType(type)); return new TFunction(&symbolTable, name, new TType(type));
} }
TFunction *TParseContext::addNonConstructorFunc(const TString *name, const TSourceLoc &loc) TFunction *TParseContext::addNonConstructorFunc(const TString *name, const TSourceLoc &loc)
{ {
const TType *returnType = TCache::getType(EbtVoid, EbpUndefined); const TType *returnType = TCache::getType(EbtVoid, EbpUndefined);
return new TFunction(name, returnType); return new TFunction(&symbolTable, name, returnType);
} }
TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType) TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType)
...@@ -3110,7 +3110,7 @@ TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType) ...@@ -3110,7 +3110,7 @@ TFunction *TParseContext::addConstructorFunc(const TPublicType &publicType)
type->setBasicType(EbtFloat); type->setBasicType(EbtFloat);
} }
return new TFunction(nullptr, type, EOpConstruct); return new TFunction(&symbolTable, nullptr, type, EOpConstruct);
} }
TParameter TParseContext::parseParameterDeclarator(const TPublicType &publicType, TParameter TParseContext::parseParameterDeclarator(const TPublicType &publicType,
...@@ -4143,7 +4143,7 @@ TTypeSpecifierNonArray TParseContext::addStructure(const TSourceLoc &structLine, ...@@ -4143,7 +4143,7 @@ TTypeSpecifierNonArray TParseContext::addStructure(const TSourceLoc &structLine,
const TString *structName, const TString *structName,
TFieldList *fieldList) TFieldList *fieldList)
{ {
TStructure *structure = new TStructure(structName, fieldList); TStructure *structure = new TStructure(&symbolTable, structName, fieldList);
// Store a bool in the struct if we're at global scope, to allow us to // Store a bool in the struct if we're at global scope, to allow us to
// skip the local struct scoping workaround in HLSL. // skip the local struct scoping workaround in HLSL.
......
...@@ -28,7 +28,7 @@ namespace ...@@ -28,7 +28,7 @@ namespace
class RecordConstantPrecisionTraverser : public TIntermTraverser class RecordConstantPrecisionTraverser : public TIntermTraverser
{ {
public: public:
RecordConstantPrecisionTraverser(); RecordConstantPrecisionTraverser(TSymbolTable *symbolTable);
void visitConstantUnion(TIntermConstantUnion *node) override; void visitConstantUnion(TIntermConstantUnion *node) override;
...@@ -41,8 +41,8 @@ class RecordConstantPrecisionTraverser : public TIntermTraverser ...@@ -41,8 +41,8 @@ class RecordConstantPrecisionTraverser : public TIntermTraverser
bool mFoundHigherPrecisionConstant; bool mFoundHigherPrecisionConstant;
}; };
RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser() RecordConstantPrecisionTraverser::RecordConstantPrecisionTraverser(TSymbolTable *symbolTable)
: TIntermTraverser(true, false, true), mFoundHigherPrecisionConstant(false) : TIntermTraverser(true, false, true, symbolTable), mFoundHigherPrecisionConstant(false)
{ {
} }
...@@ -151,11 +151,9 @@ void RecordConstantPrecisionTraverser::nextIteration() ...@@ -151,11 +151,9 @@ void RecordConstantPrecisionTraverser::nextIteration()
} // namespace } // namespace
void RecordConstantPrecision(TIntermNode *root, TSymbolUniqueId *temporaryId) void RecordConstantPrecision(TIntermNode *root, TSymbolTable *symbolTable)
{ {
RecordConstantPrecisionTraverser traverser; RecordConstantPrecisionTraverser traverser(symbolTable);
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
// Iterate as necessary, and reset the traverser between iterations. // Iterate as necessary, and reset the traverser between iterations.
do do
{ {
......
...@@ -20,9 +20,9 @@ ...@@ -20,9 +20,9 @@
namespace sh namespace sh
{ {
class TIntermNode; class TIntermNode;
class TSymbolUniqueId; class TSymbolTable;
void RecordConstantPrecision(TIntermNode *root, TSymbolUniqueId *temporaryId); void RecordConstantPrecision(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
#endif // COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_ #endif // COMPILER_TRANSLATOR_RECORDCONSTANTPRECISION_H_
...@@ -19,7 +19,7 @@ void RegenerateStructNames::visitSymbol(TIntermSymbol *symbol) ...@@ -19,7 +19,7 @@ void RegenerateStructNames::visitSymbol(TIntermSymbol *symbol)
if (!userType) if (!userType)
return; return;
if (mSymbolTable.findBuiltIn(userType->name(), mShaderVersion)) if (mSymbolTable->findBuiltIn(userType->name(), mShaderVersion))
{ {
// Built-in struct, do not touch it. // Built-in struct, do not touch it.
return; return;
......
...@@ -18,9 +18,8 @@ namespace sh ...@@ -18,9 +18,8 @@ namespace sh
class RegenerateStructNames : public TIntermTraverser class RegenerateStructNames : public TIntermTraverser
{ {
public: public:
RegenerateStructNames(const TSymbolTable &symbolTable, int shaderVersion) RegenerateStructNames(TSymbolTable *symbolTable, int shaderVersion)
: TIntermTraverser(true, false, false), : TIntermTraverser(true, false, false, symbolTable),
mSymbolTable(symbolTable),
mShaderVersion(shaderVersion), mShaderVersion(shaderVersion),
mScopeDepth(0) mScopeDepth(0)
{ {
...@@ -31,7 +30,6 @@ class RegenerateStructNames : public TIntermTraverser ...@@ -31,7 +30,6 @@ class RegenerateStructNames : public TIntermTraverser
bool visitBlock(Visit, TIntermBlock *block) override; bool visitBlock(Visit, TIntermBlock *block) override;
private: private:
const TSymbolTable &mSymbolTable;
int mShaderVersion; int mShaderVersion;
// Indicating the depth of the current scope. // Indicating the depth of the current scope.
......
...@@ -291,7 +291,7 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type, ...@@ -291,7 +291,7 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type,
class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser
{ {
public: public:
RemoveDynamicIndexingTraverser(const TSymbolTable &symbolTable, int shaderVersion); RemoveDynamicIndexingTraverser(TSymbolTable *symbolTable, int shaderVersion);
bool visitBinary(Visit visit, TIntermBinary *node) override; bool visitBinary(Visit visit, TIntermBinary *node) override;
...@@ -305,8 +305,8 @@ class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser ...@@ -305,8 +305,8 @@ class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser
// Maps of types that are indexed to the indexing function ids used for them. Note that these // Maps of types that are indexed to the indexing function ids used for them. Note that these
// can not store multiple variants of the same type with different precisions - only one // can not store multiple variants of the same type with different precisions - only one
// precision gets stored. // precision gets stored.
std::map<TType, TSymbolUniqueId> mIndexedVecAndMatrixTypes; std::map<TType, TSymbolUniqueId *> mIndexedVecAndMatrixTypes;
std::map<TType, TSymbolUniqueId> mWrittenVecAndMatrixTypes; std::map<TType, TSymbolUniqueId *> mWrittenVecAndMatrixTypes;
bool mUsedTreeInsertion; bool mUsedTreeInsertion;
...@@ -317,7 +317,7 @@ class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser ...@@ -317,7 +317,7 @@ class RemoveDynamicIndexingTraverser : public TLValueTrackingTraverser
bool mRemoveIndexSideEffectsInSubtree; bool mRemoveIndexSideEffectsInSubtree;
}; };
RemoveDynamicIndexingTraverser::RemoveDynamicIndexingTraverser(const TSymbolTable &symbolTable, RemoveDynamicIndexingTraverser::RemoveDynamicIndexingTraverser(TSymbolTable *symbolTable,
int shaderVersion) int shaderVersion)
: TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion), : TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion),
mUsedTreeInsertion(false), mUsedTreeInsertion(false),
...@@ -332,11 +332,11 @@ void RemoveDynamicIndexingTraverser::insertHelperDefinitions(TIntermNode *root) ...@@ -332,11 +332,11 @@ void RemoveDynamicIndexingTraverser::insertHelperDefinitions(TIntermNode *root)
TIntermSequence insertions; TIntermSequence insertions;
for (auto &type : mIndexedVecAndMatrixTypes) for (auto &type : mIndexedVecAndMatrixTypes)
{ {
insertions.push_back(GetIndexFunctionDefinition(type.first, false, type.second)); insertions.push_back(GetIndexFunctionDefinition(type.first, false, *type.second));
} }
for (auto &type : mWrittenVecAndMatrixTypes) for (auto &type : mWrittenVecAndMatrixTypes)
{ {
insertions.push_back(GetIndexFunctionDefinition(type.first, true, type.second)); insertions.push_back(GetIndexFunctionDefinition(type.first, true, *type.second));
} }
mInsertions.push_back(NodeInsertMultipleEntry(rootBlock, 0, insertions, TIntermSequence())); mInsertions.push_back(NodeInsertMultipleEntry(rootBlock, 0, insertions, TIntermSequence()));
} }
...@@ -417,7 +417,7 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod ...@@ -417,7 +417,7 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod
#endif #endif
const TType &type = node->getLeft()->getType(); const TType &type = node->getLeft()->getType();
TSymbolUniqueId indexingFunctionId; TSymbolUniqueId *indexingFunctionId = new TSymbolUniqueId(mSymbolTable);
if (mIndexedVecAndMatrixTypes.find(type) == mIndexedVecAndMatrixTypes.end()) if (mIndexedVecAndMatrixTypes.find(type) == mIndexedVecAndMatrixTypes.end())
{ {
mIndexedVecAndMatrixTypes[type] = indexingFunctionId; mIndexedVecAndMatrixTypes[type] = indexingFunctionId;
...@@ -459,7 +459,7 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod ...@@ -459,7 +459,7 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod
// TODO(oetuaho@nvidia.com): This is not optimal if the expression using the value // TODO(oetuaho@nvidia.com): This is not optimal if the expression using the value
// only writes it and doesn't need the previous value. http://anglebug.com/1116 // only writes it and doesn't need the previous value. http://anglebug.com/1116
TSymbolUniqueId indexedWriteFunctionId; TSymbolUniqueId *indexedWriteFunctionId = new TSymbolUniqueId(mSymbolTable);
if (mWrittenVecAndMatrixTypes.find(type) == mWrittenVecAndMatrixTypes.end()) if (mWrittenVecAndMatrixTypes.find(type) == mWrittenVecAndMatrixTypes.end())
{ {
mWrittenVecAndMatrixTypes[type] = indexedWriteFunctionId; mWrittenVecAndMatrixTypes[type] = indexedWriteFunctionId;
...@@ -484,14 +484,14 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod ...@@ -484,14 +484,14 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod
TIntermSymbol *tempIndex = createTempSymbol(indexInitializer->getType()); TIntermSymbol *tempIndex = createTempSymbol(indexInitializer->getType());
TIntermAggregate *indexingCall = TIntermAggregate *indexingCall =
CreateIndexFunctionCall(node, tempIndex, indexingFunctionId); CreateIndexFunctionCall(node, tempIndex, *indexingFunctionId);
nextTemporaryId(); // From now on, creating temporary symbols that refer to the nextTemporaryId(); // From now on, creating temporary symbols that refer to the
// field value. // field value.
insertionsBefore.push_back(createTempInitDeclaration(indexingCall)); insertionsBefore.push_back(createTempInitDeclaration(indexingCall));
TIntermAggregate *indexedWriteCall = CreateIndexedWriteFunctionCall( TIntermAggregate *indexedWriteCall = CreateIndexedWriteFunctionCall(
node, tempIndex, createTempSymbol(fieldType), indexedWriteFunctionId); node, tempIndex, createTempSymbol(fieldType), *indexedWriteFunctionId);
insertionsAfter.push_back(indexedWriteCall); insertionsAfter.push_back(indexedWriteCall);
insertStatementsInParentBlock(insertionsBefore, insertionsAfter); insertStatementsInParentBlock(insertionsBefore, insertionsAfter);
queueReplacement(createTempSymbol(fieldType), OriginalNode::IS_DROPPED); queueReplacement(createTempSymbol(fieldType), OriginalNode::IS_DROPPED);
...@@ -506,7 +506,7 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod ...@@ -506,7 +506,7 @@ bool RemoveDynamicIndexingTraverser::visitBinary(Visit visit, TIntermBinary *nod
// If the index_expr is unsigned, we'll convert it to signed. // If the index_expr is unsigned, we'll convert it to signed.
ASSERT(!mRemoveIndexSideEffectsInSubtree); ASSERT(!mRemoveIndexSideEffectsInSubtree);
TIntermAggregate *indexingCall = CreateIndexFunctionCall( TIntermAggregate *indexingCall = CreateIndexFunctionCall(
node, EnsureSignedInt(node->getRight()), indexingFunctionId); node, EnsureSignedInt(node->getRight()), *indexingFunctionId);
queueReplacement(indexingCall, OriginalNode::IS_DROPPED); queueReplacement(indexingCall, OriginalNode::IS_DROPPED);
} }
} }
...@@ -523,14 +523,9 @@ void RemoveDynamicIndexingTraverser::nextIteration() ...@@ -523,14 +523,9 @@ void RemoveDynamicIndexingTraverser::nextIteration()
} // namespace } // namespace
void RemoveDynamicIndexing(TIntermNode *root, void RemoveDynamicIndexing(TIntermNode *root, TSymbolTable *symbolTable, int shaderVersion)
TSymbolUniqueId *temporaryId,
const TSymbolTable &symbolTable,
int shaderVersion)
{ {
RemoveDynamicIndexingTraverser traverser(symbolTable, shaderVersion); RemoveDynamicIndexingTraverser traverser(symbolTable, shaderVersion);
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
do do
{ {
traverser.nextIteration(); traverser.nextIteration();
......
...@@ -15,12 +15,8 @@ namespace sh ...@@ -15,12 +15,8 @@ namespace sh
class TIntermNode; class TIntermNode;
class TSymbolTable; class TSymbolTable;
class TSymbolUniqueId;
void RemoveDynamicIndexing(TIntermNode *root, void RemoveDynamicIndexing(TIntermNode *root, TSymbolTable *symbolTable, int shaderVersion);
TSymbolUniqueId *temporaryId,
const TSymbolTable &symbolTable,
int shaderVersion);
} // namespace sh } // namespace sh
......
...@@ -44,7 +44,7 @@ namespace ...@@ -44,7 +44,7 @@ namespace
class DoWhileRewriter : public TIntermTraverser class DoWhileRewriter : public TIntermTraverser
{ {
public: public:
DoWhileRewriter() : TIntermTraverser(true, false, false) {} DoWhileRewriter(const TSymbolTable *symbolTable) : TIntermTraverser(true, false, false) {}
bool visitBlock(Visit, TIntermBlock *node) override bool visitBlock(Visit, TIntermBlock *node) override
{ {
...@@ -146,12 +146,9 @@ class DoWhileRewriter : public TIntermTraverser ...@@ -146,12 +146,9 @@ class DoWhileRewriter : public TIntermTraverser
} // anonymous namespace } // anonymous namespace
void RewriteDoWhile(TIntermNode *root, TSymbolUniqueId *temporaryId) void RewriteDoWhile(TIntermNode *root, TSymbolTable *symbolTable)
{ {
ASSERT(temporaryId != 0); DoWhileRewriter rewriter(symbolTable);
DoWhileRewriter rewriter;
rewriter.useTemporaryId(temporaryId);
root->traverse(&rewriter); root->traverse(&rewriter);
} }
......
...@@ -14,9 +14,9 @@ namespace sh ...@@ -14,9 +14,9 @@ namespace sh
{ {
class TIntermNode; class TIntermNode;
class TSymbolUniqueId; class TSymbolTable;
void RewriteDoWhile(TIntermNode *root, TSymbolUniqueId *temporaryId); void RewriteDoWhile(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "compiler/translator/RewriteElseBlocks.h" #include "compiler/translator/RewriteElseBlocks.h"
#include "compiler/translator/IntermNode.h"
#include "compiler/translator/IntermNode_util.h" #include "compiler/translator/IntermNode_util.h"
#include "compiler/translator/NodeSearch.h" #include "compiler/translator/NodeSearch.h"
#include "compiler/translator/SymbolTable.h" #include "compiler/translator/SymbolTable.h"
...@@ -22,19 +23,20 @@ namespace ...@@ -22,19 +23,20 @@ namespace
class ElseBlockRewriter : public TIntermTraverser class ElseBlockRewriter : public TIntermTraverser
{ {
public: public:
ElseBlockRewriter(); ElseBlockRewriter(TSymbolTable *symbolTable);
protected: protected:
bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *aggregate) override; bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *aggregate) override;
bool visitBlock(Visit visit, TIntermBlock *block) override; bool visitBlock(Visit visit, TIntermBlock *block) override;
private: private:
const TType *mFunctionType;
TIntermNode *rewriteIfElse(TIntermIfElse *ifElse); TIntermNode *rewriteIfElse(TIntermIfElse *ifElse);
const TType *mFunctionType;
}; };
ElseBlockRewriter::ElseBlockRewriter() : TIntermTraverser(true, false, true), mFunctionType(nullptr) ElseBlockRewriter::ElseBlockRewriter(TSymbolTable *symbolTable)
: TIntermTraverser(true, false, true, symbolTable), mFunctionType(nullptr)
{ {
} }
...@@ -109,10 +111,9 @@ TIntermNode *ElseBlockRewriter::rewriteIfElse(TIntermIfElse *ifElse) ...@@ -109,10 +111,9 @@ TIntermNode *ElseBlockRewriter::rewriteIfElse(TIntermIfElse *ifElse)
} // anonymous namespace } // anonymous namespace
void RewriteElseBlocks(TIntermNode *node, TSymbolUniqueId *temporaryId) void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable)
{ {
ElseBlockRewriter rewriter; ElseBlockRewriter rewriter(symbolTable);
rewriter.useTemporaryId(temporaryId);
node->traverse(&rewriter); node->traverse(&rewriter);
} }
......
...@@ -10,12 +10,13 @@ ...@@ -10,12 +10,13 @@
#ifndef COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_ #ifndef COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_
#define COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_ #define COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_
#include "compiler/translator/IntermNode.h"
namespace sh namespace sh
{ {
void RewriteElseBlocks(TIntermNode *node, TSymbolUniqueId *temporaryId); class TIntermNode;
class TSymbolTable;
void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable);
} }
#endif // COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_ #endif // COMPILER_TRANSLATOR_REWRITEELSEBLOCKS_H_
...@@ -60,10 +60,13 @@ bool ContainsReturn(TIntermNode *node) ...@@ -60,10 +60,13 @@ bool ContainsReturn(TIntermNode *node)
return traverser.containsReturn(); return traverser.containsReturn();
} }
void WrapMainAndAppend(TIntermBlock *root, TIntermFunctionDefinition *main, TIntermNode *codeToRun) void WrapMainAndAppend(TIntermBlock *root,
TIntermFunctionDefinition *main,
TIntermNode *codeToRun,
TSymbolTable *symbolTable)
{ {
// Replace main() with main0() with the same body. // Replace main() with main0() with the same body.
TSymbolUniqueId oldMainId; TSymbolUniqueId oldMainId(symbolTable);
std::stringstream oldMainName; std::stringstream oldMainName;
oldMainName << "main" << oldMainId.get(); oldMainName << "main" << oldMainId.get();
TIntermFunctionDefinition *oldMain = CreateInternalFunctionDefinitionNode( TIntermFunctionDefinition *oldMain = CreateInternalFunctionDefinitionNode(
...@@ -94,7 +97,7 @@ void WrapMainAndAppend(TIntermBlock *root, TIntermFunctionDefinition *main, TInt ...@@ -94,7 +97,7 @@ void WrapMainAndAppend(TIntermBlock *root, TIntermFunctionDefinition *main, TInt
} // anonymous namespace } // anonymous namespace
void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun) void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun, TSymbolTable *symbolTable)
{ {
TIntermFunctionDefinition *main = FindMain(root); TIntermFunctionDefinition *main = FindMain(root);
if (!ContainsReturn(main)) if (!ContainsReturn(main))
...@@ -103,7 +106,7 @@ void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun) ...@@ -103,7 +106,7 @@ void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun)
return; return;
} }
WrapMainAndAppend(root, main, codeToRun); WrapMainAndAppend(root, main, codeToRun, symbolTable);
} }
} // namespace sh } // namespace sh
...@@ -14,8 +14,9 @@ namespace sh ...@@ -14,8 +14,9 @@ namespace sh
class TIntermBlock; class TIntermBlock;
class TIntermNode; class TIntermNode;
class TSymbolTable;
void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun); void RunAtTheEndOfShader(TIntermBlock *root, TIntermNode *codeToRun, TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
......
...@@ -63,12 +63,11 @@ class ScalarizeArgsTraverser : public TIntermTraverser ...@@ -63,12 +63,11 @@ class ScalarizeArgsTraverser : public TIntermTraverser
public: public:
ScalarizeArgsTraverser(sh::GLenum shaderType, ScalarizeArgsTraverser(sh::GLenum shaderType,
bool fragmentPrecisionHigh, bool fragmentPrecisionHigh,
TSymbolUniqueId *temporaryId) TSymbolTable *symbolTable)
: TIntermTraverser(true, false, false), : TIntermTraverser(true, false, false, symbolTable),
mShaderType(shaderType), mShaderType(shaderType),
mFragmentPrecisionHigh(fragmentPrecisionHigh) mFragmentPrecisionHigh(fragmentPrecisionHigh)
{ {
useTemporaryId(temporaryId);
} }
protected: protected:
...@@ -230,9 +229,9 @@ void ScalarizeArgsTraverser::createTempVariable(TIntermTyped *original) ...@@ -230,9 +229,9 @@ void ScalarizeArgsTraverser::createTempVariable(TIntermTyped *original)
void ScalarizeVecAndMatConstructorArgs(TIntermBlock *root, void ScalarizeVecAndMatConstructorArgs(TIntermBlock *root,
sh::GLenum shaderType, sh::GLenum shaderType,
bool fragmentPrecisionHigh, bool fragmentPrecisionHigh,
TSymbolUniqueId *temporaryId) TSymbolTable *symbolTable)
{ {
ScalarizeArgsTraverser scalarizer(shaderType, fragmentPrecisionHigh, temporaryId); ScalarizeArgsTraverser scalarizer(shaderType, fragmentPrecisionHigh, symbolTable);
root->traverse(&scalarizer); root->traverse(&scalarizer);
} }
......
...@@ -16,12 +16,12 @@ ...@@ -16,12 +16,12 @@
namespace sh namespace sh
{ {
class TIntermBlock; class TIntermBlock;
class TSymbolUniqueId; class TSymbolTable;
void ScalarizeVecAndMatConstructorArgs(TIntermBlock *root, void ScalarizeVecAndMatConstructorArgs(TIntermBlock *root,
sh::GLenum shaderType, sh::GLenum shaderType,
bool fragmentPrecisionHigh, bool fragmentPrecisionHigh,
TSymbolUniqueId *temporaryId); TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
#endif // COMPILER_TRANSLATOR_SCALARIZEVECANDMATCONSTRUCTORARGS_H_ #endif // COMPILER_TRANSLATOR_SCALARIZEVECANDMATCONSTRUCTORARGS_H_
...@@ -24,7 +24,7 @@ namespace ...@@ -24,7 +24,7 @@ namespace
class SeparateExpressionsTraverser : public TIntermTraverser class SeparateExpressionsTraverser : public TIntermTraverser
{ {
public: public:
SeparateExpressionsTraverser(); SeparateExpressionsTraverser(TSymbolTable *symbolTable);
bool visitBinary(Visit visit, TIntermBinary *node) override; bool visitBinary(Visit visit, TIntermBinary *node) override;
bool visitAggregate(Visit visit, TIntermAggregate *node) override; bool visitAggregate(Visit visit, TIntermAggregate *node) override;
...@@ -40,8 +40,8 @@ class SeparateExpressionsTraverser : public TIntermTraverser ...@@ -40,8 +40,8 @@ class SeparateExpressionsTraverser : public TIntermTraverser
IntermNodePatternMatcher mPatternToSeparateMatcher; IntermNodePatternMatcher mPatternToSeparateMatcher;
}; };
SeparateExpressionsTraverser::SeparateExpressionsTraverser() SeparateExpressionsTraverser::SeparateExpressionsTraverser(TSymbolTable *symbolTable)
: TIntermTraverser(true, false, false), : TIntermTraverser(true, false, false, symbolTable),
mFoundArrayExpression(false), mFoundArrayExpression(false),
mPatternToSeparateMatcher(IntermNodePatternMatcher::kExpressionReturningArray) mPatternToSeparateMatcher(IntermNodePatternMatcher::kExpressionReturningArray)
{ {
...@@ -110,11 +110,9 @@ void SeparateExpressionsTraverser::nextIteration() ...@@ -110,11 +110,9 @@ void SeparateExpressionsTraverser::nextIteration()
} // namespace } // namespace
void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolUniqueId *temporaryId) void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolTable *symbolTable)
{ {
SeparateExpressionsTraverser traverser; SeparateExpressionsTraverser traverser(symbolTable);
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
// Separate one expression at a time, and reset the traverser between iterations. // Separate one expression at a time, and reset the traverser between iterations.
do do
{ {
......
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
namespace sh namespace sh
{ {
class TIntermNode; class TIntermNode;
class TSymbolUniqueId; class TSymbolTable;
void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolUniqueId *temporaryId); void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
#endif // COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_ #endif // COMPILER_TRANSLATOR_SEPARATEEXPRESSIONSRETURNINGARRAYS_H_
...@@ -24,7 +24,7 @@ class SimplifyLoopConditionsTraverser : public TLValueTrackingTraverser ...@@ -24,7 +24,7 @@ class SimplifyLoopConditionsTraverser : public TLValueTrackingTraverser
{ {
public: public:
SimplifyLoopConditionsTraverser(unsigned int conditionsToSimplifyMask, SimplifyLoopConditionsTraverser(unsigned int conditionsToSimplifyMask,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion); int shaderVersion);
void traverseLoop(TIntermLoop *node) override; void traverseLoop(TIntermLoop *node) override;
...@@ -46,7 +46,7 @@ class SimplifyLoopConditionsTraverser : public TLValueTrackingTraverser ...@@ -46,7 +46,7 @@ class SimplifyLoopConditionsTraverser : public TLValueTrackingTraverser
SimplifyLoopConditionsTraverser::SimplifyLoopConditionsTraverser( SimplifyLoopConditionsTraverser::SimplifyLoopConditionsTraverser(
unsigned int conditionsToSimplifyMask, unsigned int conditionsToSimplifyMask,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion) int shaderVersion)
: TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion), : TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion),
mFoundLoopToChange(false), mFoundLoopToChange(false),
...@@ -276,13 +276,10 @@ void SimplifyLoopConditionsTraverser::traverseLoop(TIntermLoop *node) ...@@ -276,13 +276,10 @@ void SimplifyLoopConditionsTraverser::traverseLoop(TIntermLoop *node)
void SimplifyLoopConditions(TIntermNode *root, void SimplifyLoopConditions(TIntermNode *root,
unsigned int conditionsToSimplifyMask, unsigned int conditionsToSimplifyMask,
TSymbolUniqueId *temporaryId, TSymbolTable *symbolTable,
const TSymbolTable &symbolTable,
int shaderVersion) int shaderVersion)
{ {
SimplifyLoopConditionsTraverser traverser(conditionsToSimplifyMask, symbolTable, shaderVersion); SimplifyLoopConditionsTraverser traverser(conditionsToSimplifyMask, symbolTable, shaderVersion);
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
root->traverse(&traverser); root->traverse(&traverser);
traverser.updateTree(); traverser.updateTree();
} }
......
...@@ -15,12 +15,10 @@ namespace sh ...@@ -15,12 +15,10 @@ namespace sh
{ {
class TIntermNode; class TIntermNode;
class TSymbolTable; class TSymbolTable;
class TSymbolUniqueId;
void SimplifyLoopConditions(TIntermNode *root, void SimplifyLoopConditions(TIntermNode *root,
unsigned int conditionsToSimplify, unsigned int conditionsToSimplify,
TSymbolUniqueId *temporaryId, TSymbolTable *symbolTable,
const TSymbolTable &symbolTable,
int shaderVersion); int shaderVersion);
} // namespace sh } // namespace sh
......
...@@ -24,7 +24,7 @@ class SplitSequenceOperatorTraverser : public TLValueTrackingTraverser ...@@ -24,7 +24,7 @@ class SplitSequenceOperatorTraverser : public TLValueTrackingTraverser
{ {
public: public:
SplitSequenceOperatorTraverser(unsigned int patternsToSplitMask, SplitSequenceOperatorTraverser(unsigned int patternsToSplitMask,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion); int shaderVersion);
bool visitBinary(Visit visit, TIntermBinary *node) override; bool visitBinary(Visit visit, TIntermBinary *node) override;
...@@ -44,7 +44,7 @@ class SplitSequenceOperatorTraverser : public TLValueTrackingTraverser ...@@ -44,7 +44,7 @@ class SplitSequenceOperatorTraverser : public TLValueTrackingTraverser
}; };
SplitSequenceOperatorTraverser::SplitSequenceOperatorTraverser(unsigned int patternsToSplitMask, SplitSequenceOperatorTraverser::SplitSequenceOperatorTraverser(unsigned int patternsToSplitMask,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion) int shaderVersion)
: TLValueTrackingTraverser(true, false, true, symbolTable, shaderVersion), : TLValueTrackingTraverser(true, false, true, symbolTable, shaderVersion),
mFoundExpressionToSplit(false), mFoundExpressionToSplit(false),
...@@ -138,13 +138,10 @@ bool SplitSequenceOperatorTraverser::visitTernary(Visit visit, TIntermTernary *n ...@@ -138,13 +138,10 @@ bool SplitSequenceOperatorTraverser::visitTernary(Visit visit, TIntermTernary *n
void SplitSequenceOperator(TIntermNode *root, void SplitSequenceOperator(TIntermNode *root,
int patternsToSplitMask, int patternsToSplitMask,
TSymbolUniqueId *temporaryId, TSymbolTable *symbolTable,
const TSymbolTable &symbolTable,
int shaderVersion) int shaderVersion)
{ {
SplitSequenceOperatorTraverser traverser(patternsToSplitMask, symbolTable, shaderVersion); SplitSequenceOperatorTraverser traverser(patternsToSplitMask, symbolTable, shaderVersion);
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
// Separate one expression at a time, and reset the traverser between iterations. // Separate one expression at a time, and reset the traverser between iterations.
do do
{ {
......
...@@ -17,12 +17,10 @@ namespace sh ...@@ -17,12 +17,10 @@ namespace sh
class TIntermNode; class TIntermNode;
class TSymbolTable; class TSymbolTable;
class TSymbolUniqueId;
void SplitSequenceOperator(TIntermNode *root, void SplitSequenceOperator(TIntermNode *root,
int patternsToSplitMask, int patternsToSplitMask,
TSymbolUniqueId *temporaryId, TSymbolTable *symbolTable,
const TSymbolTable &symbolTable,
int shaderVersion); int shaderVersion);
} // namespace sh } // namespace sh
......
...@@ -29,9 +29,7 @@ static const char kFunctionMangledNameSeparator = '('; ...@@ -29,9 +29,7 @@ static const char kFunctionMangledNameSeparator = '(';
} // anonymous namespace } // anonymous namespace
int TSymbolTable::uniqueIdCounter = 0; TSymbolUniqueId::TSymbolUniqueId(TSymbolTable *symbolTable) : mId(symbolTable->nextUniqueId())
TSymbolUniqueId::TSymbolUniqueId() : mId(TSymbolTable::nextUniqueId())
{ {
} }
...@@ -44,7 +42,8 @@ int TSymbolUniqueId::get() const ...@@ -44,7 +42,8 @@ int TSymbolUniqueId::get() const
return mId; return mId;
} }
TSymbol::TSymbol(const TString *n) : uniqueId(TSymbolTable::nextUniqueId()), name(n) TSymbol::TSymbol(TSymbolTable *symbolTable, const TString *n)
: uniqueId(symbolTable->nextUniqueId()), name(n)
{ {
} }
...@@ -281,7 +280,7 @@ TVariable *TSymbolTable::declareStructType(TStructure *str) ...@@ -281,7 +280,7 @@ TVariable *TSymbolTable::declareStructType(TStructure *str)
TInterfaceBlockName *TSymbolTable::declareInterfaceBlockName(const TString *name) TInterfaceBlockName *TSymbolTable::declareInterfaceBlockName(const TString *name)
{ {
TInterfaceBlockName *blockNameSymbol = new TInterfaceBlockName(name); TInterfaceBlockName *blockNameSymbol = new TInterfaceBlockName(this, name);
if (insert(currentLevel(), blockNameSymbol)) if (insert(currentLevel(), blockNameSymbol))
{ {
return blockNameSymbol; return blockNameSymbol;
...@@ -296,7 +295,7 @@ TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const char *name, co ...@@ -296,7 +295,7 @@ TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const char *name, co
TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const TString *name, const TType &type) TVariable *TSymbolTable::insertVariable(ESymbolLevel level, const TString *name, const TType &type)
{ {
TVariable *var = new TVariable(name, type); TVariable *var = new TVariable(this, name, type);
if (insert(level, var)) if (insert(level, var))
{ {
// Do lazy initialization for struct types, so we allocate to the current scope. // Do lazy initialization for struct types, so we allocate to the current scope.
...@@ -314,7 +313,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level, ...@@ -314,7 +313,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level,
const char *name, const char *name,
const TType &type) const TType &type)
{ {
TVariable *var = new TVariable(NewPoolTString(name), type); TVariable *var = new TVariable(this, NewPoolTString(name), type);
if (insert(level, ext, var)) if (insert(level, ext, var))
{ {
if (var->getType().getBasicType() == EbtStruct) if (var->getType().getBasicType() == EbtStruct)
...@@ -328,7 +327,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level, ...@@ -328,7 +327,7 @@ TVariable *TSymbolTable::insertVariableExt(ESymbolLevel level,
TVariable *TSymbolTable::insertStructType(ESymbolLevel level, TStructure *str) TVariable *TSymbolTable::insertStructType(ESymbolLevel level, TStructure *str)
{ {
TVariable *var = new TVariable(&str->name(), TType(str), true); TVariable *var = new TVariable(this, &str->name(), TType(str), true);
if (insert(level, var)) if (insert(level, var))
{ {
var->getType().realize(); var->getType().realize();
...@@ -467,7 +466,7 @@ void TSymbolTable::insertBuiltIn(ESymbolLevel level, ...@@ -467,7 +466,7 @@ void TSymbolTable::insertBuiltIn(ESymbolLevel level,
} }
else else
{ {
TFunction *function = new TFunction(NewPoolTString(name), rvalue, op, ext); TFunction *function = new TFunction(this, NewPoolTString(name), rvalue, op, ext);
function->addParameter(TConstParameter(ptype1)); function->addParameter(TConstParameter(ptype1));
...@@ -532,7 +531,7 @@ void TSymbolTable::insertBuiltInFunctionNoParameters(ESymbolLevel level, ...@@ -532,7 +531,7 @@ void TSymbolTable::insertBuiltInFunctionNoParameters(ESymbolLevel level,
const char *name) const char *name)
{ {
insertUnmangledBuiltInName(name, level); insertUnmangledBuiltInName(name, level);
insert(level, new TFunction(NewPoolTString(name), rvalue, op)); insert(level, new TFunction(this, NewPoolTString(name), rvalue, op));
} }
TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const
......
...@@ -46,7 +46,7 @@ class TSymbolUniqueId ...@@ -46,7 +46,7 @@ class TSymbolUniqueId
{ {
public: public:
POOL_ALLOCATOR_NEW_DELETE(); POOL_ALLOCATOR_NEW_DELETE();
TSymbolUniqueId(); TSymbolUniqueId(TSymbolTable *symbolTable);
TSymbolUniqueId(const TSymbol &symbol); TSymbolUniqueId(const TSymbol &symbol);
TSymbolUniqueId(const TSymbolUniqueId &) = default; TSymbolUniqueId(const TSymbolUniqueId &) = default;
TSymbolUniqueId &operator=(const TSymbolUniqueId &) = default; TSymbolUniqueId &operator=(const TSymbolUniqueId &) = default;
...@@ -62,7 +62,7 @@ class TSymbol : angle::NonCopyable ...@@ -62,7 +62,7 @@ class TSymbol : angle::NonCopyable
{ {
public: public:
POOL_ALLOCATOR_NEW_DELETE(); POOL_ALLOCATOR_NEW_DELETE();
TSymbol(const TString *n); TSymbol(TSymbolTable *symbolTable, const TString *n);
virtual ~TSymbol() virtual ~TSymbol()
{ {
...@@ -103,8 +103,11 @@ class TVariable : public TSymbol ...@@ -103,8 +103,11 @@ class TVariable : public TSymbol
private: private:
friend class TSymbolTable; friend class TSymbolTable;
TVariable(const TString *name, const TType &t, bool isUserTypeDefinition = false) TVariable(TSymbolTable *symbolTable,
: TSymbol(name), type(t), userType(isUserTypeDefinition), unionArray(0) const TString *name,
const TType &t,
bool isUserTypeDefinition = false)
: TSymbol(symbolTable, name), type(t), userType(isUserTypeDefinition), unionArray(0)
{ {
} }
...@@ -159,11 +162,12 @@ struct TParameter ...@@ -159,11 +162,12 @@ struct TParameter
class TFunction : public TSymbol class TFunction : public TSymbol
{ {
public: public:
TFunction(const TString *name, TFunction(TSymbolTable *symbolTable,
const TString *name,
const TType *retType, const TType *retType,
TOperator tOp = EOpNull, TOperator tOp = EOpNull,
const char *ext = "") const char *ext = "")
: TSymbol(name), : TSymbol(symbolTable, name),
returnType(retType), returnType(retType),
mangledName(nullptr), mangledName(nullptr),
op(tOp), op(tOp),
...@@ -229,7 +233,9 @@ class TInterfaceBlockName : public TSymbol ...@@ -229,7 +233,9 @@ class TInterfaceBlockName : public TSymbol
private: private:
friend class TSymbolTable; friend class TSymbolTable;
TInterfaceBlockName(const TString *name) : TSymbol(name) {} TInterfaceBlockName(TSymbolTable *symbolTable, const TString *name) : TSymbol(symbolTable, name)
{
}
}; };
class TSymbolTableLevel class TSymbolTableLevel
...@@ -292,7 +298,7 @@ const int GLOBAL_LEVEL = 4; ...@@ -292,7 +298,7 @@ const int GLOBAL_LEVEL = 4;
class TSymbolTable : angle::NonCopyable class TSymbolTable : angle::NonCopyable
{ {
public: public:
TSymbolTable() TSymbolTable() : mUniqueIdCounter(0)
{ {
// The symbol table cannot be used until push() is called, but // The symbol table cannot be used until push() is called, but
// the lack of an initial call to push() can be used to detect // the lack of an initial call to push() can be used to detect
...@@ -342,7 +348,7 @@ class TSymbolTable : angle::NonCopyable ...@@ -342,7 +348,7 @@ class TSymbolTable : angle::NonCopyable
bool insertConstInt(ESymbolLevel level, const char *name, int value, TPrecision precision) bool insertConstInt(ESymbolLevel level, const char *name, int value, TPrecision precision)
{ {
TVariable *constant = TVariable *constant =
new TVariable(NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1)); new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1));
TConstantUnion *unionArray = new TConstantUnion[1]; TConstantUnion *unionArray = new TConstantUnion[1];
unionArray[0].setIConst(value); unionArray[0].setIConst(value);
constant->shareConstPointer(unionArray); constant->shareConstPointer(unionArray);
...@@ -352,7 +358,7 @@ class TSymbolTable : angle::NonCopyable ...@@ -352,7 +358,7 @@ class TSymbolTable : angle::NonCopyable
bool insertConstIntExt(ESymbolLevel level, const char *ext, const char *name, int value) bool insertConstIntExt(ESymbolLevel level, const char *ext, const char *name, int value)
{ {
TVariable *constant = TVariable *constant =
new TVariable(NewPoolTString(name), TType(EbtInt, EbpUndefined, EvqConst, 1)); new TVariable(this, NewPoolTString(name), TType(EbtInt, EbpUndefined, EvqConst, 1));
TConstantUnion *unionArray = new TConstantUnion[1]; TConstantUnion *unionArray = new TConstantUnion[1];
unionArray[0].setIConst(value); unionArray[0].setIConst(value);
constant->shareConstPointer(unionArray); constant->shareConstPointer(unionArray);
...@@ -365,7 +371,7 @@ class TSymbolTable : angle::NonCopyable ...@@ -365,7 +371,7 @@ class TSymbolTable : angle::NonCopyable
TPrecision precision) TPrecision precision)
{ {
TVariable *constantIvec3 = TVariable *constantIvec3 =
new TVariable(NewPoolTString(name), TType(EbtInt, precision, EvqConst, 3)); new TVariable(this, NewPoolTString(name), TType(EbtInt, precision, EvqConst, 3));
TConstantUnion *unionArray = new TConstantUnion[3]; TConstantUnion *unionArray = new TConstantUnion[3];
for (size_t index = 0u; index < 3u; ++index) for (size_t index = 0u; index < 3u; ++index)
...@@ -488,7 +494,7 @@ class TSymbolTable : angle::NonCopyable ...@@ -488,7 +494,7 @@ class TSymbolTable : angle::NonCopyable
table[currentLevel()]->setGlobalInvariant(invariant); table[currentLevel()]->setGlobalInvariant(invariant);
} }
static int nextUniqueId() { return ++uniqueIdCounter; } int nextUniqueId() { return ++mUniqueIdCounter; }
// Checks whether there is a built-in accessible by a shader with the specified version. // Checks whether there is a built-in accessible by a shader with the specified version.
bool hasUnmangledBuiltInForShaderVersion(const char *name, int shaderVersion); bool hasUnmangledBuiltInForShaderVersion(const char *name, int shaderVersion);
...@@ -516,7 +522,7 @@ class TSymbolTable : angle::NonCopyable ...@@ -516,7 +522,7 @@ class TSymbolTable : angle::NonCopyable
typedef TMap<TBasicType, TPrecision> PrecisionStackLevel; typedef TMap<TBasicType, TPrecision> PrecisionStackLevel;
std::vector<PrecisionStackLevel *> precisionStack; std::vector<PrecisionStackLevel *> precisionStack;
static int uniqueIdCounter; int mUniqueIdCounter;
}; };
} // namespace sh } // namespace sh
......
...@@ -56,13 +56,13 @@ void TranslatorESSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -56,13 +56,13 @@ void TranslatorESSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
if (precisionEmulation) if (precisionEmulation)
{ {
EmulatePrecision emulatePrecision(getSymbolTable(), shaderVer); EmulatePrecision emulatePrecision(&getSymbolTable(), shaderVer);
root->traverse(&emulatePrecision); root->traverse(&emulatePrecision);
emulatePrecision.updateTree(); emulatePrecision.updateTree();
emulatePrecision.writeEmulationHelpers(sink, shaderVer, SH_ESSL_OUTPUT); emulatePrecision.writeEmulationHelpers(sink, shaderVer, SH_ESSL_OUTPUT);
} }
RecordConstantPrecision(root, getTemporaryId()); RecordConstantPrecision(root, &getSymbolTable());
// Write emulated built-in functions if needed. // Write emulated built-in functions if needed.
if (!getBuiltInFunctionEmulator().isOutputEmpty()) if (!getBuiltInFunctionEmulator().isOutputEmpty())
...@@ -97,7 +97,7 @@ void TranslatorESSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -97,7 +97,7 @@ void TranslatorESSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
// Write translated shader. // Write translated shader.
TOutputESSL outputESSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(), TOutputESSL outputESSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(),
getSymbolTable(), getShaderType(), shaderVer, precisionEmulation, &getSymbolTable(), getShaderType(), shaderVer, precisionEmulation,
compileOptions); compileOptions);
if (compileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM) if (compileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM)
......
...@@ -107,7 +107,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -107,7 +107,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
if (precisionEmulation) if (precisionEmulation)
{ {
EmulatePrecision emulatePrecision(getSymbolTable(), getShaderVersion()); EmulatePrecision emulatePrecision(&getSymbolTable(), getShaderVersion());
root->traverse(&emulatePrecision); root->traverse(&emulatePrecision);
emulatePrecision.updateTree(); emulatePrecision.updateTree();
emulatePrecision.writeEmulationHelpers(sink, getShaderVersion(), getOutputType()); emulatePrecision.writeEmulationHelpers(sink, getShaderVersion(), getOutputType());
...@@ -202,7 +202,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -202,7 +202,7 @@ void TranslatorGLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
// Write translated shader. // Write translated shader.
TOutputGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(), TOutputGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), getNameMap(),
getSymbolTable(), getShaderType(), getShaderVersion(), getOutputType(), &getSymbolTable(), getShaderType(), getShaderVersion(), getOutputType(),
compileOptions); compileOptions);
if (compileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM) if (compileOptions & SH_TRANSLATE_VIEWID_OVR_TO_UNIFORM)
......
...@@ -46,7 +46,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -46,7 +46,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
IntermNodePatternMatcher::kUnfoldedShortCircuitExpression | IntermNodePatternMatcher::kUnfoldedShortCircuitExpression |
IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue | IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue |
IntermNodePatternMatcher::kMultiDeclaration, IntermNodePatternMatcher::kMultiDeclaration,
getTemporaryId(), getSymbolTable(), getShaderVersion()); &getSymbolTable(), getShaderVersion());
// Note that separate declarations need to be run before other AST transformations that // Note that separate declarations need to be run before other AST transformations that
// generate new statements from expressions. // generate new statements from expressions.
...@@ -56,31 +56,31 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -56,31 +56,31 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
IntermNodePatternMatcher::kExpressionReturningArray | IntermNodePatternMatcher::kExpressionReturningArray |
IntermNodePatternMatcher::kUnfoldedShortCircuitExpression | IntermNodePatternMatcher::kUnfoldedShortCircuitExpression |
IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue, IntermNodePatternMatcher::kDynamicIndexingOfVectorOrMatrixInLValue,
getTemporaryId(), getSymbolTable(), getShaderVersion()); &getSymbolTable(), getShaderVersion());
// Note that SeparateDeclarations needs to be run before UnfoldShortCircuitToIf. // Note that SeparateDeclarations needs to be run before UnfoldShortCircuitToIf.
UnfoldShortCircuitToIf(root, getTemporaryId()); UnfoldShortCircuitToIf(root, &getSymbolTable());
SeparateExpressionsReturningArrays(root, getTemporaryId()); SeparateExpressionsReturningArrays(root, &getSymbolTable());
// Note that SeparateDeclarations needs to be run before SeparateArrayInitialization. // Note that SeparateDeclarations needs to be run before SeparateArrayInitialization.
SeparateArrayInitialization(root); SeparateArrayInitialization(root);
// HLSL doesn't support arrays as return values, we'll need to make functions that have an array // HLSL doesn't support arrays as return values, we'll need to make functions that have an array
// as a return value to use an out parameter to transfer the array data instead. // as a return value to use an out parameter to transfer the array data instead.
ArrayReturnValueToOutParameter(root, getTemporaryId()); ArrayReturnValueToOutParameter(root, &getSymbolTable());
if (!shouldRunLoopAndIndexingValidation(compileOptions)) if (!shouldRunLoopAndIndexingValidation(compileOptions))
{ {
// HLSL doesn't support dynamic indexing of vectors and matrices. // HLSL doesn't support dynamic indexing of vectors and matrices.
RemoveDynamicIndexing(root, getTemporaryId(), getSymbolTable(), getShaderVersion()); RemoveDynamicIndexing(root, &getSymbolTable(), getShaderVersion());
} }
// Work around D3D9 bug that would manifest in vertex shaders with selection blocks which // Work around D3D9 bug that would manifest in vertex shaders with selection blocks which
// use a vertex attribute as a condition, and some related computation in the else block. // use a vertex attribute as a condition, and some related computation in the else block.
if (getOutputType() == SH_HLSL_3_0_OUTPUT && getShaderType() == GL_VERTEX_SHADER) if (getOutputType() == SH_HLSL_3_0_OUTPUT && getShaderType() == GL_VERTEX_SHADER)
{ {
sh::RewriteElseBlocks(root, getTemporaryId()); sh::RewriteElseBlocks(root, &getSymbolTable());
} }
// Work around an HLSL compiler frontend aliasing optimization bug. // Work around an HLSL compiler frontend aliasing optimization bug.
...@@ -94,7 +94,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -94,7 +94,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
if (precisionEmulation) if (precisionEmulation)
{ {
EmulatePrecision emulatePrecision(getSymbolTable(), getShaderVersion()); EmulatePrecision emulatePrecision(&getSymbolTable(), getShaderVersion());
root->traverse(&emulatePrecision); root->traverse(&emulatePrecision);
emulatePrecision.updateTree(); emulatePrecision.updateTree();
emulatePrecision.writeEmulationHelpers(getInfoSink().obj, getShaderVersion(), emulatePrecision.writeEmulationHelpers(getInfoSink().obj, getShaderVersion(),
...@@ -103,7 +103,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio ...@@ -103,7 +103,7 @@ void TranslatorHLSL::translate(TIntermBlock *root, ShCompileOptions compileOptio
if ((compileOptions & SH_EXPAND_SELECT_HLSL_INTEGER_POW_EXPRESSIONS) != 0) if ((compileOptions & SH_EXPAND_SELECT_HLSL_INTEGER_POW_EXPRESSIONS) != 0)
{ {
sh::ExpandIntegerPowExpressions(root, getTemporaryId()); sh::ExpandIntegerPowExpressions(root, &getSymbolTable());
} }
if ((compileOptions & SH_REWRITE_TEXELFETCHOFFSET_TO_TEXELFETCH) != 0) if ((compileOptions & SH_REWRITE_TEXELFETCHOFFSET_TO_TEXELFETCH) != 0)
......
...@@ -63,7 +63,7 @@ void TranslatorVulkan::translate(TIntermBlock *root, ShCompileOptions compileOpt ...@@ -63,7 +63,7 @@ void TranslatorVulkan::translate(TIntermBlock *root, ShCompileOptions compileOpt
// Write translated shader. // Write translated shader.
TOutputVulkanGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(), TOutputVulkanGLSL outputGLSL(sink, getArrayIndexClampingStrategy(), getHashFunction(),
getNameMap(), getSymbolTable(), getShaderType(), getNameMap(), &getSymbolTable(), getShaderType(),
getShaderVersion(), getOutputType(), compileOptions); getShaderVersion(), getOutputType(), compileOptions);
root->traverse(&outputGLSL); root->traverse(&outputGLSL);
} }
......
...@@ -504,10 +504,10 @@ int TType::getLocationCount() const ...@@ -504,10 +504,10 @@ int TType::getLocationCount() const
return count; return count;
} }
TStructure::TStructure(const TString *name, TFieldList *fields) TStructure::TStructure(TSymbolTable *symbolTable, const TString *name, TFieldList *fields)
: TFieldListCollection(name, fields), : TFieldListCollection(name, fields),
mDeepestNesting(0), mDeepestNesting(0),
mUniqueId(TSymbolTable::nextUniqueId()), mUniqueId(symbolTable->nextUniqueId()),
mAtGlobalScope(false) mAtGlobalScope(false)
{ {
} }
......
...@@ -20,6 +20,7 @@ struct TPublicType; ...@@ -20,6 +20,7 @@ struct TPublicType;
class TType; class TType;
class TSymbol; class TSymbol;
class TIntermSymbol; class TIntermSymbol;
class TSymbolTable;
class TField : angle::NonCopyable class TField : angle::NonCopyable
{ {
...@@ -87,7 +88,7 @@ class TStructure : public TFieldListCollection ...@@ -87,7 +88,7 @@ class TStructure : public TFieldListCollection
{ {
public: public:
POOL_ALLOCATOR_NEW_DELETE(); POOL_ALLOCATOR_NEW_DELETE();
TStructure(const TString *name, TFieldList *fields); TStructure(TSymbolTable *symbolTable, const TString *name, TFieldList *fields);
int deepestNesting() const int deepestNesting() const
{ {
...@@ -138,7 +139,7 @@ class TStructure : public TFieldListCollection ...@@ -138,7 +139,7 @@ class TStructure : public TFieldListCollection
int calculateDeepestNesting() const; int calculateDeepestNesting() const;
mutable int mDeepestNesting; mutable int mDeepestNesting;
int mUniqueId; const int mUniqueId;
bool mAtGlobalScope; bool mAtGlobalScope;
}; };
......
...@@ -24,7 +24,7 @@ namespace ...@@ -24,7 +24,7 @@ namespace
class UnfoldShortCircuitTraverser : public TIntermTraverser class UnfoldShortCircuitTraverser : public TIntermTraverser
{ {
public: public:
UnfoldShortCircuitTraverser(); UnfoldShortCircuitTraverser(TSymbolTable *symbolTable);
bool visitBinary(Visit visit, TIntermBinary *node) override; bool visitBinary(Visit visit, TIntermBinary *node) override;
bool visitTernary(Visit visit, TIntermTernary *node) override; bool visitTernary(Visit visit, TIntermTernary *node) override;
...@@ -40,8 +40,8 @@ class UnfoldShortCircuitTraverser : public TIntermTraverser ...@@ -40,8 +40,8 @@ class UnfoldShortCircuitTraverser : public TIntermTraverser
IntermNodePatternMatcher mPatternToUnfoldMatcher; IntermNodePatternMatcher mPatternToUnfoldMatcher;
}; };
UnfoldShortCircuitTraverser::UnfoldShortCircuitTraverser() UnfoldShortCircuitTraverser::UnfoldShortCircuitTraverser(TSymbolTable *symbolTable)
: TIntermTraverser(true, false, true), : TIntermTraverser(true, false, true, symbolTable),
mFoundShortCircuit(false), mFoundShortCircuit(false),
mPatternToUnfoldMatcher(IntermNodePatternMatcher::kUnfoldedShortCircuitExpression) mPatternToUnfoldMatcher(IntermNodePatternMatcher::kUnfoldedShortCircuitExpression)
{ {
...@@ -170,11 +170,9 @@ void UnfoldShortCircuitTraverser::nextIteration() ...@@ -170,11 +170,9 @@ void UnfoldShortCircuitTraverser::nextIteration()
} // namespace } // namespace
void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolUniqueId *temporaryId) void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolTable *symbolTable)
{ {
UnfoldShortCircuitTraverser traverser; UnfoldShortCircuitTraverser traverser(symbolTable);
ASSERT(temporaryId != nullptr);
traverser.useTemporaryId(temporaryId);
// Unfold one operator at a time, and reset the traverser between iterations. // Unfold one operator at a time, and reset the traverser between iterations.
do do
{ {
......
...@@ -16,9 +16,9 @@ namespace sh ...@@ -16,9 +16,9 @@ namespace sh
{ {
class TIntermNode; class TIntermNode;
class TSymbolUniqueId; class TSymbolTable;
void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolUniqueId *temporaryId); void UnfoldShortCircuitToIf(TIntermNode *root, TSymbolTable *symbolTable);
} // namespace sh } // namespace sh
......
...@@ -71,7 +71,7 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser ...@@ -71,7 +71,7 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser
{ {
public: public:
ValidateLimitationsTraverser(sh::GLenum shaderType, ValidateLimitationsTraverser(sh::GLenum shaderType,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
TDiagnostics *diagnostics); TDiagnostics *diagnostics);
...@@ -104,7 +104,7 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser ...@@ -104,7 +104,7 @@ class ValidateLimitationsTraverser : public TLValueTrackingTraverser
}; };
ValidateLimitationsTraverser::ValidateLimitationsTraverser(sh::GLenum shaderType, ValidateLimitationsTraverser::ValidateLimitationsTraverser(sh::GLenum shaderType,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
TDiagnostics *diagnostics) TDiagnostics *diagnostics)
: TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion), : TLValueTrackingTraverser(true, false, false, symbolTable, shaderVersion),
...@@ -432,7 +432,7 @@ bool ValidateLimitationsTraverser::validateIndexing(TIntermBinary *node) ...@@ -432,7 +432,7 @@ bool ValidateLimitationsTraverser::validateIndexing(TIntermBinary *node)
bool ValidateLimitations(TIntermNode *root, bool ValidateLimitations(TIntermNode *root,
GLenum shaderType, GLenum shaderType,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
TDiagnostics *diagnostics) TDiagnostics *diagnostics)
{ {
......
...@@ -18,7 +18,7 @@ class TDiagnostics; ...@@ -18,7 +18,7 @@ class TDiagnostics;
// 1.00 spec Appendix A. // 1.00 spec Appendix A.
bool ValidateLimitations(TIntermNode *root, bool ValidateLimitations(TIntermNode *root,
GLenum shaderType, GLenum shaderType,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
TDiagnostics *diagnostics); TDiagnostics *diagnostics);
......
...@@ -95,7 +95,7 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -95,7 +95,7 @@ class CollectVariablesTraverser : public TIntermTraverser
std::vector<Varying> *varyings, std::vector<Varying> *varyings,
std::vector<InterfaceBlock> *interfaceBlocks, std::vector<InterfaceBlock> *interfaceBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
const TExtensionBehavior &extensionBehavior); const TExtensionBehavior &extensionBehavior);
...@@ -147,7 +147,6 @@ class CollectVariablesTraverser : public TIntermTraverser ...@@ -147,7 +147,6 @@ class CollectVariablesTraverser : public TIntermTraverser
ShHashFunction64 mHashFunction; ShHashFunction64 mHashFunction;
const TSymbolTable &mSymbolTable;
int mShaderVersion; int mShaderVersion;
const TExtensionBehavior &mExtensionBehavior; const TExtensionBehavior &mExtensionBehavior;
}; };
...@@ -159,10 +158,10 @@ CollectVariablesTraverser::CollectVariablesTraverser( ...@@ -159,10 +158,10 @@ CollectVariablesTraverser::CollectVariablesTraverser(
std::vector<sh::Varying> *varyings, std::vector<sh::Varying> *varyings,
std::vector<sh::InterfaceBlock> *interfaceBlocks, std::vector<sh::InterfaceBlock> *interfaceBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
const TExtensionBehavior &extensionBehavior) const TExtensionBehavior &extensionBehavior)
: TIntermTraverser(true, false, false), : TIntermTraverser(true, false, false, symbolTable),
mAttribs(attribs), mAttribs(attribs),
mOutputVariables(outputVariables), mOutputVariables(outputVariables),
mUniforms(uniforms), mUniforms(uniforms),
...@@ -184,7 +183,6 @@ CollectVariablesTraverser::CollectVariablesTraverser( ...@@ -184,7 +183,6 @@ CollectVariablesTraverser::CollectVariablesTraverser(
mSecondaryFragColorEXTAdded(false), mSecondaryFragColorEXTAdded(false),
mSecondaryFragDataEXTAdded(false), mSecondaryFragDataEXTAdded(false),
mHashFunction(hashFunction), mHashFunction(hashFunction),
mSymbolTable(symbolTable),
mShaderVersion(shaderVersion), mShaderVersion(shaderVersion),
mExtensionBehavior(extensionBehavior) mExtensionBehavior(extensionBehavior)
{ {
...@@ -194,7 +192,7 @@ void CollectVariablesTraverser::setBuiltInInfoFromSymbolTable(const char *name, ...@@ -194,7 +192,7 @@ void CollectVariablesTraverser::setBuiltInInfoFromSymbolTable(const char *name,
ShaderVariable *info) ShaderVariable *info)
{ {
TVariable *symbolTableVar = TVariable *symbolTableVar =
reinterpret_cast<TVariable *>(mSymbolTable.findBuiltIn(name, mShaderVersion)); reinterpret_cast<TVariable *>(mSymbolTable->findBuiltIn(name, mShaderVersion));
ASSERT(symbolTableVar); ASSERT(symbolTableVar);
const TType &type = symbolTableVar->getType(); const TType &type = symbolTableVar->getType();
...@@ -212,7 +210,7 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const char *name, bool ...@@ -212,7 +210,7 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const char *name, bool
Varying info; Varying info;
setBuiltInInfoFromSymbolTable(name, &info); setBuiltInInfoFromSymbolTable(name, &info);
info.staticUse = true; info.staticUse = true;
info.isInvariant = mSymbolTable.isVaryingInvariant(name); info.isInvariant = mSymbolTable->isVaryingInvariant(name);
mVaryings->push_back(info); mVaryings->push_back(info);
(*addedFlag) = true; (*addedFlag) = true;
} }
...@@ -502,7 +500,7 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable) ...@@ -502,7 +500,7 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable)
case EvqSmoothOut: case EvqSmoothOut:
case EvqFlatOut: case EvqFlatOut:
case EvqCentroidOut: case EvqCentroidOut:
if (mSymbolTable.isVaryingInvariant(std::string(variable.getSymbol().c_str())) || if (mSymbolTable->isVaryingInvariant(std::string(variable.getSymbol().c_str())) ||
type.isInvariant()) type.isInvariant())
{ {
varying.isInvariant = true; varying.isInvariant = true;
...@@ -652,7 +650,7 @@ void CollectVariables(TIntermBlock *root, ...@@ -652,7 +650,7 @@ void CollectVariables(TIntermBlock *root,
std::vector<Varying> *varyings, std::vector<Varying> *varyings,
std::vector<InterfaceBlock> *interfaceBlocks, std::vector<InterfaceBlock> *interfaceBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
const TExtensionBehavior &extensionBehavior) const TExtensionBehavior &extensionBehavior)
{ {
......
...@@ -24,7 +24,7 @@ void CollectVariables(TIntermBlock *root, ...@@ -24,7 +24,7 @@ void CollectVariables(TIntermBlock *root,
std::vector<Varying> *varyings, std::vector<Varying> *varyings,
std::vector<InterfaceBlock> *interfaceBlocks, std::vector<InterfaceBlock> *interfaceBlocks,
ShHashFunction64 hashFunction, ShHashFunction64 hashFunction,
const TSymbolTable &symbolTable, TSymbolTable *symbolTable,
int shaderVersion, int shaderVersion,
const TExtensionBehavior &extensionBehavior); const TExtensionBehavior &extensionBehavior);
......
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