// // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #ifndef COMPILER_TRANSLATOR_OUTPUTGLSLBASE_H_ #define COMPILER_TRANSLATOR_OUTPUTGLSLBASE_H_ #include #include "compiler/translator/HashNames.h" #include "compiler/translator/InfoSink.h" #include "compiler/translator/IntermTraverse.h" namespace sh { class TOutputGLSLBase : public TIntermTraverser { public: TOutputGLSLBase(TInfoSinkBase &objSink, ShArrayIndexClampingStrategy clampingStrategy, ShHashFunction64 hashFunction, NameMap &nameMap, TSymbolTable *symbolTable, sh::GLenum shaderType, int shaderVersion, ShShaderOutput output, ShCompileOptions compileOptions); ShShaderOutput getShaderOutput() const { return mOutput; } // Return the original name if hash function pointer is NULL; // otherwise return the hashed name. Has special handling for internal names, which are not // hashed. TString hashName(const TName &name); protected: TInfoSinkBase &objSink() { return mObjSink; } void writeFloat(TInfoSinkBase &out, float f); void writeTriplet(Visit visit, const char *preStr, const char *inStr, const char *postStr); virtual void writeLayoutQualifier(TIntermTyped *variable); void writeInvariantQualifier(const TType &type); void writeVariableType(const TType &type); virtual bool writeVariablePrecision(TPrecision precision) = 0; void writeFunctionParameters(const TIntermSequence &args); const TConstantUnion *writeConstantUnion(const TType &type, const TConstantUnion *pConstUnion); void writeConstructorTriplet(Visit visit, const TType &type); TString getTypeName(const TType &type); void visitSymbol(TIntermSymbol *node) override; void visitConstantUnion(TIntermConstantUnion *node) override; bool visitSwizzle(Visit visit, TIntermSwizzle *node) override; bool visitBinary(Visit visit, TIntermBinary *node) override; bool visitUnary(Visit visit, TIntermUnary *node) override; bool visitTernary(Visit visit, TIntermTernary *node) override; bool visitIfElse(Visit visit, TIntermIfElse *node) override; bool visitSwitch(Visit visit, TIntermSwitch *node) override; bool visitCase(Visit visit, TIntermCase *node) override; bool visitFunctionPrototype(Visit visit, TIntermFunctionPrototype *node) override; bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override; bool visitAggregate(Visit visit, TIntermAggregate *node) override; bool visitBlock(Visit visit, TIntermBlock *node) override; bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override; bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; bool visitLoop(Visit visit, TIntermLoop *node) override; bool visitBranch(Visit visit, TIntermBranch *node) override; void visitCodeBlock(TIntermBlock *node); // Same as hashName(), but without hashing built-in variables. TString hashVariableName(const TName &name); // Same as hashName(), but without hashing internal functions or "main". TString hashFunctionNameIfNeeded(const TFunctionSymbolInfo &info); // Used to translate function names for differences between ESSL and GLSL virtual TString translateTextureFunction(const TString &name) { return name; } private: bool structDeclared(const TStructure *structure) const; void declareStruct(const TStructure *structure); void declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock); void declareInterfaceBlock(const TInterfaceBlock *interfaceBlock); void writeBuiltInFunctionTriplet(Visit visit, TOperator op, bool useEmulatedFunction); const char *mapQualifierToString(TQualifier qialifier); TInfoSinkBase &mObjSink; bool mDeclaringVariable; // This set contains all the ids of the structs from every scope. std::set mDeclaredStructs; ShArrayIndexClampingStrategy mClampingStrategy; // name hashing. ShHashFunction64 mHashFunction; NameMap &mNameMap; sh::GLenum mShaderType; const int mShaderVersion; ShShaderOutput mOutput; ShCompileOptions mCompileOptions; }; void WriteGeometryShaderLayoutQualifiers(TInfoSinkBase &out, sh::TLayoutPrimitiveType inputPrimitive, int invocations, sh::TLayoutPrimitiveType outputPrimitive, int maxVertices); bool NeedsToWriteLayoutQualifier(const TType &type); } // namespace sh #endif // COMPILER_TRANSLATOR_OUTPUTGLSLBASE_H_