1 // 2 // Copyright (c) 2002-2011 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 CROSSCOMPILERGLSL_OUTPUTGLSLBASE_H_ 8 #define CROSSCOMPILERGLSL_OUTPUTGLSLBASE_H_ 9 10 #include <set> 11 12 #include "compiler/ForLoopUnroll.h" 13 #include "compiler/intermediate.h" 14 #include "compiler/ParseContext.h" 15 16 class TOutputGLSLBase : public TIntermTraverser 17 { 18 public: 19 TOutputGLSLBase(TInfoSinkBase& objSink, 20 ShArrayIndexClampingStrategy clampingStrategy, 21 ShHashFunction64 hashFunction, 22 NameMap& nameMap, 23 TSymbolTable& symbolTable); 24 25 protected: 26 TInfoSinkBase& objSink() { return mObjSink; } 27 void writeTriplet(Visit visit, const char* preStr, const char* inStr, const char* postStr); 28 void writeVariableType(const TType& type); 29 virtual bool writeVariablePrecision(TPrecision precision) = 0; 30 void writeFunctionParameters(const TIntermSequence& args); 31 const ConstantUnion* writeConstantUnion(const TType& type, const ConstantUnion* pConstUnion); 32 TString getTypeName(const TType& type); 33 34 virtual void visitSymbol(TIntermSymbol* node); 35 virtual void visitConstantUnion(TIntermConstantUnion* node); 36 virtual bool visitBinary(Visit visit, TIntermBinary* node); 37 virtual bool visitUnary(Visit visit, TIntermUnary* node); 38 virtual bool visitSelection(Visit visit, TIntermSelection* node); 39 virtual bool visitAggregate(Visit visit, TIntermAggregate* node); 40 virtual bool visitLoop(Visit visit, TIntermLoop* node); 41 virtual bool visitBranch(Visit visit, TIntermBranch* node); 42 43 void visitCodeBlock(TIntermNode* node); 44 45 46 // Return the original name if hash function pointer is NULL; 47 // otherwise return the hashed name. 48 TString hashName(const TString& name); 49 // Same as hashName(), but without hashing built-in variables. 50 TString hashVariableName(const TString& name); 51 // Same as hashName(), but without hashing built-in functions. 52 TString hashFunctionName(const TString& mangled_name); 53 54 private: 55 bool structDeclared(const TStructure* structure) const; 56 void declareStruct(const TStructure* structure); 57 58 TInfoSinkBase& mObjSink; 59 bool mDeclaringVariables; 60 61 // Structs are declared as the tree is traversed. This set contains all 62 // the structs already declared. It is maintained so that a struct is 63 // declared only once. 64 typedef std::set<TString> DeclaredStructs; 65 DeclaredStructs mDeclaredStructs; 66 67 ForLoopUnroll mLoopUnroll; 68 69 ShArrayIndexClampingStrategy mClampingStrategy; 70 71 // name hashing. 72 ShHashFunction64 mHashFunction; 73 74 NameMap& mNameMap; 75 76 TSymbolTable& mSymbolTable; 77 }; 78 79 #endif // CROSSCOMPILERGLSL_OUTPUTGLSLBASE_H_ 80