Edit

kc3-lang/angle/src/compiler/translator/OutputGLSLBase.h

Branch :

  • Show log

    Commit

  • Author : Shahbaz Youssefi
    Date : 2020-01-17 14:53:38
    Hash : f1f082e1
    Message : Vulkan: Set varying location & xfb decorations in SPIR-V The shader translator outputs arbitrary location indices. Once compiled by glslang, the SPIR-V transformer modifies these decorations. If the transform feedback extension is used, it will also add the relevant decorations to the varyings that are captured. Bug: angleproject:3394 Change-Id: I5ecafd0536408612a5d4b920dbabbfabe650657c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2008468 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/compiler/translator/OutputGLSLBase.h
  • //
    // 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_