xref: /aosp_15_r20/external/angle/src/compiler/translator/FlagStd140Structs.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2013 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // FlagStd140Structs.cpp: Find structs in std140 blocks, where the padding added in the translator
7*8975f5c5SAndroid Build Coastguard Worker // conflicts with the "natural" unpadded type.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/FlagStd140Structs.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/SymbolTable.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/tree_util/IntermTraverse.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker namespace sh
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker class FlagStd140StructsTraverser : public TIntermTraverser
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker   public:
FlagStd140StructsTraverser()23*8975f5c5SAndroid Build Coastguard Worker     FlagStd140StructsTraverser() : TIntermTraverser(true, false, false) {}
24*8975f5c5SAndroid Build Coastguard Worker 
getMappedStructs() const25*8975f5c5SAndroid Build Coastguard Worker     const std::vector<MappedStruct> getMappedStructs() const { return mMappedStructs; }
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker   protected:
28*8975f5c5SAndroid Build Coastguard Worker     bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker   private:
31*8975f5c5SAndroid Build Coastguard Worker     void mapBlockStructMembers(TIntermSymbol *blockDeclarator, const TInterfaceBlock *block);
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker     std::vector<MappedStruct> mMappedStructs;
34*8975f5c5SAndroid Build Coastguard Worker };
35*8975f5c5SAndroid Build Coastguard Worker 
mapBlockStructMembers(TIntermSymbol * blockDeclarator,const TInterfaceBlock * block)36*8975f5c5SAndroid Build Coastguard Worker void FlagStd140StructsTraverser::mapBlockStructMembers(TIntermSymbol *blockDeclarator,
37*8975f5c5SAndroid Build Coastguard Worker                                                        const TInterfaceBlock *block)
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker     for (auto *field : block->fields())
40*8975f5c5SAndroid Build Coastguard Worker     {
41*8975f5c5SAndroid Build Coastguard Worker         if (field->type()->getBasicType() == EbtStruct)
42*8975f5c5SAndroid Build Coastguard Worker         {
43*8975f5c5SAndroid Build Coastguard Worker             MappedStruct mappedStruct;
44*8975f5c5SAndroid Build Coastguard Worker             mappedStruct.blockDeclarator = blockDeclarator;
45*8975f5c5SAndroid Build Coastguard Worker             mappedStruct.field           = field;
46*8975f5c5SAndroid Build Coastguard Worker             mMappedStructs.push_back(mappedStruct);
47*8975f5c5SAndroid Build Coastguard Worker         }
48*8975f5c5SAndroid Build Coastguard Worker     }
49*8975f5c5SAndroid Build Coastguard Worker }
50*8975f5c5SAndroid Build Coastguard Worker 
visitDeclaration(Visit visit,TIntermDeclaration * node)51*8975f5c5SAndroid Build Coastguard Worker bool FlagStd140StructsTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node)
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker     TIntermTyped *declarator = node->getSequence()->back()->getAsTyped();
54*8975f5c5SAndroid Build Coastguard Worker     if (declarator->getBasicType() == EbtInterfaceBlock)
55*8975f5c5SAndroid Build Coastguard Worker     {
56*8975f5c5SAndroid Build Coastguard Worker         const TInterfaceBlock *block = declarator->getType().getInterfaceBlock();
57*8975f5c5SAndroid Build Coastguard Worker         if (block->blockStorage() == EbsStd140)
58*8975f5c5SAndroid Build Coastguard Worker         {
59*8975f5c5SAndroid Build Coastguard Worker             mapBlockStructMembers(declarator->getAsSymbolNode(), block);
60*8975f5c5SAndroid Build Coastguard Worker         }
61*8975f5c5SAndroid Build Coastguard Worker     }
62*8975f5c5SAndroid Build Coastguard Worker     return false;
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
66*8975f5c5SAndroid Build Coastguard Worker 
FlagStd140Structs(TIntermNode * node)67*8975f5c5SAndroid Build Coastguard Worker std::vector<MappedStruct> FlagStd140Structs(TIntermNode *node)
68*8975f5c5SAndroid Build Coastguard Worker {
69*8975f5c5SAndroid Build Coastguard Worker     FlagStd140StructsTraverser flaggingTraversal;
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     node->traverse(&flaggingTraversal);
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker     return flaggingTraversal.getMappedStructs();
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker }  // namespace sh
77