31edb7f394eb3b3dd779e41d2cae457fcd3bf779
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / compiler / translator / OutputHLSL.h
1 //
2 // Copyright (c) 2002-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_OUTPUTHLSL_H_
8 #define COMPILER_OUTPUTHLSL_H_
9
10 #include <list>
11 #include <set>
12 #include <map>
13
14 #define GL_APICALL
15 #include <GLES2/gl2.h>
16
17 #include "compiler/translator/intermediate.h"
18 #include "compiler/translator/ParseContext.h"
19 #include "compiler/translator/Uniform.h"
20
21 namespace sh
22 {
23 class UnfoldShortCircuit;
24
25 class OutputHLSL : public TIntermTraverser
26 {
27   public:
28     OutputHLSL(TParseContext &context, const ShBuiltInResources& resources, ShShaderOutput outputType);
29     ~OutputHLSL();
30
31     void output();
32
33     TInfoSinkBase &getBodyStream();
34     const ActiveUniforms &getUniforms();
35
36     TString typeString(const TType &type);
37     TString textureString(const TType &type);
38     static TString qualifierString(TQualifier qualifier);
39     static TString arrayString(const TType &type);
40     static TString initializer(const TType &type);
41     static TString decorate(const TString &string);                      // Prepends an underscore to avoid naming clashes
42     static TString decorateUniform(const TString &string, const TType &type);
43     static TString decorateField(const TString &string, const TType &structure);
44
45   protected:
46     void header();
47
48     // Visit AST nodes and output their code to the body stream
49     void visitSymbol(TIntermSymbol*);
50     void visitRaw(TIntermRaw*);
51     void visitConstantUnion(TIntermConstantUnion*);
52     bool visitBinary(Visit visit, TIntermBinary*);
53     bool visitUnary(Visit visit, TIntermUnary*);
54     bool visitSelection(Visit visit, TIntermSelection*);
55     bool visitAggregate(Visit visit, TIntermAggregate*);
56     bool visitLoop(Visit visit, TIntermLoop*);
57     bool visitBranch(Visit visit, TIntermBranch*);
58
59     void traverseStatements(TIntermNode *node);
60     bool isSingleStatement(TIntermNode *node);
61     bool handleExcessiveLoop(TIntermLoop *node);
62     void outputTriplet(Visit visit, const TString &preString, const TString &inString, const TString &postString);
63     void outputLineDirective(int line);
64     TString argumentString(const TIntermSymbol *symbol);
65     int vectorSize(const TType &type) const;
66
67     void addConstructor(const TType &type, const TString &name, const TIntermSequence *parameters);
68     const ConstantUnion *writeConstantUnion(const TType &type, const ConstantUnion *constUnion);
69
70     TString scopeString(unsigned int depthLimit);
71     TString scopedStruct(const TString &typeName);
72     TString structLookup(const TString &typeName);
73
74     TParseContext &mContext;
75     const ShShaderOutput mOutputType;
76     UnfoldShortCircuit *mUnfoldShortCircuit;
77     bool mInsideFunction;
78
79     // Output streams
80     TInfoSinkBase mHeader;
81     TInfoSinkBase mBody;
82     TInfoSinkBase mFooter;
83
84     typedef std::map<TString, TIntermSymbol*> ReferencedSymbols;
85     ReferencedSymbols mReferencedUniforms;
86     ReferencedSymbols mReferencedAttributes;
87     ReferencedSymbols mReferencedVaryings;
88
89     // Parameters determining what goes in the header output
90     bool mUsesTexture2D;
91     bool mUsesTexture2D_bias;
92     bool mUsesTexture2DLod;
93     bool mUsesTexture2DProj;
94     bool mUsesTexture2DProj_bias;
95     bool mUsesTexture2DProjLod;
96     bool mUsesTextureCube;
97     bool mUsesTextureCube_bias;
98     bool mUsesTextureCubeLod;
99     bool mUsesTexture2DLod0;
100     bool mUsesTexture2DLod0_bias;
101     bool mUsesTexture2DProjLod0;
102     bool mUsesTexture2DProjLod0_bias;
103     bool mUsesTextureCubeLod0;
104     bool mUsesTextureCubeLod0_bias;
105     bool mUsesFragColor;
106     bool mUsesFragData;
107     bool mUsesDepthRange;
108     bool mUsesFragCoord;
109     bool mUsesPointCoord;
110     bool mUsesFrontFacing;
111     bool mUsesPointSize;
112     bool mUsesFragDepth;
113     bool mUsesXor;
114     bool mUsesMod1;
115     bool mUsesMod2v;
116     bool mUsesMod2f;
117     bool mUsesMod3v;
118     bool mUsesMod3f;
119     bool mUsesMod4v;
120     bool mUsesMod4f;
121     bool mUsesFaceforward1;
122     bool mUsesFaceforward2;
123     bool mUsesFaceforward3;
124     bool mUsesFaceforward4;
125     bool mUsesAtan2_1;
126     bool mUsesAtan2_2;
127     bool mUsesAtan2_3;
128     bool mUsesAtan2_4;
129     bool mUsesDiscardRewriting;
130
131     int mNumRenderTargets;
132
133     typedef std::set<TString> Constructors;
134     Constructors mConstructors;
135
136     typedef std::set<TString> StructNames;
137     StructNames mStructNames;
138
139     typedef std::list<TString> StructDeclarations;
140     StructDeclarations mStructDeclarations;
141
142     typedef std::vector<int> ScopeBracket;
143     ScopeBracket mScopeBracket;
144     unsigned int mScopeDepth;
145
146     int mUniqueIndex;   // For creating unique names
147
148     bool mContainsLoopDiscontinuity;
149     bool mOutputLod0Function;
150     bool mInsideDiscontinuousLoop;
151
152     TIntermSymbol *mExcessiveLoopIndex;
153
154     int mUniformRegister;
155     int mSamplerRegister;
156
157     TString registerString(TIntermSymbol *operand);
158     int samplerRegister(TIntermSymbol *sampler);
159     int uniformRegister(TIntermSymbol *uniform);
160     void declareUniform(const TType &type, const TString &name, int index);
161     static GLenum glVariableType(const TType &type);
162     static GLenum glVariablePrecision(const TType &type);
163
164     ActiveUniforms mActiveUniforms;
165 };
166 }
167
168 #endif   // COMPILER_OUTPUTHLSL_H_