summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/compiler/translator/FlagStd140Structs.cpp
diff options
context:
space:
mode:
authorMiguel Costa <miguel.costa@qt.io>2018-06-26 16:56:45 +0200
committerAndre de la Rocha <andre.rocha@qt.io>2018-10-13 21:36:35 +0000
commit0a7aebadfbb3534284546aa3ca8612314c08f136 (patch)
treee94ee33ae3bb9b96fc3047c6455d47ac4920bfbf /src/3rdparty/angle/src/compiler/translator/FlagStd140Structs.cpp
parent656e89f875ad2008ca16cc673b687a22daa294c9 (diff)
Update ANGLE to chromium/3280
Change-Id: I0802c0d7486f772d361f87a544d6c5af937f4ca1 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/FlagStd140Structs.cpp')
-rw-r--r--src/3rdparty/angle/src/compiler/translator/FlagStd140Structs.cpp88
1 files changed, 43 insertions, 45 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/FlagStd140Structs.cpp b/src/3rdparty/angle/src/compiler/translator/FlagStd140Structs.cpp
index a751b768b7..fba837f55c 100644
--- a/src/3rdparty/angle/src/compiler/translator/FlagStd140Structs.cpp
+++ b/src/3rdparty/angle/src/compiler/translator/FlagStd140Structs.cpp
@@ -3,75 +3,73 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
+// FlagStd140Structs.cpp: Find structs in std140 blocks, where the padding added in the translator
+// conflicts with the "natural" unpadded type.
#include "compiler/translator/FlagStd140Structs.h"
+#include "compiler/translator/IntermTraverse.h"
+
namespace sh
{
-bool FlagStd140Structs::visitBinary(Visit visit, TIntermBinary *binaryNode)
+namespace
{
- if (binaryNode->getRight()->getBasicType() == EbtStruct)
- {
- switch (binaryNode->getOp())
- {
- case EOpIndexDirectInterfaceBlock:
- case EOpIndexDirectStruct:
- if (isInStd140InterfaceBlock(binaryNode->getLeft()))
- {
- mFlaggedNodes.push_back(binaryNode);
- }
- break;
-
- default: break;
- }
- return false;
- }
- if (binaryNode->getOp() == EOpIndexDirectStruct)
- {
- return false;
- }
+class FlagStd140StructsTraverser : public TIntermTraverser
+{
+ public:
+ FlagStd140StructsTraverser() : TIntermTraverser(true, false, false) {}
- return visit == PreVisit;
-}
+ const std::vector<MappedStruct> getMappedStructs() const { return mMappedStructs; }
+
+ protected:
+ bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
+
+ private:
+ void mapBlockStructMembers(TIntermSymbol *blockDeclarator, TInterfaceBlock *block);
+
+ std::vector<MappedStruct> mMappedStructs;
+};
-void FlagStd140Structs::visitSymbol(TIntermSymbol *symbol)
+void FlagStd140StructsTraverser::mapBlockStructMembers(TIntermSymbol *blockDeclarator,
+ TInterfaceBlock *block)
{
- if (isInStd140InterfaceBlock(symbol) && symbol->getBasicType() == EbtStruct)
+ for (auto *field : block->fields())
{
- mFlaggedNodes.push_back(symbol);
+ if (field->type()->getBasicType() == EbtStruct)
+ {
+ MappedStruct mappedStruct;
+ mappedStruct.blockDeclarator = blockDeclarator;
+ mappedStruct.field = field;
+ mMappedStructs.push_back(mappedStruct);
+ }
}
}
-bool FlagStd140Structs::isInStd140InterfaceBlock(TIntermTyped *node) const
+bool FlagStd140StructsTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node)
{
- TIntermBinary *binaryNode = node->getAsBinaryNode();
-
- if (binaryNode)
- {
- return isInStd140InterfaceBlock(binaryNode->getLeft());
- }
-
- const TType &type = node->getType();
-
- // determine if we are in the standard layout
- const TInterfaceBlock *interfaceBlock = type.getInterfaceBlock();
- if (interfaceBlock)
+ TIntermTyped *declarator = node->getSequence()->back()->getAsTyped();
+ if (declarator->getBasicType() == EbtInterfaceBlock)
{
- return (interfaceBlock->blockStorage() == EbsStd140);
+ TInterfaceBlock *block = declarator->getType().getInterfaceBlock();
+ if (block->blockStorage() == EbsStd140)
+ {
+ mapBlockStructMembers(declarator->getAsSymbolNode(), block);
+ }
}
-
return false;
}
-std::vector<TIntermTyped *> FlagStd140ValueStructs(TIntermNode *node)
+} // anonymous namespace
+
+std::vector<MappedStruct> FlagStd140Structs(TIntermNode *node)
{
- FlagStd140Structs flaggingTraversal;
+ FlagStd140StructsTraverser flaggingTraversal;
node->traverse(&flaggingTraversal);
- return flaggingTraversal.getFlaggedNodes();
+ return flaggingTraversal.getMappedStructs();
}
-}
+} // namespace sh