diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2019-04-16 16:32:08 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2019-04-16 16:32:08 +0200 |
commit | 6630937e63ae5797487b86743a7733c8ae5cc42c (patch) | |
tree | 3d53dacf6430f9099e1fb20835881205de674961 /src/3rdparty/angle/src/compiler/translator/SeparateArrayInitialization.cpp | |
parent | 37ed6dae00640f9cc980ffda05347c12a7eb5d7e (diff) | |
parent | c7af193d2e49e9f10b86262e63d8d13abf72b5cf (diff) |
Merge commit 'dev' into 'wip/cmake-merge'
Change-Id: I176c40d031be26a1dd1cf08843e448a660598783
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/SeparateArrayInitialization.cpp')
-rw-r--r-- | src/3rdparty/angle/src/compiler/translator/SeparateArrayInitialization.cpp | 76 |
1 files changed, 38 insertions, 38 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/SeparateArrayInitialization.cpp b/src/3rdparty/angle/src/compiler/translator/SeparateArrayInitialization.cpp index de9050cd80..fe25823e38 100644 --- a/src/3rdparty/angle/src/compiler/translator/SeparateArrayInitialization.cpp +++ b/src/3rdparty/angle/src/compiler/translator/SeparateArrayInitialization.cpp @@ -3,7 +3,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// The SeparateArrayInitialization function splits each array initialization into a declaration and an assignment. +// The SeparateArrayInitialization function splits each array initialization into a declaration and +// an assignment. // Example: // type[n] a = initializer; // will effectively become @@ -20,6 +21,9 @@ #include "compiler/translator/IntermNode.h" #include "compiler/translator/OutputHLSL.h" +namespace sh +{ + namespace { @@ -27,9 +31,10 @@ class SeparateArrayInitTraverser : private TIntermTraverser { public: static void apply(TIntermNode *root); + private: SeparateArrayInitTraverser(); - bool visitAggregate(Visit, TIntermAggregate *node) override; + bool visitDeclaration(Visit, TIntermDeclaration *node) override; }; void SeparateArrayInitTraverser::apply(TIntermNode *root) @@ -39,54 +44,49 @@ void SeparateArrayInitTraverser::apply(TIntermNode *root) separateInit.updateTree(); } -SeparateArrayInitTraverser::SeparateArrayInitTraverser() - : TIntermTraverser(true, false, false) +SeparateArrayInitTraverser::SeparateArrayInitTraverser() : TIntermTraverser(true, false, false) { } -bool SeparateArrayInitTraverser::visitAggregate(Visit, TIntermAggregate *node) +bool SeparateArrayInitTraverser::visitDeclaration(Visit, TIntermDeclaration *node) { - if (node->getOp() == EOpDeclaration) + TIntermSequence *sequence = node->getSequence(); + TIntermBinary *initNode = sequence->back()->getAsBinaryNode(); + if (initNode != nullptr && initNode->getOp() == EOpInitialize) { - TIntermSequence *sequence = node->getSequence(); - TIntermBinary *initNode = sequence->back()->getAsBinaryNode(); - if (initNode != nullptr && initNode->getOp() == EOpInitialize) + TIntermTyped *initializer = initNode->getRight(); + if (initializer->isArray() && !sh::OutputHLSL::canWriteAsHLSLLiteral(initializer)) { - TIntermTyped *initializer = initNode->getRight(); - if (initializer->isArray() && !sh::OutputHLSL::canWriteAsHLSLLiteral(initializer)) - { - // We rely on that array declarations have been isolated to single declarations. - ASSERT(sequence->size() == 1); - TIntermTyped *symbol = initNode->getLeft(); - TIntermAggregate *parentAgg = getParentNode()->getAsAggregate(); - ASSERT(parentAgg != nullptr); - - TIntermSequence replacements; - - TIntermAggregate *replacementDeclaration = new TIntermAggregate; - replacementDeclaration->setOp(EOpDeclaration); - replacementDeclaration->getSequence()->push_back(symbol); - replacementDeclaration->setLine(symbol->getLine()); - replacements.push_back(replacementDeclaration); - - TIntermBinary *replacementAssignment = new TIntermBinary(EOpAssign); - replacementAssignment->setLeft(symbol); - replacementAssignment->setRight(initializer); - replacementAssignment->setType(initializer->getType()); - replacementAssignment->setLine(symbol->getLine()); - replacements.push_back(replacementAssignment); - - mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(parentAgg, node, replacements)); - } + // We rely on that array declarations have been isolated to single declarations. + ASSERT(sequence->size() == 1); + TIntermTyped *symbol = initNode->getLeft(); + TIntermBlock *parentBlock = getParentNode()->getAsBlock(); + ASSERT(parentBlock != nullptr); + + TIntermSequence replacements; + + TIntermDeclaration *replacementDeclaration = new TIntermDeclaration(); + replacementDeclaration->appendDeclarator(symbol); + replacementDeclaration->setLine(symbol->getLine()); + replacements.push_back(replacementDeclaration); + + TIntermBinary *replacementAssignment = + new TIntermBinary(EOpAssign, symbol, initializer); + replacementAssignment->setLine(symbol->getLine()); + replacements.push_back(replacementAssignment); + + mMultiReplacements.push_back( + NodeReplaceWithMultipleEntry(parentBlock, node, replacements)); } - return false; } - return true; + return false; } -} // namespace +} // namespace void SeparateArrayInitialization(TIntermNode *root) { SeparateArrayInitTraverser::apply(root); } + +} // namespace sh |