diff options
Diffstat (limited to 'gfx/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp')
-rwxr-xr-x | gfx/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/gfx/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp b/gfx/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp index 487c90991..4ceceb226 100755 --- a/gfx/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp +++ b/gfx/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp @@ -22,6 +22,7 @@ class Traverser : public TIntermTraverser { public: static void Apply(TIntermNode *root, + unsigned int *tempIndex, const TSymbolTable &symbolTable, int shaderVersion); @@ -42,10 +43,12 @@ Traverser::Traverser(const TSymbolTable &symbolTable, int shaderVersion) // static void Traverser::Apply(TIntermNode *root, + unsigned int *tempIndex, const TSymbolTable &symbolTable, int shaderVersion) { Traverser traverser(symbolTable, shaderVersion); + traverser.useTemporaryIndex(tempIndex); do { traverser.nextIteration(); @@ -60,6 +63,7 @@ void Traverser::Apply(TIntermNode *root, void Traverser::nextIteration() { mFound = false; + nextTemporaryIndex(); } bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) @@ -75,7 +79,7 @@ bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) return true; } - if (node->getFunctionSymbolInfo()->getName().compare(0, 16, "texelFetchOffset") != 0) + if (node->getName().compare(0, 16, "texelFetchOffset") != 0) { return true; } @@ -83,36 +87,42 @@ bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) // Potential problem case detected, apply workaround. const TIntermSequence *sequence = node->getSequence(); ASSERT(sequence->size() == 4u); + nextTemporaryIndex(); // Decide if there is a 2DArray sampler. - bool is2DArray = node->getFunctionSymbolInfo()->getName().find("s2a1") != TString::npos; + bool is2DArray = node->getName().find("s2a1") != TString::npos; // Create new argument list from node->getName(). // e.g. Get "(is2a1;vi3;i1;" from "texelFetchOffset(is2a1;vi3;i1;vi2;" - TString newArgs = node->getFunctionSymbolInfo()->getName().substr( - 16, node->getFunctionSymbolInfo()->getName().length() - 20); + TString newArgs = node->getName().substr(16, node->getName().length() - 20); TString newName = "texelFetch" + newArgs; TSymbol *texelFetchSymbol = symbolTable->findBuiltIn(newName, shaderVersion); ASSERT(texelFetchSymbol); int uniqueId = texelFetchSymbol->getUniqueId(); // Create new node that represents the call of function texelFetch. - // Its argument list will be: texelFetch(sampler, Position+offset, lod). TIntermAggregate *texelFetchNode = new TIntermAggregate(EOpFunctionCall); - texelFetchNode->getFunctionSymbolInfo()->setName(newName); - texelFetchNode->getFunctionSymbolInfo()->setId(uniqueId); + texelFetchNode->setName(newName); + texelFetchNode->setFunctionId(uniqueId); texelFetchNode->setType(node->getType()); texelFetchNode->setLine(node->getLine()); + // Create argument List of texelFetch(sampler, Position+offset, lod). + TIntermSequence newsequence; + // sampler - texelFetchNode->getSequence()->push_back(sequence->at(0)); + newsequence.push_back(sequence->at(0)); + // Position+offset + TIntermBinary *add = new TIntermBinary(EOpAdd); + add->setType(node->getType()); // Position TIntermTyped *texCoordNode = sequence->at(1)->getAsTyped(); ASSERT(texCoordNode); - + add->setLine(texCoordNode->getLine()); + add->setType(texCoordNode->getType()); + add->setLeft(texCoordNode); // offset - TIntermTyped *offsetNode = nullptr; ASSERT(sequence->at(3)->getAsTyped()); if (is2DArray) { @@ -122,31 +132,28 @@ bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) constructIVec3Node->setLine(texCoordNode->getLine()); constructIVec3Node->setType(texCoordNode->getType()); - constructIVec3Node->getSequence()->push_back(sequence->at(3)->getAsTyped()); + TIntermSequence ivec3Sequence; + ivec3Sequence.push_back(sequence->at(3)->getAsTyped()); TConstantUnion *zero = new TConstantUnion(); zero->setIConst(0); TType *intType = new TType(EbtInt); TIntermConstantUnion *zeroNode = new TIntermConstantUnion(zero, *intType); - constructIVec3Node->getSequence()->push_back(zeroNode); + ivec3Sequence.push_back(zeroNode); + constructIVec3Node->insertChildNodes(0, ivec3Sequence); - offsetNode = constructIVec3Node; + add->setRight(constructIVec3Node); } else { - offsetNode = sequence->at(3)->getAsTyped(); + add->setRight(sequence->at(3)->getAsTyped()); } - - // Position+offset - TIntermBinary *add = new TIntermBinary(EOpAdd, texCoordNode, offsetNode); - add->setLine(texCoordNode->getLine()); - texelFetchNode->getSequence()->push_back(add); + newsequence.push_back(add); // lod - texelFetchNode->getSequence()->push_back(sequence->at(2)); - - ASSERT(texelFetchNode->getSequence()->size() == 3u); + newsequence.push_back(sequence->at(2)); + texelFetchNode->insertChildNodes(0, newsequence); // Replace the old node by this new node. queueReplacement(node, texelFetchNode, OriginalNode::IS_DROPPED); @@ -157,6 +164,7 @@ bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) } // anonymous namespace void RewriteTexelFetchOffset(TIntermNode *root, + unsigned int *tempIndex, const TSymbolTable &symbolTable, int shaderVersion) { @@ -164,7 +172,7 @@ void RewriteTexelFetchOffset(TIntermNode *root, if (shaderVersion < 300) return; - Traverser::Apply(root, symbolTable, shaderVersion); + Traverser::Apply(root, tempIndex, symbolTable, shaderVersion); } } // namespace sh
\ No newline at end of file |