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_TRANSLATOR_OUTPUTGLSLBASE_H_
8 #define COMPILER_TRANSLATOR_OUTPUTGLSLBASE_H_
9 
10 #include <set>
11 
12 #include "compiler/translator/HashNames.h"
13 #include "compiler/translator/InfoSink.h"
14 #include "compiler/translator/IntermTraverse.h"
15 
16 namespace sh
17 {
18 
19 class TOutputGLSLBase : public TIntermTraverser
20 {
21   public:
22     TOutputGLSLBase(TInfoSinkBase &objSink,
23                     ShArrayIndexClampingStrategy clampingStrategy,
24                     ShHashFunction64 hashFunction,
25                     NameMap &nameMap,
26                     TSymbolTable *symbolTable,
27                     sh::GLenum shaderType,
28                     int shaderVersion,
29                     ShShaderOutput output,
30                     ShCompileOptions compileOptions);
31 
getShaderOutput()32     ShShaderOutput getShaderOutput() const { return mOutput; }
33 
34     // Return the original name if hash function pointer is NULL;
35     // otherwise return the hashed name. Has special handling for internal names, which are not
36     // hashed.
37     TString hashName(const TName &name);
38 
39   protected:
objSink()40     TInfoSinkBase &objSink() { return mObjSink; }
41     void writeFloat(TInfoSinkBase &out, float f);
42     void writeTriplet(Visit visit, const char *preStr, const char *inStr, const char *postStr);
43     virtual void writeLayoutQualifier(TIntermTyped *variable);
44     void writeInvariantQualifier(const TType &type);
45     void writeVariableType(const TType &type);
46     virtual bool writeVariablePrecision(TPrecision precision) = 0;
47     void writeFunctionParameters(const TIntermSequence &args);
48     const TConstantUnion *writeConstantUnion(const TType &type, const TConstantUnion *pConstUnion);
49     void writeConstructorTriplet(Visit visit, const TType &type);
50     TString getTypeName(const TType &type);
51 
52     void visitSymbol(TIntermSymbol *node) override;
53     void visitConstantUnion(TIntermConstantUnion *node) override;
54     bool visitSwizzle(Visit visit, TIntermSwizzle *node) override;
55     bool visitBinary(Visit visit, TIntermBinary *node) override;
56     bool visitUnary(Visit visit, TIntermUnary *node) override;
57     bool visitTernary(Visit visit, TIntermTernary *node) override;
58     bool visitIfElse(Visit visit, TIntermIfElse *node) override;
59     bool visitSwitch(Visit visit, TIntermSwitch *node) override;
60     bool visitCase(Visit visit, TIntermCase *node) override;
61     bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override;
62     bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override;
63     bool visitAggregate(Visit visit, TIntermAggregate *node) override;
64     bool visitBlock(Visit visit, TIntermBlock *node) override;
65     bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override;
66     bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
67     bool visitLoop(Visit visit, TIntermLoop *node) override;
68     bool visitBranch(Visit visit, TIntermBranch *node) override;
69 
70     void visitCodeBlock(TIntermBlock *node);
71 
72     // Same as hashName(), but without hashing built-in variables.
73     TString hashVariableName(const TName &name);
74     // Same as hashName(), but without hashing internal functions or "main".
75     TString hashFunctionNameIfNeeded(const TFunctionSymbolInfo &info);
76     // Used to translate function names for differences between ESSL and GLSL
translateTextureFunction(const TString & name)77     virtual TString translateTextureFunction(const TString &name) { return name; }
78 
79   private:
80     bool structDeclared(const TStructure *structure) const;
81     void declareStruct(const TStructure *structure);
82 
83     void declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock);
84     void declareInterfaceBlock(const TInterfaceBlock *interfaceBlock);
85 
86     void writeBuiltInFunctionTriplet(Visit visit, TOperator op, bool useEmulatedFunction);
87 
88     const char *mapQualifierToString(TQualifier qialifier);
89 
90     TInfoSinkBase &mObjSink;
91     bool mDeclaringVariable;
92 
93     // This set contains all the ids of the structs from every scope.
94     std::set<int> mDeclaredStructs;
95 
96     ShArrayIndexClampingStrategy mClampingStrategy;
97 
98     // name hashing.
99     ShHashFunction64 mHashFunction;
100 
101     NameMap &mNameMap;
102 
103     sh::GLenum mShaderType;
104 
105     const int mShaderVersion;
106 
107     ShShaderOutput mOutput;
108 
109     ShCompileOptions mCompileOptions;
110 };
111 
112 void WriteGeometryShaderLayoutQualifiers(TInfoSinkBase &out,
113                                          sh::TLayoutPrimitiveType inputPrimitive,
114                                          int invocations,
115                                          sh::TLayoutPrimitiveType outputPrimitive,
116                                          int maxVertices);
117 
118 bool NeedsToWriteLayoutQualifier(const TType &type);
119 
120 }  // namespace sh
121 
122 #endif  // COMPILER_TRANSLATOR_OUTPUTGLSLBASE_H_
123