diff options
author | wolfbeast <mcwerewolf@gmail.com> | 2018-08-05 11:35:53 +0200 |
---|---|---|
committer | wolfbeast <mcwerewolf@gmail.com> | 2018-08-05 11:35:53 +0200 |
commit | 6bd66b1728eeddb058066edda740aaeb2ceaec23 (patch) | |
tree | 985faf01c526763515731569fa01a99f4dbef36e /gfx/angle/src/compiler/translator/UseInterfaceBlockFields.cpp | |
parent | e0a8dcfed131ffa58a5e2cb1d30fe48c745c2fdc (diff) | |
parent | 559824514dc95e02fbe81f1786e6ac13ee8e9d55 (diff) | |
download | UXP-6bd66b1728eeddb058066edda740aaeb2ceaec23.tar UXP-6bd66b1728eeddb058066edda740aaeb2ceaec23.tar.gz UXP-6bd66b1728eeddb058066edda740aaeb2ceaec23.tar.lz UXP-6bd66b1728eeddb058066edda740aaeb2ceaec23.tar.xz UXP-6bd66b1728eeddb058066edda740aaeb2ceaec23.zip |
Merge branch 'master' into js-modules
Diffstat (limited to 'gfx/angle/src/compiler/translator/UseInterfaceBlockFields.cpp')
-rw-r--r-- | gfx/angle/src/compiler/translator/UseInterfaceBlockFields.cpp | 163 |
1 files changed, 0 insertions, 163 deletions
diff --git a/gfx/angle/src/compiler/translator/UseInterfaceBlockFields.cpp b/gfx/angle/src/compiler/translator/UseInterfaceBlockFields.cpp deleted file mode 100644 index 390e2b092..000000000 --- a/gfx/angle/src/compiler/translator/UseInterfaceBlockFields.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// -// Copyright 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. -// - -// UseInterfaceBlockFields.cpp: insert statements to reference all members in InterfaceBlock list at -// the beginning of main. This is to work around a Mac driver that treats unused standard/shared -// uniform blocks as inactive. - -#include "compiler/translator/UseInterfaceBlockFields.h" - -#include "compiler/translator/IntermNode.h" -#include "compiler/translator/SymbolTable.h" -#include "compiler/translator/util.h" - -namespace sh -{ - -namespace -{ - -class UseUniformBlockMembers : public TIntermTraverser -{ - public: - UseUniformBlockMembers(const InterfaceBlockList &blocks, const TSymbolTable &symbolTable) - : TIntermTraverser(true, false, false), - mBlocks(blocks), - mSymbolTable(symbolTable), - mCodeInserted(false) - { - ASSERT(mSymbolTable.atGlobalLevel()); - } - - protected: - bool visitAggregate(Visit visit, TIntermAggregate *node) override { return !mCodeInserted; } - bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; - - private: - void insertUseCode(TIntermSequence *sequence); - void AddFieldUseStatements(const ShaderVariable &var, TIntermSequence *sequence); - - const InterfaceBlockList &mBlocks; - const TSymbolTable &mSymbolTable; - bool mCodeInserted; -}; - -bool UseUniformBlockMembers::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) -{ - ASSERT(visit == PreVisit); - if (node->getFunctionSymbolInfo()->isMain()) - { - TIntermBlock *body = node->getBody(); - ASSERT(body); - insertUseCode(body->getSequence()); - mCodeInserted = true; - return false; - } - return !mCodeInserted; -} - -void UseUniformBlockMembers::AddFieldUseStatements(const ShaderVariable &var, - TIntermSequence *sequence) -{ - TString name = TString(var.name.c_str()); - if (var.isArray()) - { - size_t pos = name.find_last_of('['); - if (pos != TString::npos) - { - name = name.substr(0, pos); - } - } - const TType *type; - TType basicType; - if (var.isStruct()) - { - TVariable *structInfo = reinterpret_cast<TVariable *>(mSymbolTable.findGlobal(name)); - ASSERT(structInfo); - const TType &structType = structInfo->getType(); - type = &structType; - } - else - { - basicType = sh::GetShaderVariableBasicType(var); - type = &basicType; - } - ASSERT(type); - - TIntermSymbol *symbol = new TIntermSymbol(0, name, *type); - if (var.isArray()) - { - for (unsigned int i = 0; i < var.arraySize; ++i) - { - TIntermBinary *element = - new TIntermBinary(EOpIndexDirect, symbol, TIntermTyped::CreateIndexNode(i)); - sequence->insert(sequence->begin(), element); - } - } - else - { - sequence->insert(sequence->begin(), symbol); - } -} - -void UseUniformBlockMembers::insertUseCode(TIntermSequence *sequence) -{ - for (const auto &block : mBlocks) - { - if (block.instanceName.empty()) - { - for (const auto &var : block.fields) - { - AddFieldUseStatements(var, sequence); - } - } - else if (block.arraySize > 0) - { - TString name = TString(block.instanceName.c_str()); - TVariable *ubInfo = reinterpret_cast<TVariable *>(mSymbolTable.findGlobal(name)); - ASSERT(ubInfo); - TIntermSymbol *arraySymbol = new TIntermSymbol(0, name, ubInfo->getType()); - for (unsigned int i = 0; i < block.arraySize; ++i) - { - TIntermBinary *instanceSymbol = new TIntermBinary(EOpIndexDirect, arraySymbol, - TIntermTyped::CreateIndexNode(i)); - for (unsigned int j = 0; j < block.fields.size(); ++j) - { - TIntermBinary *element = - new TIntermBinary(EOpIndexDirectInterfaceBlock, instanceSymbol, - TIntermTyped::CreateIndexNode(j)); - sequence->insert(sequence->begin(), element); - } - } - } - else - { - TString name = TString(block.instanceName.c_str()); - TVariable *ubInfo = reinterpret_cast<TVariable *>(mSymbolTable.findGlobal(name)); - ASSERT(ubInfo); - TIntermSymbol *blockSymbol = new TIntermSymbol(0, name, ubInfo->getType()); - for (unsigned int i = 0; i < block.fields.size(); ++i) - { - TIntermBinary *element = new TIntermBinary( - EOpIndexDirectInterfaceBlock, blockSymbol, TIntermTyped::CreateIndexNode(i)); - - sequence->insert(sequence->begin(), element); - } - } - } -} - -} // namespace anonymous - -void UseInterfaceBlockFields(TIntermNode *root, - const InterfaceBlockList &blocks, - const TSymbolTable &symbolTable) -{ - UseUniformBlockMembers useUniformBlock(blocks, symbolTable); - root->traverse(&useUniformBlock); -} - -} // namespace sh |