blob: fba837f55c7a9478e7b8988862e5f93ab5ab6034 [file] [log] [blame]
Jamie Madill570e04d2013-06-21 09:15:33 -04001//
2// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
Olli Etuaho2ef23e22017-11-01 16:39:11 +02006// FlagStd140Structs.cpp: Find structs in std140 blocks, where the padding added in the translator
7// conflicts with the "natural" unpadded type.
Jamie Madill570e04d2013-06-21 09:15:33 -04008
Geoff Lang17732822013-08-29 13:46:49 -04009#include "compiler/translator/FlagStd140Structs.h"
Jamie Madill570e04d2013-06-21 09:15:33 -040010
Olli Etuaho2ef23e22017-11-01 16:39:11 +020011#include "compiler/translator/IntermTraverse.h"
12
Jamie Madill570e04d2013-06-21 09:15:33 -040013namespace sh
14{
15
Olli Etuaho2ef23e22017-11-01 16:39:11 +020016namespace
Jamie Madill570e04d2013-06-21 09:15:33 -040017{
Olli Etuaho2ef23e22017-11-01 16:39:11 +020018
19class FlagStd140StructsTraverser : public TIntermTraverser
20{
21 public:
22 FlagStd140StructsTraverser() : TIntermTraverser(true, false, false) {}
23
24 const std::vector<MappedStruct> getMappedStructs() const { return mMappedStructs; }
25
26 protected:
27 bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
28
29 private:
30 void mapBlockStructMembers(TIntermSymbol *blockDeclarator, TInterfaceBlock *block);
31
32 std::vector<MappedStruct> mMappedStructs;
33};
34
35void FlagStd140StructsTraverser::mapBlockStructMembers(TIntermSymbol *blockDeclarator,
36 TInterfaceBlock *block)
37{
38 for (auto *field : block->fields())
Jamie Madill570e04d2013-06-21 09:15:33 -040039 {
Olli Etuaho2ef23e22017-11-01 16:39:11 +020040 if (field->type()->getBasicType() == EbtStruct)
Jamie Madill570e04d2013-06-21 09:15:33 -040041 {
Olli Etuaho2ef23e22017-11-01 16:39:11 +020042 MappedStruct mappedStruct;
43 mappedStruct.blockDeclarator = blockDeclarator;
44 mappedStruct.field = field;
45 mMappedStructs.push_back(mappedStruct);
Jamie Madill570e04d2013-06-21 09:15:33 -040046 }
Jamie Madill570e04d2013-06-21 09:15:33 -040047 }
48}
49
Olli Etuaho2ef23e22017-11-01 16:39:11 +020050bool FlagStd140StructsTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node)
Jamie Madill570e04d2013-06-21 09:15:33 -040051{
Olli Etuaho2ef23e22017-11-01 16:39:11 +020052 TIntermTyped *declarator = node->getSequence()->back()->getAsTyped();
53 if (declarator->getBasicType() == EbtInterfaceBlock)
Jamie Madill570e04d2013-06-21 09:15:33 -040054 {
Olli Etuaho2ef23e22017-11-01 16:39:11 +020055 TInterfaceBlock *block = declarator->getType().getInterfaceBlock();
56 if (block->blockStorage() == EbsStd140)
57 {
58 mapBlockStructMembers(declarator->getAsSymbolNode(), block);
59 }
Jamie Madill570e04d2013-06-21 09:15:33 -040060 }
Jamie Madill570e04d2013-06-21 09:15:33 -040061 return false;
62}
63
Olli Etuaho2ef23e22017-11-01 16:39:11 +020064} // anonymous namespace
65
66std::vector<MappedStruct> FlagStd140Structs(TIntermNode *node)
Jamie Madill570e04d2013-06-21 09:15:33 -040067{
Olli Etuaho2ef23e22017-11-01 16:39:11 +020068 FlagStd140StructsTraverser flaggingTraversal;
Jamie Madill570e04d2013-06-21 09:15:33 -040069
70 node->traverse(&flaggingTraversal);
71
Olli Etuaho2ef23e22017-11-01 16:39:11 +020072 return flaggingTraversal.getMappedStructs();
Jamie Madill570e04d2013-06-21 09:15:33 -040073}
Olli Etuaho2ef23e22017-11-01 16:39:11 +020074
75} // namespace sh