Commit b79b3f96 by Olli Etuaho Committed by Commit Bot

Assign symbol ids in RemoveDynamicIndexing

Assign consistent symbol ids to out base, index and value nodes that get created in RemoveDynamicIndexing. Some utility functions in RemoveDynamicIndexing have also now become unnecessary now that there are better generic helpers and node constructors. BUG=angleproject:1490 TEST=angle_unittests, angle_end2end_tests Change-Id: I98891e448b85d51518dbf3156ec93f9661def57e Reviewed-on: https://chromium-review.googlesource.com/580954Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 3db4072a
...@@ -57,25 +57,26 @@ std::string GetIndexFunctionName(const TType &type, bool write) ...@@ -57,25 +57,26 @@ std::string GetIndexFunctionName(const TType &type, bool write)
return nameSink.str(); return nameSink.str();
} }
TIntermSymbol *CreateBaseSymbol(const TType &type, TQualifier qualifier) TIntermSymbol *CreateBaseSymbol(const TType &type, TQualifier qualifier, TSymbolTable *symbolTable)
{ {
TIntermSymbol *symbol = new TIntermSymbol(0, "base", type); TIntermSymbol *symbol = new TIntermSymbol(symbolTable->nextUniqueId(), "base", type);
symbol->setInternal(true); symbol->setInternal(true);
symbol->getTypePointer()->setQualifier(qualifier); symbol->getTypePointer()->setQualifier(qualifier);
return symbol; return symbol;
} }
TIntermSymbol *CreateIndexSymbol() TIntermSymbol *CreateIndexSymbol(TSymbolTable *symbolTable)
{ {
TIntermSymbol *symbol = new TIntermSymbol(0, "index", TType(EbtInt, EbpHigh)); TIntermSymbol *symbol =
new TIntermSymbol(symbolTable->nextUniqueId(), "index", TType(EbtInt, EbpHigh));
symbol->setInternal(true); symbol->setInternal(true);
symbol->getTypePointer()->setQualifier(EvqIn); symbol->getTypePointer()->setQualifier(EvqIn);
return symbol; return symbol;
} }
TIntermSymbol *CreateValueSymbol(const TType &type) TIntermSymbol *CreateValueSymbol(const TType &type, TSymbolTable *symbolTable)
{ {
TIntermSymbol *symbol = new TIntermSymbol(0, "value", type); TIntermSymbol *symbol = new TIntermSymbol(symbolTable->nextUniqueId(), "value", type);
symbol->setInternal(true); symbol->setInternal(true);
symbol->getTypePointer()->setQualifier(EvqIn); symbol->getTypePointer()->setQualifier(EvqIn);
return symbol; return symbol;
...@@ -88,22 +89,6 @@ TIntermConstantUnion *CreateIntConstantNode(int i) ...@@ -88,22 +89,6 @@ TIntermConstantUnion *CreateIntConstantNode(int i)
return new TIntermConstantUnion(constant, TType(EbtInt, EbpHigh)); return new TIntermConstantUnion(constant, TType(EbtInt, EbpHigh));
} }
TIntermBinary *CreateIndexDirectBaseSymbolNode(const TType &indexedType,
const TType &fieldType,
const int index,
TQualifier baseQualifier)
{
TIntermSymbol *baseSymbol = CreateBaseSymbol(indexedType, baseQualifier);
TIntermBinary *indexNode =
new TIntermBinary(EOpIndexDirect, baseSymbol, CreateIndexNode(index));
return indexNode;
}
TIntermBinary *CreateAssignValueSymbolNode(TIntermTyped *targetNode, const TType &assignedValueType)
{
return new TIntermBinary(EOpAssign, targetNode, CreateValueSymbol(assignedValueType));
}
TIntermTyped *EnsureSignedInt(TIntermTyped *node) TIntermTyped *EnsureSignedInt(TIntermTyped *node)
{ {
if (node->getBasicType() == EbtInt) if (node->getBasicType() == EbtInt)
...@@ -173,7 +158,8 @@ TType GetFieldType(const TType &indexedType) ...@@ -173,7 +158,8 @@ TType GetFieldType(const TType &indexedType)
// Note that else is not used in above functions to avoid the RewriteElseBlocks transformation. // Note that else is not used in above functions to avoid the RewriteElseBlocks transformation.
TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type, TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type,
bool write, bool write,
const TSymbolUniqueId &functionId) const TSymbolUniqueId &functionId,
TSymbolTable *symbolTable)
{ {
ASSERT(!type.isArray()); ASSERT(!type.isArray());
// Conservatively use highp here, even if the indexed type is not highp. That way the code can't // Conservatively use highp here, even if the indexed type is not highp. That way the code can't
...@@ -206,13 +192,14 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type, ...@@ -206,13 +192,14 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type,
TQualifier baseQualifier = EvqInOut; TQualifier baseQualifier = EvqInOut;
if (!write) if (!write)
baseQualifier = EvqIn; baseQualifier = EvqIn;
TIntermSymbol *baseParam = CreateBaseSymbol(type, baseQualifier); TIntermSymbol *baseParam = CreateBaseSymbol(type, baseQualifier, symbolTable);
prototypeNode->getSequence()->push_back(baseParam); prototypeNode->getSequence()->push_back(baseParam);
TIntermSymbol *indexParam = CreateIndexSymbol(); TIntermSymbol *indexParam = CreateIndexSymbol(symbolTable);
prototypeNode->getSequence()->push_back(indexParam); prototypeNode->getSequence()->push_back(indexParam);
TIntermSymbol *valueParam = nullptr;
if (write) if (write)
{ {
TIntermSymbol *valueParam = CreateValueSymbol(fieldType); valueParam = CreateValueSymbol(fieldType, symbolTable);
prototypeNode->getSequence()->push_back(valueParam); prototypeNode->getSequence()->push_back(valueParam);
} }
...@@ -223,10 +210,11 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type, ...@@ -223,10 +210,11 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type,
statementList->getSequence()->push_back(caseNode); statementList->getSequence()->push_back(caseNode);
TIntermBinary *indexNode = TIntermBinary *indexNode =
CreateIndexDirectBaseSymbolNode(type, fieldType, i, baseQualifier); new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(i));
if (write) if (write)
{ {
TIntermBinary *assignNode = CreateAssignValueSymbolNode(indexNode, fieldType); TIntermBinary *assignNode =
new TIntermBinary(EOpAssign, indexNode, valueParam->deepCopy());
statementList->getSequence()->push_back(assignNode); statementList->getSequence()->push_back(assignNode);
TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr); TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr);
statementList->getSequence()->push_back(returnNode); statementList->getSequence()->push_back(returnNode);
...@@ -244,13 +232,13 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type, ...@@ -244,13 +232,13 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type,
TIntermBranch *breakNode = new TIntermBranch(EOpBreak, nullptr); TIntermBranch *breakNode = new TIntermBranch(EOpBreak, nullptr);
statementList->getSequence()->push_back(breakNode); statementList->getSequence()->push_back(breakNode);
TIntermSwitch *switchNode = new TIntermSwitch(CreateIndexSymbol(), statementList); TIntermSwitch *switchNode = new TIntermSwitch(indexParam->deepCopy(), statementList);
TIntermBlock *bodyNode = new TIntermBlock(); TIntermBlock *bodyNode = new TIntermBlock();
bodyNode->getSequence()->push_back(switchNode); bodyNode->getSequence()->push_back(switchNode);
TIntermBinary *cond = TIntermBinary *cond =
new TIntermBinary(EOpLessThan, CreateIndexSymbol(), CreateIntConstantNode(0)); new TIntermBinary(EOpLessThan, indexParam->deepCopy(), CreateIntConstantNode(0));
cond->setType(TType(EbtBool, EbpUndefined)); cond->setType(TType(EbtBool, EbpUndefined));
// Two blocks: one accesses (either reads or writes) the first element and returns, // Two blocks: one accesses (either reads or writes) the first element and returns,
...@@ -258,17 +246,19 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type, ...@@ -258,17 +246,19 @@ TIntermFunctionDefinition *GetIndexFunctionDefinition(TType type,
TIntermBlock *useFirstBlock = new TIntermBlock(); TIntermBlock *useFirstBlock = new TIntermBlock();
TIntermBlock *useLastBlock = new TIntermBlock(); TIntermBlock *useLastBlock = new TIntermBlock();
TIntermBinary *indexFirstNode = TIntermBinary *indexFirstNode =
CreateIndexDirectBaseSymbolNode(type, fieldType, 0, baseQualifier); new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(0));
TIntermBinary *indexLastNode = TIntermBinary *indexLastNode =
CreateIndexDirectBaseSymbolNode(type, fieldType, numCases - 1, baseQualifier); new TIntermBinary(EOpIndexDirect, baseParam->deepCopy(), CreateIndexNode(numCases - 1));
if (write) if (write)
{ {
TIntermBinary *assignFirstNode = CreateAssignValueSymbolNode(indexFirstNode, fieldType); TIntermBinary *assignFirstNode =
new TIntermBinary(EOpAssign, indexFirstNode, valueParam->deepCopy());
useFirstBlock->getSequence()->push_back(assignFirstNode); useFirstBlock->getSequence()->push_back(assignFirstNode);
TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr); TIntermBranch *returnNode = new TIntermBranch(EOpReturn, nullptr);
useFirstBlock->getSequence()->push_back(returnNode); useFirstBlock->getSequence()->push_back(returnNode);
TIntermBinary *assignLastNode = CreateAssignValueSymbolNode(indexLastNode, fieldType); TIntermBinary *assignLastNode =
new TIntermBinary(EOpAssign, indexLastNode, valueParam->deepCopy());
useLastBlock->getSequence()->push_back(assignLastNode); useLastBlock->getSequence()->push_back(assignLastNode);
} }
else else
...@@ -332,11 +322,13 @@ void RemoveDynamicIndexingTraverser::insertHelperDefinitions(TIntermNode *root) ...@@ -332,11 +322,13 @@ 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, mSymbolTable));
} }
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, mSymbolTable));
} }
mInsertions.push_back(NodeInsertMultipleEntry(rootBlock, 0, insertions, TIntermSequence())); mInsertions.push_back(NodeInsertMultipleEntry(rootBlock, 0, insertions, TIntermSequence()));
} }
......
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