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