Commit 76b2c385 by Olli Etuaho Committed by Commit Bot

Store invariant declarations in variable metadata

This is simpler than storing the information in symbol table levels. Invariant declarations can only be present at the global scope, so storing the information per level is not required. BUG=angleproject:2267 TEST=angle_unittests Change-Id: Idb07d734950c8a0a8bda5b2380e181902f9eb633 Reviewed-on: https://chromium-review.googlesource.com/1007060Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 15215261
...@@ -284,7 +284,7 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const TVariable &variab ...@@ -284,7 +284,7 @@ void CollectVariablesTraverser::recordBuiltInVaryingUsed(const TVariable &variab
setBuiltInInfoFromSymbol(variable, &info); setBuiltInInfoFromSymbol(variable, &info);
info.staticUse = true; info.staticUse = true;
info.active = true; info.active = true;
info.isInvariant = mSymbolTable->isVaryingInvariant(variable.name()); info.isInvariant = mSymbolTable->isVaryingInvariant(variable);
varyings->push_back(info); varyings->push_back(info);
(*addedFlag) = true; (*addedFlag) = true;
} }
...@@ -668,7 +668,7 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable) ...@@ -668,7 +668,7 @@ Varying CollectVariablesTraverser::recordVarying(const TIntermSymbol &variable)
case EvqFlatOut: case EvqFlatOut:
case EvqCentroidOut: case EvqCentroidOut:
case EvqGeometryOut: case EvqGeometryOut:
if (mSymbolTable->isVaryingInvariant(variable.getName()) || type.isInvariant()) if (mSymbolTable->isVaryingInvariant(variable.variable()) || type.isInvariant())
{ {
varying.isInvariant = true; varying.isInvariant = true;
} }
......
...@@ -2632,7 +2632,7 @@ TIntermInvariantDeclaration *TParseContext::parseInvariantDeclaration( ...@@ -2632,7 +2632,7 @@ TIntermInvariantDeclaration *TParseContext::parseInvariantDeclaration(
typeQualifier.line); typeQualifier.line);
checkMemoryQualifierIsNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line); checkMemoryQualifierIsNotSpecified(typeQualifier.memoryQualifier, typeQualifier.line);
symbolTable.addInvariantVarying(identifier); symbolTable.addInvariantVarying(*variable);
TIntermSymbol *intermSymbol = new TIntermSymbol(variable); TIntermSymbol *intermSymbol = new TIntermSymbol(variable);
intermSymbol->setLine(identifierLoc); intermSymbol->setLine(identifierLoc);
......
...@@ -13,9 +13,6 @@ ...@@ -13,9 +13,6 @@
#include "compiler/translator/SymbolTable.h" #include "compiler/translator/SymbolTable.h"
#include <algorithm>
#include <set>
#include "angle_gl.h" #include "angle_gl.h"
#include "compiler/translator/ImmutableString.h" #include "compiler/translator/ImmutableString.h"
#include "compiler/translator/IntermNode.h" #include "compiler/translator/IntermNode.h"
...@@ -27,7 +24,7 @@ namespace sh ...@@ -27,7 +24,7 @@ namespace sh
class TSymbolTable::TSymbolTableLevel class TSymbolTable::TSymbolTableLevel
{ {
public: public:
TSymbolTableLevel() : mGlobalInvariant(false) {} TSymbolTableLevel() {}
bool insert(TSymbol *symbol); bool insert(TSymbol *symbol);
...@@ -36,15 +33,6 @@ class TSymbolTable::TSymbolTableLevel ...@@ -36,15 +33,6 @@ class TSymbolTable::TSymbolTableLevel
TSymbol *find(const ImmutableString &name) const; TSymbol *find(const ImmutableString &name) const;
void addInvariantVarying(const ImmutableString &name) { mInvariantVaryings.insert(name); }
bool isVaryingInvariant(const ImmutableString &name)
{
return (mGlobalInvariant || mInvariantVaryings.count(name) > 0);
}
void setGlobalInvariant(bool invariant) { mGlobalInvariant = invariant; }
private: private:
using tLevel = TUnorderedMap<ImmutableString, using tLevel = TUnorderedMap<ImmutableString,
TSymbol *, TSymbol *,
...@@ -53,9 +41,6 @@ class TSymbolTable::TSymbolTableLevel ...@@ -53,9 +41,6 @@ class TSymbolTable::TSymbolTableLevel
using tInsertResult = std::pair<tLevel::iterator, bool>; using tInsertResult = std::pair<tLevel::iterator, bool>;
tLevel level; tLevel level;
std::set<ImmutableString> mInvariantVaryings;
bool mGlobalInvariant;
}; };
bool TSymbolTable::TSymbolTableLevel::insert(TSymbol *symbol) bool TSymbolTable::TSymbolTableLevel::insert(TSymbol *symbol)
...@@ -80,7 +65,10 @@ TSymbol *TSymbolTable::TSymbolTableLevel::find(const ImmutableString &name) cons ...@@ -80,7 +65,10 @@ TSymbol *TSymbolTable::TSymbolTableLevel::find(const ImmutableString &name) cons
} }
TSymbolTable::TSymbolTable() TSymbolTable::TSymbolTable()
: mUniqueIdCounter(0), mShaderType(GL_FRAGMENT_SHADER), mGlInVariableWithArraySize(nullptr) : mGlobalInvariant(false),
mUniqueIdCounter(0),
mShaderType(GL_FRAGMENT_SHADER),
mGlInVariableWithArraySize(nullptr)
{ {
} }
...@@ -168,26 +156,26 @@ const TVariable *TSymbolTable::gl_SecondaryFragDataEXT() const ...@@ -168,26 +156,26 @@ const TVariable *TSymbolTable::gl_SecondaryFragDataEXT() const
return mVar_gl_SecondaryFragDataEXT; return mVar_gl_SecondaryFragDataEXT;
} }
void TSymbolTable::markStaticWrite(const TVariable &variable) TSymbolTable::VariableMetadata *TSymbolTable::getOrCreateVariableMetadata(const TVariable &variable) {
{ int id = variable.uniqueId().get();
int id = variable.uniqueId().get();
auto iter = mVariableMetadata.find(id); auto iter = mVariableMetadata.find(id);
if (iter == mVariableMetadata.end()) if (iter == mVariableMetadata.end())
{ {
iter = mVariableMetadata.insert(std::make_pair(id, VariableMetadata())).first; iter = mVariableMetadata.insert(std::make_pair(id, VariableMetadata())).first;
} }
iter->second.staticWrite = true; return &iter->second;
}
void TSymbolTable::markStaticWrite(const TVariable &variable)
{
auto metadata = getOrCreateVariableMetadata(variable);
metadata->staticWrite = true;
} }
void TSymbolTable::markStaticRead(const TVariable &variable) void TSymbolTable::markStaticRead(const TVariable &variable)
{ {
int id = variable.uniqueId().get(); auto metadata = getOrCreateVariableMetadata(variable);
auto iter = mVariableMetadata.find(id); metadata->staticRead = true;
if (iter == mVariableMetadata.end())
{
iter = mVariableMetadata.insert(std::make_pair(id, VariableMetadata())).first;
}
iter->second.staticRead = true;
} }
bool TSymbolTable::isStaticallyUsed(const TVariable &variable) const bool TSymbolTable::isStaticallyUsed(const TVariable &variable) const
...@@ -195,7 +183,32 @@ bool TSymbolTable::isStaticallyUsed(const TVariable &variable) const ...@@ -195,7 +183,32 @@ bool TSymbolTable::isStaticallyUsed(const TVariable &variable) const
ASSERT(!variable.getConstPointer()); ASSERT(!variable.getConstPointer());
int id = variable.uniqueId().get(); int id = variable.uniqueId().get();
auto iter = mVariableMetadata.find(id); auto iter = mVariableMetadata.find(id);
return iter != mVariableMetadata.end(); return iter != mVariableMetadata.end() && (iter->second.staticRead || iter->second.staticWrite);
}
void TSymbolTable::addInvariantVarying(const TVariable &variable)
{
ASSERT(atGlobalLevel());
auto metadata = getOrCreateVariableMetadata(variable);
metadata->invariant = true;
}
bool TSymbolTable::isVaryingInvariant(const TVariable &variable) const
{
ASSERT(atGlobalLevel());
if (mGlobalInvariant)
{
return true;
}
int id = variable.uniqueId().get();
auto iter = mVariableMetadata.find(id);
return iter != mVariableMetadata.end() && iter->second.invariant;
}
void TSymbolTable::setGlobalInvariant(bool invariant)
{
ASSERT(atGlobalLevel());
mGlobalInvariant = invariant;
} }
const TSymbol *TSymbolTable::find(const ImmutableString &name, int shaderVersion) const const TSymbol *TSymbolTable::find(const ImmutableString &name, int shaderVersion) const
...@@ -278,26 +291,9 @@ TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const ...@@ -278,26 +291,9 @@ TPrecision TSymbolTable::getDefaultPrecision(TBasicType type) const
return prec; return prec;
} }
void TSymbolTable::addInvariantVarying(const ImmutableString &originalName)
{
ASSERT(atGlobalLevel());
mTable.back()->addInvariantVarying(originalName);
}
bool TSymbolTable::isVaryingInvariant(const ImmutableString &originalName) const
{
ASSERT(atGlobalLevel());
return mTable.back()->isVaryingInvariant(originalName);
}
void TSymbolTable::setGlobalInvariant(bool invariant)
{
ASSERT(atGlobalLevel());
mTable.back()->setGlobalInvariant(invariant);
}
void TSymbolTable::clearCompilationResults() void TSymbolTable::clearCompilationResults()
{ {
mGlobalInvariant = false;
mUniqueIdCounter = kLastBuiltInId + 1; mUniqueIdCounter = kLastBuiltInId + 1;
mVariableMetadata.clear(); mVariableMetadata.clear();
mGlInVariableWithArraySize = nullptr; mGlInVariableWithArraySize = nullptr;
...@@ -360,7 +356,7 @@ void TSymbolTable::initSamplerDefaultPrecision(TBasicType samplerType) ...@@ -360,7 +356,7 @@ void TSymbolTable::initSamplerDefaultPrecision(TBasicType samplerType)
setDefaultPrecision(samplerType, EbpLow); setDefaultPrecision(samplerType, EbpLow);
} }
TSymbolTable::VariableMetadata::VariableMetadata() : staticRead(false), staticWrite(false) TSymbolTable::VariableMetadata::VariableMetadata() : staticRead(false), staticWrite(false), invariant(false)
{ {
} }
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
// //
#include <memory> #include <memory>
#include <set>
#include "common/angleutils.h" #include "common/angleutils.h"
#include "compiler/translator/ExtensionBehavior.h" #include "compiler/translator/ExtensionBehavior.h"
...@@ -117,15 +118,11 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase ...@@ -117,15 +118,11 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
// for the specified TBasicType // for the specified TBasicType
TPrecision getDefaultPrecision(TBasicType type) const; TPrecision getDefaultPrecision(TBasicType type) const;
// This records invariant varyings declared through // This records invariant varyings declared through "invariant varying_name;".
// "invariant varying_name;". void addInvariantVarying(const TVariable &variable);
void addInvariantVarying(const ImmutableString &originalName);
// If this returns false, the varying could still be invariant // If this returns false, the varying could still be invariant if it is set as invariant during the varying variable declaration - this piece of information is stored in the variable's type, not here.
// if it is set as invariant during the varying variable bool isVaryingInvariant(const TVariable &variable) const;
// declaration - this piece of information is stored in the
// variable's type, not here.
bool isVaryingInvariant(const ImmutableString &originalName) const;
void setGlobalInvariant(bool invariant); void setGlobalInvariant(bool invariant);
...@@ -142,6 +139,15 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase ...@@ -142,6 +139,15 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
private: private:
friend class TSymbolUniqueId; friend class TSymbolUniqueId;
struct VariableMetadata
{
VariableMetadata();
bool staticRead;
bool staticWrite;
bool invariant;
};
int nextUniqueIdValue(); int nextUniqueIdValue();
class TSymbolTableLevel; class TSymbolTableLevel;
...@@ -154,6 +160,8 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase ...@@ -154,6 +160,8 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
ShShaderSpec spec, ShShaderSpec spec,
const ShBuiltInResources &resources); const ShBuiltInResources &resources);
VariableMetadata *getOrCreateVariableMetadata(const TVariable &variable);
std::vector<std::unique_ptr<TSymbolTableLevel>> mTable; std::vector<std::unique_ptr<TSymbolTableLevel>> mTable;
// There's one precision stack level for predefined precisions and then one level for each scope // There's one precision stack level for predefined precisions and then one level for each scope
...@@ -161,6 +169,8 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase ...@@ -161,6 +169,8 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
typedef TMap<TBasicType, TPrecision> PrecisionStackLevel; typedef TMap<TBasicType, TPrecision> PrecisionStackLevel;
std::vector<std::unique_ptr<PrecisionStackLevel>> mPrecisionStack; std::vector<std::unique_ptr<PrecisionStackLevel>> mPrecisionStack;
bool mGlobalInvariant;
int mUniqueIdCounter; int mUniqueIdCounter;
static const int kLastBuiltInId; static const int kLastBuiltInId;
...@@ -168,13 +178,6 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase ...@@ -168,13 +178,6 @@ class TSymbolTable : angle::NonCopyable, TSymbolTableBase
sh::GLenum mShaderType; sh::GLenum mShaderType;
ShBuiltInResources mResources; ShBuiltInResources mResources;
struct VariableMetadata
{
VariableMetadata();
bool staticRead;
bool staticWrite;
};
// Indexed by unique id. Map instead of vector since the variables are fairly sparse. // Indexed by unique id. Map instead of vector since the variables are fairly sparse.
std::map<int, VariableMetadata> mVariableMetadata; std::map<int, VariableMetadata> mVariableMetadata;
......
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