blob: 37f7225d2757e8af586b4ca1a04f022c28108d2e [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"
Olli Etuaho378c3a52017-12-04 11:32:13 +020012#include "compiler/translator/SymbolTable.h"
Olli Etuaho2ef23e22017-11-01 16:39:11 +020013
Jamie Madill570e04d2013-06-21 09:15:33 -040014namespace sh
15{
16
Olli Etuaho2ef23e22017-11-01 16:39:11 +020017namespace
Jamie Madill570e04d2013-06-21 09:15:33 -040018{
Olli Etuaho2ef23e22017-11-01 16:39:11 +020019
20class FlagStd140StructsTraverser : public TIntermTraverser
21{
22 public:
23 FlagStd140StructsTraverser() : TIntermTraverser(true, false, false) {}
24
25 const std::vector<MappedStruct> getMappedStructs() const { return mMappedStructs; }
26
27 protected:
28 bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
29
30 private:
31 void mapBlockStructMembers(TIntermSymbol *blockDeclarator, TInterfaceBlock *block);
32
33 std::vector<MappedStruct> mMappedStructs;
34};
35
36void FlagStd140StructsTraverser::mapBlockStructMembers(TIntermSymbol *blockDeclarator,
37 TInterfaceBlock *block)
38{
39 for (auto *field : block->fields())
Jamie Madill570e04d2013-06-21 09:15:33 -040040 {
Olli Etuaho2ef23e22017-11-01 16:39:11 +020041 if (field->type()->getBasicType() == EbtStruct)
Jamie Madill570e04d2013-06-21 09:15:33 -040042 {
Olli Etuaho2ef23e22017-11-01 16:39:11 +020043 MappedStruct mappedStruct;
44 mappedStruct.blockDeclarator = blockDeclarator;
45 mappedStruct.field = field;
46 mMappedStructs.push_back(mappedStruct);
Jamie Madill570e04d2013-06-21 09:15:33 -040047 }
Jamie Madill570e04d2013-06-21 09:15:33 -040048 }
49}
50
Olli Etuaho2ef23e22017-11-01 16:39:11 +020051bool FlagStd140StructsTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node)
Jamie Madill570e04d2013-06-21 09:15:33 -040052{
Olli Etuaho2ef23e22017-11-01 16:39:11 +020053 TIntermTyped *declarator = node->getSequence()->back()->getAsTyped();
54 if (declarator->getBasicType() == EbtInterfaceBlock)
Jamie Madill570e04d2013-06-21 09:15:33 -040055 {
Olli Etuaho2ef23e22017-11-01 16:39:11 +020056 TInterfaceBlock *block = declarator->getType().getInterfaceBlock();
57 if (block->blockStorage() == EbsStd140)
58 {
59 mapBlockStructMembers(declarator->getAsSymbolNode(), block);
60 }
Jamie Madill570e04d2013-06-21 09:15:33 -040061 }
Jamie Madill570e04d2013-06-21 09:15:33 -040062 return false;
63}
64
Olli Etuaho2ef23e22017-11-01 16:39:11 +020065} // anonymous namespace
66
67std::vector<MappedStruct> FlagStd140Structs(TIntermNode *node)
Jamie Madill570e04d2013-06-21 09:15:33 -040068{
Olli Etuaho2ef23e22017-11-01 16:39:11 +020069 FlagStd140StructsTraverser flaggingTraversal;
Jamie Madill570e04d2013-06-21 09:15:33 -040070
71 node->traverse(&flaggingTraversal);
72
Olli Etuaho2ef23e22017-11-01 16:39:11 +020073 return flaggingTraversal.getMappedStructs();
Jamie Madill570e04d2013-06-21 09:15:33 -040074}
Olli Etuaho2ef23e22017-11-01 16:39:11 +020075
76} // namespace sh