tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

OutputGLSLBase.h (6769B)


      1 //
      2 // Copyright 2002 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/ExtensionBehavior.h"
     13 #include "compiler/translator/HashNames.h"
     14 #include "compiler/translator/InfoSink.h"
     15 #include "compiler/translator/Pragma.h"
     16 #include "compiler/translator/tree_util/IntermTraverse.h"
     17 
     18 namespace sh
     19 {
     20 class TCompiler;
     21 
     22 class TOutputGLSLBase : public TIntermTraverser
     23 {
     24  public:
     25    TOutputGLSLBase(TCompiler *compiler,
     26                    TInfoSinkBase &objSink,
     27                    const ShCompileOptions &compileOptions);
     28 
     29    ShShaderOutput getShaderOutput() const { return mOutput; }
     30 
     31    // Return the original name if hash function pointer is NULL;
     32    // otherwise return the hashed name. Has special handling for internal names and built-ins,
     33    // which are not hashed.
     34    ImmutableString hashName(const TSymbol *symbol);
     35 
     36  protected:
     37    TInfoSinkBase &objSink() { return mObjSink; }
     38    void writeFloat(TInfoSinkBase &out, float f);
     39    void writeTriplet(Visit visit, const char *preStr, const char *inStr, const char *postStr);
     40    std::string getCommonLayoutQualifiers(TIntermSymbol *variable);
     41    std::string getMemoryQualifiers(const TType &type);
     42    virtual void writeLayoutQualifier(TIntermSymbol *variable);
     43    void writeFieldLayoutQualifier(const TField *field);
     44    void writeInvariantQualifier(const TType &type);
     45    void writePreciseQualifier(const TType &type);
     46    virtual void writeVariableType(const TType &type,
     47                                   const TSymbol *symbol,
     48                                   bool isFunctionArgument);
     49    virtual bool writeVariablePrecision(TPrecision precision) = 0;
     50    void writeFunctionParameters(const TFunction *func);
     51    const TConstantUnion *writeConstantUnion(const TType &type, const TConstantUnion *pConstUnion);
     52    void writeConstructorTriplet(Visit visit, const TType &type);
     53    ImmutableString getTypeName(const TType &type);
     54 
     55    void visitSymbol(TIntermSymbol *node) override;
     56    void visitConstantUnion(TIntermConstantUnion *node) override;
     57    bool visitSwizzle(Visit visit, TIntermSwizzle *node) override;
     58    bool visitBinary(Visit visit, TIntermBinary *node) override;
     59    bool visitUnary(Visit visit, TIntermUnary *node) override;
     60    bool visitTernary(Visit visit, TIntermTernary *node) override;
     61    bool visitIfElse(Visit visit, TIntermIfElse *node) override;
     62    bool visitSwitch(Visit visit, TIntermSwitch *node) override;
     63    bool visitCase(Visit visit, TIntermCase *node) override;
     64    void visitFunctionPrototype(TIntermFunctionPrototype *node) override;
     65    bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node) override;
     66    bool visitAggregate(Visit visit, TIntermAggregate *node) override;
     67    bool visitBlock(Visit visit, TIntermBlock *node) override;
     68    bool visitGlobalQualifierDeclaration(Visit visit,
     69                                         TIntermGlobalQualifierDeclaration *node) override;
     70    bool visitDeclaration(Visit visit, TIntermDeclaration *node) override;
     71    bool visitLoop(Visit visit, TIntermLoop *node) override;
     72    bool visitBranch(Visit visit, TIntermBranch *node) override;
     73    void visitPreprocessorDirective(TIntermPreprocessorDirective *node) override;
     74 
     75    void visitCodeBlock(TIntermBlock *node);
     76 
     77    ImmutableString hashFieldName(const TField *field);
     78    // Same as hashName(), but without hashing "main".
     79    ImmutableString hashFunctionNameIfNeeded(const TFunction *func);
     80    // Used to translate function names for differences between ESSL and GLSL
     81    virtual ImmutableString translateTextureFunction(const ImmutableString &name,
     82                                                     const ShCompileOptions &option)
     83    {
     84        return name;
     85    }
     86 
     87    void declareStruct(const TStructure *structure);
     88    void writeQualifier(TQualifier qualifier, const TType &type, const TSymbol *symbol);
     89 
     90    const char *mapQualifierToString(TQualifier qualifier);
     91 
     92    sh::GLenum getShaderType() const { return mShaderType; }
     93    bool isHighPrecisionSupported() const { return mHighPrecisionSupported; }
     94    const char *getIndentPrefix(int extraIndentDepth = 0);
     95 
     96    bool needsToWriteLayoutQualifier(const TType &type);
     97 
     98  private:
     99    void declareInterfaceBlockLayout(const TType &type);
    100    void declareInterfaceBlock(const TType &type);
    101 
    102    void writeFunctionTriplet(Visit visit,
    103                              const ImmutableString &functionName,
    104                              bool useEmulatedFunction);
    105 
    106    TInfoSinkBase &mObjSink;
    107    bool mDeclaringVariable;
    108 
    109    // name hashing.
    110    ShHashFunction64 mHashFunction;
    111    NameMap &mNameMap;
    112 
    113    sh::GLenum mShaderType;
    114    const int mShaderVersion;
    115    ShShaderOutput mOutput;
    116 
    117    bool mHighPrecisionSupported;
    118 
    119    // Emit "layout(locaton = 0)" for fragment outputs whose location is unspecified. This is for
    120    // transformations like pixel local storage, where new outputs are introduced to the shader, and
    121    // previously valid fragment outputs with an implicit location of 0 are now required to specify
    122    // their location.
    123    bool mAlwaysSpecifyFragOutLocation;
    124 
    125    const ShCompileOptions &mCompileOptions;
    126 };
    127 
    128 void WritePragma(TInfoSinkBase &out, const ShCompileOptions &compileOptions, const TPragma &pragma);
    129 
    130 void WriteGeometryShaderLayoutQualifiers(TInfoSinkBase &out,
    131                                         sh::TLayoutPrimitiveType inputPrimitive,
    132                                         int invocations,
    133                                         sh::TLayoutPrimitiveType outputPrimitive,
    134                                         int maxVertices);
    135 
    136 void WriteTessControlShaderLayoutQualifiers(TInfoSinkBase &out, int inputVertices);
    137 
    138 void WriteTessEvaluationShaderLayoutQualifiers(TInfoSinkBase &out,
    139                                               sh::TLayoutTessEvaluationType inputPrimitive,
    140                                               sh::TLayoutTessEvaluationType inputVertexSpacing,
    141                                               sh::TLayoutTessEvaluationType inputOrdering,
    142                                               sh::TLayoutTessEvaluationType inputPoint);
    143 
    144 void EmitEarlyFragmentTestsGLSL(const TCompiler &, TInfoSinkBase &sink);
    145 void EmitWorkGroupSizeGLSL(const TCompiler &, TInfoSinkBase &sink);
    146 void EmitMultiviewGLSL(const TCompiler &,
    147                       const ShCompileOptions &,
    148                       const TExtension,
    149                       const TBehavior,
    150                       TInfoSinkBase &sink);
    151 
    152 }  // namespace sh
    153 
    154 #endif  // COMPILER_TRANSLATOR_OUTPUTGLSLBASE_H_