blob: ed002fef30a6909420fea37638769182503a31cc [file] [log] [blame]
Jamie Madill8daaba12014-06-13 10:04:33 -04001//
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"
Jamie Madillb1a85f42014-08-19 15:23:24 -040014#include "compiler/translator/IntermNode.h"
Jamie Madill8daaba12014-06-13 10:04:33 -040015
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:
Jamie Madill33a74bd2014-08-18 15:47:59 -040029 explicit Std140PaddingHelper(const std::map<TString, int> &structElementIndexes,
30 unsigned *uniqueCounter);
Jamie Madill8daaba12014-06-13 10:04:33 -040031
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:
Jamie Madill33a74bd2014-08-18 15:47:59 -040038 TString next();
39
40 unsigned *mPaddingCounter;
Jamie Madill8daaba12014-06-13 10:04:33 -040041 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
Jamie Madill33a74bd2014-08-18 15:47:59 -040056 Std140PaddingHelper getPaddingHelper();
Jamie Madill8daaba12014-06-13 10:04:33 -040057
58 private:
Jamie Madill33a74bd2014-08-18 15:47:59 -040059 unsigned mUniquePaddingCounter;
60
Jamie Madill8daaba12014-06-13 10:04:33 -040061 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_