Commit bf4e1b73 by Olli Etuaho Committed by Commit Bot

Split TIntermInvariantDeclaration from TIntermAggregate

This change is pure refactoring and doesn't fix bugs related to invariant declarations. Invariant declarations are supposed to accept a list of identifiers, but this refactoring keeps the current behavior of only accepting a single identifier in an invariant declaration. When the bug will be fixed, the new TIntermInvariantDeclaration class that now has only a single child node can be changed so that it may have multiple children. TIntermAggregate is still used for function calls, function prototypes and function parameter lists. BUG=angleproject:1490 TEST=angle_unittests Change-Id: I3e22092c87e1c06445fd7e123d9922c2fcb59428 Reviewed-on: https://chromium-review.googlesource.com/419415Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent da9fb093
...@@ -623,6 +623,11 @@ bool EmulatePrecision::visitDeclaration(Visit visit, TIntermDeclaration *node) ...@@ -623,6 +623,11 @@ bool EmulatePrecision::visitDeclaration(Visit visit, TIntermDeclaration *node)
return true; return true;
} }
bool EmulatePrecision::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node)
{
return false;
}
bool EmulatePrecision::visitAggregate(Visit visit, TIntermAggregate *node) bool EmulatePrecision::visitAggregate(Visit visit, TIntermAggregate *node)
{ {
bool visitChildren = true; bool visitChildren = true;
...@@ -636,9 +641,6 @@ bool EmulatePrecision::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -636,9 +641,6 @@ bool EmulatePrecision::visitAggregate(Visit visit, TIntermAggregate *node)
case EOpParameters: case EOpParameters:
visitChildren = false; visitChildren = false;
break; break;
case EOpInvariantDeclaration:
visitChildren = false;
break;
case EOpFunctionCall: case EOpFunctionCall:
{ {
// Function call. // Function call.
......
...@@ -30,6 +30,7 @@ class EmulatePrecision : public TLValueTrackingTraverser ...@@ -30,6 +30,7 @@ class EmulatePrecision : public TLValueTrackingTraverser
bool visitBinary(Visit visit, TIntermBinary *node) override; bool visitBinary(Visit visit, TIntermBinary *node) override;
bool visitUnary(Visit visit, TIntermUnary *node) override; bool visitUnary(Visit visit, TIntermUnary *node) override;
bool visitAggregate(Visit visit, TIntermAggregate *node) override; bool visitAggregate(Visit visit, TIntermAggregate *node) override;
bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override;
bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
void writeEmulationHelpers(TInfoSinkBase &sink, void writeEmulationHelpers(TInfoSinkBase &sink,
......
...@@ -203,6 +203,12 @@ bool TIntermUnary::replaceChildNode(TIntermNode *original, TIntermNode *replacem ...@@ -203,6 +203,12 @@ bool TIntermUnary::replaceChildNode(TIntermNode *original, TIntermNode *replacem
return false; return false;
} }
bool TIntermInvariantDeclaration::replaceChildNode(TIntermNode *original, TIntermNode *replacement)
{
REPLACE_IF_IS(mSymbol, TIntermSymbol, original, replacement);
return false;
}
bool TIntermFunctionDefinition::replaceChildNode(TIntermNode *original, TIntermNode *replacement) bool TIntermFunctionDefinition::replaceChildNode(TIntermNode *original, TIntermNode *replacement)
{ {
REPLACE_IF_IS(mParameters, TIntermAggregate, original, replacement); REPLACE_IF_IS(mParameters, TIntermAggregate, original, replacement);
...@@ -775,6 +781,13 @@ TIntermBinary::TIntermBinary(TOperator op, TIntermTyped *left, TIntermTyped *rig ...@@ -775,6 +781,13 @@ TIntermBinary::TIntermBinary(TOperator op, TIntermTyped *left, TIntermTyped *rig
promote(); promote();
} }
TIntermInvariantDeclaration::TIntermInvariantDeclaration(TIntermSymbol *symbol, const TSourceLoc &line)
: TIntermNode(), mSymbol(symbol)
{
ASSERT(symbol);
setLine(line);
}
TIntermTernary::TIntermTernary(TIntermTyped *cond, TIntermTernary::TIntermTernary(TIntermTyped *cond,
TIntermTyped *trueExpression, TIntermTyped *trueExpression,
TIntermTyped *falseExpression) TIntermTyped *falseExpression)
......
...@@ -35,6 +35,7 @@ class TDiagnostics; ...@@ -35,6 +35,7 @@ class TDiagnostics;
class TIntermTraverser; class TIntermTraverser;
class TIntermAggregate; class TIntermAggregate;
class TIntermBlock; class TIntermBlock;
class TIntermInvariantDeclaration;
class TIntermDeclaration; class TIntermDeclaration;
class TIntermFunctionDefinition; class TIntermFunctionDefinition;
class TIntermSwizzle; class TIntermSwizzle;
...@@ -724,6 +725,21 @@ class TIntermDeclaration : public TIntermNode, public TIntermAggregateBase ...@@ -724,6 +725,21 @@ class TIntermDeclaration : public TIntermNode, public TIntermAggregateBase
TIntermSequence mDeclarators; TIntermSequence mDeclarators;
}; };
// Specialized declarations for attributing invariance.
class TIntermInvariantDeclaration : public TIntermNode
{
public:
TIntermInvariantDeclaration(TIntermSymbol *symbol, const TSourceLoc &line);
TIntermSymbol *getSymbol() { return mSymbol; }
void traverse(TIntermTraverser *it) override;
bool replaceChildNode(TIntermNode *original, TIntermNode *replacement) override;
private:
TIntermSymbol *mSymbol;
};
// For ternary operators like a ? b : c. // For ternary operators like a ? b : c.
class TIntermTernary : public TIntermTyped class TIntermTernary : public TIntermTyped
{ {
...@@ -866,6 +882,10 @@ class TIntermTraverser : angle::NonCopyable ...@@ -866,6 +882,10 @@ class TIntermTraverser : angle::NonCopyable
} }
virtual bool visitAggregate(Visit visit, TIntermAggregate *node) { return true; } virtual bool visitAggregate(Visit visit, TIntermAggregate *node) { return true; }
virtual bool visitBlock(Visit visit, TIntermBlock *node) { return true; } virtual bool visitBlock(Visit visit, TIntermBlock *node) { return true; }
virtual bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node)
{
return true;
}
virtual bool visitDeclaration(Visit visit, TIntermDeclaration *node) { return true; } virtual bool visitDeclaration(Visit visit, TIntermDeclaration *node) { return true; }
virtual bool visitLoop(Visit visit, TIntermLoop *node) { return true; } virtual bool visitLoop(Visit visit, TIntermLoop *node) { return true; }
virtual bool visitBranch(Visit visit, TIntermBranch *node) { return true; } virtual bool visitBranch(Visit visit, TIntermBranch *node) { return true; }
...@@ -886,6 +906,7 @@ class TIntermTraverser : angle::NonCopyable ...@@ -886,6 +906,7 @@ class TIntermTraverser : angle::NonCopyable
virtual void traverseFunctionDefinition(TIntermFunctionDefinition *node); virtual void traverseFunctionDefinition(TIntermFunctionDefinition *node);
virtual void traverseAggregate(TIntermAggregate *node); virtual void traverseAggregate(TIntermAggregate *node);
virtual void traverseBlock(TIntermBlock *node); virtual void traverseBlock(TIntermBlock *node);
virtual void traverseInvariantDeclaration(TIntermInvariantDeclaration *node);
virtual void traverseDeclaration(TIntermDeclaration *node); virtual void traverseDeclaration(TIntermDeclaration *node);
virtual void traverseLoop(TIntermLoop *node); virtual void traverseLoop(TIntermLoop *node);
virtual void traverseBranch(TIntermBranch *node); virtual void traverseBranch(TIntermBranch *node);
......
...@@ -71,6 +71,11 @@ void TIntermBlock::traverse(TIntermTraverser *it) ...@@ -71,6 +71,11 @@ void TIntermBlock::traverse(TIntermTraverser *it)
it->traverseBlock(this); it->traverseBlock(this);
} }
void TIntermInvariantDeclaration::traverse(TIntermTraverser *it)
{
it->traverseInvariantDeclaration(this);
}
void TIntermDeclaration::traverse(TIntermTraverser *it) void TIntermDeclaration::traverse(TIntermTraverser *it)
{ {
it->traverseDeclaration(this); it->traverseDeclaration(this);
...@@ -504,6 +509,25 @@ void TIntermTraverser::traverseBlock(TIntermBlock *node) ...@@ -504,6 +509,25 @@ void TIntermTraverser::traverseBlock(TIntermBlock *node)
visitBlock(PostVisit, node); visitBlock(PostVisit, node);
} }
void TIntermTraverser::traverseInvariantDeclaration(TIntermInvariantDeclaration *node)
{
bool visit = true;
if (preVisit)
{
visit = visitInvariantDeclaration(PreVisit, node);
}
if (visit)
{
node->getSymbol()->traverse(this);
if (postVisit)
{
visitInvariantDeclaration(PostVisit, node);
}
}
}
// Traverse a declaration node. // Traverse a declaration node.
void TIntermTraverser::traverseDeclaration(TIntermDeclaration *node) void TIntermTraverser::traverseDeclaration(TIntermDeclaration *node)
{ {
......
...@@ -16,7 +16,6 @@ enum TOperator ...@@ -16,7 +16,6 @@ enum TOperator
EOpFunctionCall, EOpFunctionCall,
EOpParameters, // an aggregate listing the parameters to a function EOpParameters, // an aggregate listing the parameters to a function
EOpInvariantDeclaration, // Specialized declarations for attributing invariance
EOpPrototype, EOpPrototype,
// //
......
...@@ -959,6 +959,15 @@ bool TOutputGLSLBase::visitFunctionDefinition(Visit visit, TIntermFunctionDefini ...@@ -959,6 +959,15 @@ bool TOutputGLSLBase::visitFunctionDefinition(Visit visit, TIntermFunctionDefini
return false; return false;
} }
bool TOutputGLSLBase::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node)
{
TInfoSinkBase &out = objSink();
ASSERT(visit == PreVisit);
const TIntermSymbol *symbol = node->getSymbol();
out << "invariant " << hashVariableName(symbol->getName());
return false;
}
bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node) bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node)
{ {
bool visitChildren = true; bool visitChildren = true;
...@@ -1001,18 +1010,6 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -1001,18 +1010,6 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node)
out << ")"; out << ")";
visitChildren = false; visitChildren = false;
break; break;
case EOpInvariantDeclaration:
// Invariant declaration.
ASSERT(visit == PreVisit);
{
const TIntermSequence *sequence = node->getSequence();
ASSERT(sequence && sequence->size() == 1);
const TIntermSymbol *symbol = sequence->front()->getAsSymbolNode();
ASSERT(symbol);
out << "invariant " << hashVariableName(symbol->getName());
}
visitChildren = false;
break;
case EOpConstructFloat: case EOpConstructFloat:
case EOpConstructVec2: case EOpConstructVec2:
case EOpConstructVec3: case EOpConstructVec3:
......
...@@ -55,6 +55,7 @@ class TOutputGLSLBase : public TIntermTraverser ...@@ -55,6 +55,7 @@ class TOutputGLSLBase : public TIntermTraverser
bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override;
bool visitAggregate(Visit visit, TIntermAggregate *node) override; bool visitAggregate(Visit visit, TIntermAggregate *node) override;
bool visitBlock(Visit visit, TIntermBlock *node) override; bool visitBlock(Visit visit, TIntermBlock *node) override;
bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override;
bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
bool visitLoop(Visit visit, TIntermLoop *node) override; bool visitLoop(Visit visit, TIntermLoop *node) override;
bool visitBranch(Visit visit, TIntermBranch *node) override; bool visitBranch(Visit visit, TIntermBranch *node) override;
......
...@@ -1616,15 +1616,18 @@ bool OutputHLSL::visitDeclaration(Visit visit, TIntermDeclaration *node) ...@@ -1616,15 +1616,18 @@ bool OutputHLSL::visitDeclaration(Visit visit, TIntermDeclaration *node)
return false; return false;
} }
bool OutputHLSL::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node)
{
// Do not do any translation
return false;
}
bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
{ {
TInfoSinkBase &out = getInfoSink(); TInfoSinkBase &out = getInfoSink();
switch (node->getOp()) switch (node->getOp())
{ {
case EOpInvariantDeclaration:
// Do not do any translation
return false;
case EOpPrototype: case EOpPrototype:
if (visit == PreVisit) if (visit == PreVisit)
{ {
......
...@@ -79,6 +79,7 @@ class OutputHLSL : public TIntermTraverser ...@@ -79,6 +79,7 @@ class OutputHLSL : public TIntermTraverser
bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override;
bool visitAggregate(Visit visit, TIntermAggregate *); bool visitAggregate(Visit visit, TIntermAggregate *);
bool visitBlock(Visit visit, TIntermBlock *node); bool visitBlock(Visit visit, TIntermBlock *node);
bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node);
bool visitDeclaration(Visit visit, TIntermDeclaration *node); bool visitDeclaration(Visit visit, TIntermDeclaration *node);
bool visitLoop(Visit visit, TIntermLoop *); bool visitLoop(Visit visit, TIntermLoop *);
bool visitBranch(Visit visit, TIntermBranch *); bool visitBranch(Visit visit, TIntermBranch *);
......
...@@ -2044,7 +2044,7 @@ TIntermDeclaration *TParseContext::parseSingleArrayInitDeclaration( ...@@ -2044,7 +2044,7 @@ TIntermDeclaration *TParseContext::parseSingleArrayInitDeclaration(
return declaration; return declaration;
} }
TIntermAggregate *TParseContext::parseInvariantDeclaration( TIntermInvariantDeclaration *TParseContext::parseInvariantDeclaration(
const TTypeQualifierBuilder &typeQualifierBuilder, const TTypeQualifierBuilder &typeQualifierBuilder,
const TSourceLoc &identifierLoc, const TSourceLoc &identifierLoc,
const TString *identifier, const TString *identifier,
...@@ -2094,9 +2094,7 @@ TIntermAggregate *TParseContext::parseInvariantDeclaration( ...@@ -2094,9 +2094,7 @@ TIntermAggregate *TParseContext::parseInvariantDeclaration(
TIntermSymbol *intermSymbol = TIntermSymbol *intermSymbol =
intermediate.addSymbol(variable->getUniqueId(), *identifier, type, identifierLoc); intermediate.addSymbol(variable->getUniqueId(), *identifier, type, identifierLoc);
TIntermAggregate *aggregate = TIntermediate::MakeAggregate(intermSymbol, identifierLoc); return new TIntermInvariantDeclaration(intermSymbol, identifierLoc);
aggregate->setOp(EOpInvariantDeclaration);
return aggregate;
} }
void TParseContext::parseDeclarator(TPublicType &publicType, void TParseContext::parseDeclarator(TPublicType &publicType,
......
...@@ -212,10 +212,11 @@ class TParseContext : angle::NonCopyable ...@@ -212,10 +212,11 @@ class TParseContext : angle::NonCopyable
const TSourceLoc &initLocation, const TSourceLoc &initLocation,
TIntermTyped *initializer); TIntermTyped *initializer);
TIntermAggregate *parseInvariantDeclaration(const TTypeQualifierBuilder &typeQualifierBuilder, TIntermInvariantDeclaration *parseInvariantDeclaration(
const TSourceLoc &identifierLoc, const TTypeQualifierBuilder &typeQualifierBuilder,
const TString *identifier, const TSourceLoc &identifierLoc,
const TSymbol *symbol); const TString *identifier,
const TSymbol *symbol);
void parseDeclarator(TPublicType &publicType, void parseDeclarator(TPublicType &publicType,
const TSourceLoc &identifierLocation, const TSourceLoc &identifierLocation,
......
...@@ -22,16 +22,12 @@ class RemoveInvariantDeclarationTraverser : public TIntermTraverser ...@@ -22,16 +22,12 @@ class RemoveInvariantDeclarationTraverser : public TIntermTraverser
RemoveInvariantDeclarationTraverser() : TIntermTraverser(true, false, false) {} RemoveInvariantDeclarationTraverser() : TIntermTraverser(true, false, false) {}
private: private:
bool visitAggregate(Visit visit, TIntermAggregate *node) override bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override
{ {
if (node->getOp() == EOpInvariantDeclaration) TIntermSequence emptyReplacement;
{ mMultiReplacements.push_back(
TIntermSequence emptyReplacement; NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), node, emptyReplacement));
mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), return false;
node, emptyReplacement));
return false;
}
return true;
} }
}; };
......
...@@ -92,15 +92,18 @@ bool TVersionGLSL::visitDeclaration(Visit, TIntermDeclaration *node) ...@@ -92,15 +92,18 @@ bool TVersionGLSL::visitDeclaration(Visit, TIntermDeclaration *node)
return true; return true;
} }
bool TVersionGLSL::visitInvariantDeclaration(Visit, TIntermInvariantDeclaration *node)
{
ensureVersionIsAtLeast(GLSL_VERSION_120);
return true;
}
bool TVersionGLSL::visitAggregate(Visit, TIntermAggregate *node) bool TVersionGLSL::visitAggregate(Visit, TIntermAggregate *node)
{ {
bool visitChildren = true; bool visitChildren = true;
switch (node->getOp()) switch (node->getOp())
{ {
case EOpInvariantDeclaration:
ensureVersionIsAtLeast(GLSL_VERSION_120);
break;
case EOpParameters: case EOpParameters:
{ {
const TIntermSequence &params = *(node->getSequence()); const TIntermSequence &params = *(node->getSequence());
......
...@@ -59,8 +59,9 @@ class TVersionGLSL : public TIntermTraverser ...@@ -59,8 +59,9 @@ class TVersionGLSL : public TIntermTraverser
// Else 110 is returned. // Else 110 is returned.
int getVersion() const { return mVersion; } int getVersion() const { return mVersion; }
void visitSymbol(TIntermSymbol *) override; void visitSymbol(TIntermSymbol *node) override;
bool visitAggregate(Visit, TIntermAggregate *) override; bool visitAggregate(Visit, TIntermAggregate *node) override;
bool visitInvariantDeclaration(Visit, TIntermInvariantDeclaration *node) override;
bool visitDeclaration(Visit, TIntermDeclaration *node) override; bool visitDeclaration(Visit, TIntermDeclaration *node) override;
private: private:
......
...@@ -52,6 +52,7 @@ class TOutputTraverser : public TIntermTraverser ...@@ -52,6 +52,7 @@ class TOutputTraverser : public TIntermTraverser
bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override;
bool visitAggregate(Visit visit, TIntermAggregate *) override; bool visitAggregate(Visit visit, TIntermAggregate *) override;
bool visitBlock(Visit visit, TIntermBlock *) override; bool visitBlock(Visit visit, TIntermBlock *) override;
bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override;
bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
bool visitLoop(Visit visit, TIntermLoop *) override; bool visitLoop(Visit visit, TIntermLoop *) override;
bool visitBranch(Visit visit, TIntermBranch *) override; bool visitBranch(Visit visit, TIntermBranch *) override;
...@@ -495,6 +496,14 @@ bool TOutputTraverser::visitFunctionDefinition(Visit visit, TIntermFunctionDefin ...@@ -495,6 +496,14 @@ bool TOutputTraverser::visitFunctionDefinition(Visit visit, TIntermFunctionDefin
return true; return true;
} }
bool TOutputTraverser::visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node)
{
TInfoSinkBase &out = sink;
OutputTreeText(out, node, mDepth);
out << "Invariant Declaration:\n";
return true;
}
bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate *node) bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate *node)
{ {
TInfoSinkBase &out = sink; TInfoSinkBase &out = sink;
...@@ -677,10 +686,6 @@ bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -677,10 +686,6 @@ bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate *node)
out << "outer product"; out << "outer product";
break; break;
case EOpInvariantDeclaration:
out << "Invariant Declaration: ";
break;
default: default:
out.prefix(EPrefixError); out.prefix(EPrefixError);
out << "Bad aggregation op"; out << "Bad aggregation op";
......
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