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.
7 #ifndef COMPILER_OUTPUTHLSL_H_
8 #define COMPILER_OUTPUTHLSL_H_
15 #include <GLES2/gl2.h>
17 #include "compiler/translator/intermediate.h"
18 #include "compiler/translator/ParseContext.h"
19 #include "compiler/translator/Uniform.h"
23 class UnfoldShortCircuit;
25 class OutputHLSL : public TIntermTraverser
28 OutputHLSL(TParseContext &context, const ShBuiltInResources& resources, ShShaderOutput outputType);
33 TInfoSinkBase &getBodyStream();
34 const ActiveUniforms &getUniforms();
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);
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*);
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;
67 void addConstructor(const TType &type, const TString &name, const TIntermSequence *parameters);
68 const ConstantUnion *writeConstantUnion(const TType &type, const ConstantUnion *constUnion);
70 TString scopeString(unsigned int depthLimit);
71 TString scopedStruct(const TString &typeName);
72 TString structLookup(const TString &typeName);
74 TParseContext &mContext;
75 const ShShaderOutput mOutputType;
76 UnfoldShortCircuit *mUnfoldShortCircuit;
80 TInfoSinkBase mHeader;
82 TInfoSinkBase mFooter;
84 typedef std::map<TString, TIntermSymbol*> ReferencedSymbols;
85 ReferencedSymbols mReferencedUniforms;
86 ReferencedSymbols mReferencedAttributes;
87 ReferencedSymbols mReferencedVaryings;
89 // Parameters determining what goes in the header output
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;
107 bool mUsesDepthRange;
109 bool mUsesPointCoord;
110 bool mUsesFrontFacing;
121 bool mUsesFaceforward1;
122 bool mUsesFaceforward2;
123 bool mUsesFaceforward3;
124 bool mUsesFaceforward4;
129 bool mUsesDiscardRewriting;
131 int mNumRenderTargets;
133 typedef std::set<TString> Constructors;
134 Constructors mConstructors;
136 typedef std::set<TString> StructNames;
137 StructNames mStructNames;
139 typedef std::list<TString> StructDeclarations;
140 StructDeclarations mStructDeclarations;
142 typedef std::vector<int> ScopeBracket;
143 ScopeBracket mScopeBracket;
144 unsigned int mScopeDepth;
146 int mUniqueIndex; // For creating unique names
148 bool mContainsLoopDiscontinuity;
149 bool mOutputLod0Function;
150 bool mInsideDiscontinuousLoop;
152 TIntermSymbol *mExcessiveLoopIndex;
154 int mUniformRegister;
155 int mSamplerRegister;
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);
164 ActiveUniforms mActiveUniforms;
168 #endif // COMPILER_OUTPUTHLSL_H_