Vulkan: Use TSymbolTable in ExtractStructSamplers.
This will enable more code reuse when handling sampler struct as
function arguments. We can add the sampler structs to the symbol table
stack when they are function arguments.
Bug: angleproject:2494
Change-Id: I9eeb1d3822e34cd43535e1b16a98864545755d22
Reviewed-on: https://chromium-review.googlesource.com/1117322
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/SymbolTable.cpp b/src/compiler/translator/SymbolTable.cpp
index 782045a..fc865df 100644
--- a/src/compiler/translator/SymbolTable.cpp
+++ b/src/compiler/translator/SymbolTable.cpp
@@ -24,7 +24,7 @@
class TSymbolTable::TSymbolTableLevel
{
public:
- TSymbolTableLevel() {}
+ TSymbolTableLevel() = default;
bool insert(TSymbol *symbol);
@@ -86,8 +86,8 @@
void TSymbolTable::push()
{
- mTable.push_back(std::unique_ptr<TSymbolTableLevel>(new TSymbolTableLevel));
- mPrecisionStack.push_back(std::unique_ptr<PrecisionStackLevel>(new PrecisionStackLevel));
+ mTable.emplace_back(new TSymbolTableLevel);
+ mPrecisionStack.emplace_back(new PrecisionStackLevel);
}
void TSymbolTable::pop()
@@ -98,7 +98,7 @@
const TFunction *TSymbolTable::markFunctionHasPrototypeDeclaration(
const ImmutableString &mangledName,
- bool *hadPrototypeDeclarationOut)
+ bool *hadPrototypeDeclarationOut) const
{
TFunction *function = findUserDefinedFunction(mangledName);
*hadPrototypeDeclarationOut = function->hasPrototypeDeclaration();
@@ -107,7 +107,7 @@
}
const TFunction *TSymbolTable::setFunctionParameterNamesFromDefinition(const TFunction *function,
- bool *wasDefinedOut)
+ bool *wasDefinedOut) const
{
TFunction *firstDeclaration = findUserDefinedFunction(function->getMangledName());
ASSERT(firstDeclaration);
@@ -213,6 +213,17 @@
const TSymbol *TSymbolTable::find(const ImmutableString &name, int shaderVersion) const
{
+ const TSymbol *userSymbol = findUserDefined(name);
+ if (userSymbol)
+ {
+ return userSymbol;
+ }
+
+ return findBuiltIn(name, shaderVersion);
+}
+
+const TSymbol *TSymbolTable::findUserDefined(const ImmutableString &name) const
+{
int userDefinedLevel = static_cast<int>(mTable.size()) - 1;
while (userDefinedLevel >= 0)
{
@@ -224,7 +235,7 @@
userDefinedLevel--;
}
- return findBuiltIn(name, shaderVersion);
+ return nullptr;
}
TFunction *TSymbolTable::findUserDefinedFunction(const ImmutableString &name) const
@@ -248,6 +259,14 @@
return mTable.back()->insert(symbol);
}
+bool TSymbolTable::declareInternal(TSymbol *symbol)
+{
+ ASSERT(!mTable.empty());
+ ASSERT(symbol->symbolType() == SymbolType::AngleInternal);
+ ASSERT(!symbol->isFunction());
+ return mTable.back()->insert(symbol);
+}
+
void TSymbolTable::declareUserDefinedFunction(TFunction *function, bool insertUnmangledName)
{
ASSERT(!mTable.empty());
@@ -299,7 +318,7 @@
mGlInVariableWithArraySize = nullptr;
// User-defined scopes should have already been cleared when the compilation finished.
- ASSERT(mTable.size() == 0u);
+ ASSERT(mTable.empty());
}
int TSymbolTable::nextUniqueIdValue()
@@ -316,7 +335,7 @@
mResources = resources;
// We need just one precision stack level for predefined precisions.
- mPrecisionStack.push_back(std::unique_ptr<PrecisionStackLevel>(new PrecisionStackLevel));
+ mPrecisionStack.emplace_back(new PrecisionStackLevel);
switch (type)
{
@@ -359,5 +378,4 @@
TSymbolTable::VariableMetadata::VariableMetadata() : staticRead(false), staticWrite(false), invariant(false)
{
}
-
} // namespace sh