1//
2// Copyright (c) 2014 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// StructureHLSL.h:
7//   Interfaces of methods for HLSL translation of GLSL structures.
8//
9
10#ifndef TRANSLATOR_STRUCTUREHLSL_H_
11#define TRANSLATOR_STRUCTUREHLSL_H_
12
13#include "compiler/translator/Common.h"
14#include "compiler/translator/IntermNode.h"
15
16#include <set>
17
18class TInfoSinkBase;
19class TScopeBracket;
20
21namespace sh
22{
23
24// This helper class assists structure and interface block definitions in determining
25// how to pack std140 structs within HLSL's packing rules.
26class Std140PaddingHelper
27{
28  public:
29    explicit Std140PaddingHelper(const std::map<TString, int> &structElementIndexes,
30                                 unsigned *uniqueCounter);
31
32    int elementIndex() const { return mElementIndex; }
33    int prePadding(const TType &type);
34    TString prePaddingString(const TType &type);
35    TString postPaddingString(const TType &type, bool useHLSLRowMajorPacking);
36
37  private:
38    TString next();
39
40    unsigned *mPaddingCounter;
41    int mElementIndex;
42    const std::map<TString, int> &mStructElementIndexes;
43};
44
45class StructureHLSL
46{
47  public:
48    StructureHLSL();
49
50    void addConstructor(const TType &type, const TString &name, const TIntermSequence *parameters);
51    std::string structsHeader() const;
52
53    TString defineQualified(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing);
54    static TString defineNameless(const TStructure &structure);
55
56    Std140PaddingHelper getPaddingHelper();
57
58  private:
59    unsigned mUniquePaddingCounter;
60
61    std::map<TString, int> mStd140StructElementIndexes;
62
63    typedef std::set<TString> StructNames;
64    StructNames mStructNames;
65
66    typedef std::set<TString> Constructors;
67    Constructors mConstructors;
68
69    typedef std::vector<TString> StructDeclarations;
70    StructDeclarations mStructDeclarations;
71
72    void storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking);
73    static TString define(const TStructure &structure, bool useHLSLRowMajorPacking,
74                         bool useStd140Packing, Std140PaddingHelper *padHelper);
75};
76
77}
78
79#endif // COMPILER_STRUCTUREHLSL_H_
80