| // |
| // Copyright 2002 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 <set> |
| |
| #include "compiler/translator/HashNames.h" |
| #include "compiler/translator/InfoSink.h" |
| #include "compiler/translator/tree_util/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 and built-ins, |
| // which are not hashed. |
| ImmutableString hashName(const TSymbol *symbol); |
| |
| protected: |
| TInfoSinkBase &objSink() { return mObjSink; } |
| void writeFloat(TInfoSinkBase &out, float f); |
| void writeTriplet(Visit visit, const char *preStr, const char *inStr, const char *postStr); |
| std::string getCommonLayoutQualifiers(TIntermTyped *variable); |
| std::string getMemoryQualifiers(const TType &type); |
| virtual void writeLayoutQualifier(TIntermTyped *variable); |
| void writeFieldLayoutQualifier(const TField *field); |
| void writeInvariantQualifier(const TType &type); |
| void writePreciseQualifier(const TType &type); |
| virtual void writeVariableType(const TType &type, |
| const TSymbol *symbol, |
| bool isFunctionArgument); |
| virtual bool writeVariablePrecision(TPrecision precision) = 0; |
| void writeFunctionParameters(const TFunction *func); |
| const TConstantUnion *writeConstantUnion(const TType &type, const TConstantUnion *pConstUnion); |
| void writeConstructorTriplet(Visit visit, const TType &type); |
| ImmutableString 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; |
| void visitFunctionPrototype(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 visitGlobalQualifierDeclaration(Visit visit, |
| TIntermGlobalQualifierDeclaration *node) override; |
| bool visitDeclaration(Visit visit, TIntermDeclaration *node) override; |
| bool visitLoop(Visit visit, TIntermLoop *node) override; |
| bool visitBranch(Visit visit, TIntermBranch *node) override; |
| void visitPreprocessorDirective(TIntermPreprocessorDirective *node) override; |
| |
| void visitCodeBlock(TIntermBlock *node); |
| |
| ImmutableString hashFieldName(const TField *field); |
| // Same as hashName(), but without hashing "main". |
| ImmutableString hashFunctionNameIfNeeded(const TFunction *func); |
| // Used to translate function names for differences between ESSL and GLSL |
| virtual ImmutableString translateTextureFunction(const ImmutableString &name, |
| const ShCompileOptions &option) |
| { |
| return name; |
| } |
| |
| void declareStruct(const TStructure *structure); |
| void writeQualifier(TQualifier qualifier, const TType &type, const TSymbol *symbol); |
| bool structDeclared(const TStructure *structure) const; |
| |
| const char *mapQualifierToString(TQualifier qualifier); |
| |
| sh::GLenum getShaderType() { return mShaderType; } |
| |
| private: |
| void declareInterfaceBlockLayout(const TInterfaceBlock *interfaceBlock); |
| void declareInterfaceBlock(const TInterfaceBlock *interfaceBlock); |
| |
| void writeBuiltInFunctionTriplet(Visit visit, TOperator op, bool useEmulatedFunction); |
| |
| TInfoSinkBase &mObjSink; |
| bool mDeclaringVariable; |
| |
| // This set contains all the ids of the structs from every scope. |
| std::set<int> 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_ |