tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

FlagStd140Structs.cpp (2228B)


      1 //
      2 // Copyright 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 //
      6 // FlagStd140Structs.cpp: Find structs in std140 blocks, where the padding added in the translator
      7 // conflicts with the "natural" unpadded type.
      8 
      9 #include "compiler/translator/FlagStd140Structs.h"
     10 
     11 #include "compiler/translator/SymbolTable.h"
     12 #include "compiler/translator/tree_util/IntermTraverse.h"
     13 
     14 namespace sh
     15 {
     16 
     17 namespace
     18 {
     19 
     20 class 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, const TInterfaceBlock *block);
     32 
     33    std::vector<MappedStruct> mMappedStructs;
     34 };
     35 
     36 void FlagStd140StructsTraverser::mapBlockStructMembers(TIntermSymbol *blockDeclarator,
     37                                                       const TInterfaceBlock *block)
     38 {
     39    for (auto *field : block->fields())
     40    {
     41        if (field->type()->getBasicType() == EbtStruct)
     42        {
     43            MappedStruct mappedStruct;
     44            mappedStruct.blockDeclarator = blockDeclarator;
     45            mappedStruct.field           = field;
     46            mMappedStructs.push_back(mappedStruct);
     47        }
     48    }
     49 }
     50 
     51 bool FlagStd140StructsTraverser::visitDeclaration(Visit visit, TIntermDeclaration *node)
     52 {
     53    TIntermTyped *declarator = node->getSequence()->back()->getAsTyped();
     54    if (declarator->getBasicType() == EbtInterfaceBlock)
     55    {
     56        const TInterfaceBlock *block = declarator->getType().getInterfaceBlock();
     57        if (block->blockStorage() == EbsStd140)
     58        {
     59            mapBlockStructMembers(declarator->getAsSymbolNode(), block);
     60        }
     61    }
     62    return false;
     63 }
     64 
     65 }  // anonymous namespace
     66 
     67 std::vector<MappedStruct> FlagStd140Structs(TIntermNode *node)
     68 {
     69    FlagStd140StructsTraverser flaggingTraversal;
     70 
     71    node->traverse(&flaggingTraversal);
     72 
     73    return flaggingTraversal.getMappedStructs();
     74 }
     75 
     76 }  // namespace sh