1//
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//
6
7#ifndef COMPILER_FLAGSTD140STRUCTS_H_
8#define COMPILER_FLAGSTD140STRUCTS_H_
9
10#include "compiler/translator/IntermNode.h"
11
12namespace sh
13{
14
15// This class finds references to nested structs of std140 blocks that access
16// the nested struct "by value", where the padding added in the translator
17// conflicts with the "natural" unpadded type.
18class FlagStd140Structs : public TIntermTraverser
19{
20  public:
21    const std::vector<TIntermTyped *> getFlaggedNodes() const { return mFlaggedNodes; }
22
23  protected:
24    virtual bool visitBinary(Visit visit, TIntermBinary *binaryNode);
25    virtual void visitSymbol(TIntermSymbol *symbol);
26
27  private:
28    bool isInStd140InterfaceBlock(TIntermTyped *node) const;
29
30    std::vector<TIntermTyped *> mFlaggedNodes;
31};
32
33std::vector<TIntermTyped *> FlagStd140ValueStructs(TIntermNode *node);
34
35}
36
37#endif // COMPILER_FLAGSTD140STRUCTS_H_
38