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.
7 // Interfaces of methods for HLSL translation of GLSL structures.
10 #ifndef TRANSLATOR_STRUCTUREHLSL_H_
11 #define TRANSLATOR_STRUCTUREHLSL_H_
13 #include "compiler/translator/Common.h"
14 #include "compiler/translator/IntermNode.h"
24 // This helper class assists structure and interface block definitions in determining
25 // how to pack std140 structs within HLSL's packing rules.
26 class Std140PaddingHelper
29 explicit Std140PaddingHelper(const std::map<TString, int> &structElementIndexes,
30 unsigned *uniqueCounter);
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);
40 unsigned *mPaddingCounter;
42 const std::map<TString, int> &mStructElementIndexes;
50 void addConstructor(const TType &type, const TString &name, const TIntermSequence *parameters);
51 std::string structsHeader() const;
53 TString defineQualified(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing);
54 static TString defineNameless(const TStructure &structure);
56 Std140PaddingHelper getPaddingHelper();
59 unsigned mUniquePaddingCounter;
61 std::map<TString, int> mStd140StructElementIndexes;
63 typedef std::set<TString> StructNames;
64 StructNames mStructNames;
66 typedef std::set<TString> Constructors;
67 Constructors mConstructors;
69 typedef std::vector<TString> StructDeclarations;
70 StructDeclarations mStructDeclarations;
72 void storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking);
73 static TString define(const TStructure &structure, bool useHLSLRowMajorPacking,
74 bool useStd140Packing, Std140PaddingHelper *padHelper);
79 #endif // COMPILER_STRUCTUREHLSL_H_