Home | History | Annotate | Download | only in compiler
      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