diff options
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp')
-rw-r--r-- | src/3rdparty/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp | 154 |
1 files changed, 0 insertions, 154 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp b/src/3rdparty/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp deleted file mode 100644 index b602e0c923..0000000000 --- a/src/3rdparty/angle/src/compiler/translator/RewriteTexelFetchOffset.cpp +++ /dev/null @@ -1,154 +0,0 @@ -// -// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// -// Implementation of texelFetchOffset translation issue workaround. -// See header for more info. - -#include "compiler/translator/RewriteTexelFetchOffset.h" - -#include "common/angleutils.h" -#include "compiler/translator/IntermNode_util.h" -#include "compiler/translator/IntermTraverse.h" -#include "compiler/translator/SymbolTable.h" - -namespace sh -{ - -namespace -{ - -class Traverser : public TIntermTraverser -{ - public: - static void Apply(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion); - - private: - Traverser(const TSymbolTable &symbolTable, int shaderVersion); - bool visitAggregate(Visit visit, TIntermAggregate *node) override; - void nextIteration(); - - const TSymbolTable *symbolTable; - const int shaderVersion; - bool mFound = false; -}; - -Traverser::Traverser(const TSymbolTable &symbolTable, int shaderVersion) - : TIntermTraverser(true, false, false), symbolTable(&symbolTable), shaderVersion(shaderVersion) -{ -} - -// static -void Traverser::Apply(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion) -{ - Traverser traverser(symbolTable, shaderVersion); - do - { - traverser.nextIteration(); - root->traverse(&traverser); - if (traverser.mFound) - { - traverser.updateTree(); - } - } while (traverser.mFound); -} - -void Traverser::nextIteration() -{ - mFound = false; -} - -bool Traverser::visitAggregate(Visit visit, TIntermAggregate *node) -{ - if (mFound) - { - return false; - } - - // Decide if the node represents the call of texelFetchOffset. - if (node->getOp() != EOpCallBuiltInFunction) - { - return true; - } - - if (node->getFunctionSymbolInfo()->getName() != "texelFetchOffset") - { - return true; - } - - // Potential problem case detected, apply workaround. - const TIntermSequence *sequence = node->getSequence(); - ASSERT(sequence->size() == 4u); - - // Decide if the sampler is a 2DArray sampler. In that case position is ivec3 and offset is - // ivec2. - bool is2DArray = sequence->at(1)->getAsTyped()->getNominalSize() == 3 && - sequence->at(3)->getAsTyped()->getNominalSize() == 2; - - // Create new node that represents the call of function texelFetch. - // Its argument list will be: texelFetch(sampler, Position+offset, lod). - - TIntermSequence *texelFetchArguments = new TIntermSequence(); - - // sampler - texelFetchArguments->push_back(sequence->at(0)); - - // Position - TIntermTyped *texCoordNode = sequence->at(1)->getAsTyped(); - ASSERT(texCoordNode); - - // offset - TIntermTyped *offsetNode = nullptr; - ASSERT(sequence->at(3)->getAsTyped()); - if (is2DArray) - { - // For 2DArray samplers, Position is ivec3 and offset is ivec2; - // So offset must be converted into an ivec3 before being added to Position. - TIntermSequence *constructOffsetIvecArguments = new TIntermSequence(); - constructOffsetIvecArguments->push_back(sequence->at(3)->getAsTyped()); - - TIntermTyped *zeroNode = CreateZeroNode(TType(EbtInt)); - constructOffsetIvecArguments->push_back(zeroNode); - - offsetNode = TIntermAggregate::CreateConstructor(texCoordNode->getType(), - constructOffsetIvecArguments); - offsetNode->setLine(texCoordNode->getLine()); - } - else - { - offsetNode = sequence->at(3)->getAsTyped(); - } - - // Position+offset - TIntermBinary *add = new TIntermBinary(EOpAdd, texCoordNode, offsetNode); - add->setLine(texCoordNode->getLine()); - texelFetchArguments->push_back(add); - - // lod - texelFetchArguments->push_back(sequence->at(2)); - - ASSERT(texelFetchArguments->size() == 3u); - - TIntermTyped *texelFetchNode = CreateBuiltInFunctionCallNode("texelFetch", texelFetchArguments, - *symbolTable, shaderVersion); - texelFetchNode->setLine(node->getLine()); - - // Replace the old node by this new node. - queueReplacement(texelFetchNode, OriginalNode::IS_DROPPED); - mFound = true; - return false; -} - -} // anonymous namespace - -void RewriteTexelFetchOffset(TIntermNode *root, const TSymbolTable &symbolTable, int shaderVersion) -{ - // texelFetchOffset is only valid in GLSL 3.0 and later. - if (shaderVersion < 300) - return; - - Traverser::Apply(root, symbolTable, shaderVersion); -} - -} // namespace sh
\ No newline at end of file |