Edit

kc3-lang/angle/src/libANGLE/Shader.h

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2021-08-06 18:15:30
    Hash : 23a50a7c
    Message : Serialization: Fix groups & ensure compile resolution. This change has two fixes: 1) Some texture groups had multiple duplicate keys. Namely image descs and image contents. 2) Programs and Shaders would serialize non-deterministically because we would not ensure the compile/link was resolved. Fix this by explicitly ensuring the shaders/programs are done. Bug: angleproject:5133 Change-Id: I2f7f7768c76f90275f81e032ac08e3f2bc828ea2 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3076134 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Cody Northrop <cnorthrop@google.com>

  • src/libANGLE/Shader.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.
    //
    
    // Shader.h: Defines the abstract gl::Shader class and its concrete derived
    // classes VertexShader and FragmentShader. Implements GL shader objects and
    // related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section
    // 3.8 page 84.
    
    #ifndef LIBANGLE_SHADER_H_
    #define LIBANGLE_SHADER_H_
    
    #include <list>
    #include <memory>
    #include <string>
    #include <vector>
    
    #include <GLSLANG/ShaderLang.h>
    #include "angle_gl.h"
    
    #include "common/Optional.h"
    #include "common/angleutils.h"
    #include "libANGLE/Caps.h"
    #include "libANGLE/Compiler.h"
    #include "libANGLE/Debug.h"
    #include "libANGLE/angletypes.h"
    
    namespace rx
    {
    class GLImplFactory;
    class ShaderImpl;
    class ShaderSh;
    class WaitableCompileEvent;
    }  // namespace rx
    
    namespace angle
    {
    class WaitableEvent;
    class WorkerThreadPool;
    }  // namespace angle
    
    namespace gl
    {
    class CompileTask;
    class Context;
    class ShaderProgramManager;
    class State;
    
    // We defer the compile until link time, or until properties are queried.
    enum class CompileStatus
    {
        NOT_COMPILED,
        COMPILE_REQUESTED,
        COMPILED,
    };
    
    class ShaderState final : angle::NonCopyable
    {
      public:
        ShaderState(ShaderType shaderType);
        ~ShaderState();
    
        const std::string &getLabel() const { return mLabel; }
    
        const std::string &getSource() const { return mSource; }
        bool isCompiledToBinary() const { return !mCompiledBinary.empty(); }
        const std::string &getTranslatedSource() const { return mTranslatedSource; }
        const sh::BinaryBlob &getCompiledBinary() const { return mCompiledBinary; }
    
        ShaderType getShaderType() const { return mShaderType; }
        int getShaderVersion() const { return mShaderVersion; }
    
        const std::vector<sh::ShaderVariable> &getInputVaryings() const { return mInputVaryings; }
        const std::vector<sh::ShaderVariable> &getOutputVaryings() const { return mOutputVaryings; }
        const std::vector<sh::ShaderVariable> &getUniforms() const { return mUniforms; }
        const std::vector<sh::InterfaceBlock> &getUniformBlocks() const { return mUniformBlocks; }
        const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks() const
        {
            return mShaderStorageBlocks;
        }
        const std::vector<sh::ShaderVariable> &getActiveAttributes() const { return mActiveAttributes; }
        const std::vector<sh::ShaderVariable> &getAllAttributes() const { return mAllAttributes; }
        const std::vector<sh::ShaderVariable> &getActiveOutputVariables() const
        {
            return mActiveOutputVariables;
        }
    
        bool compilePending() const { return mCompileStatus == CompileStatus::COMPILE_REQUESTED; }
    
        const sh::WorkGroupSize &getLocalSize() const { return mLocalSize; }
    
        bool getEarlyFragmentTestsOptimization() const { return mEarlyFragmentTestsOptimization; }
        rx::SpecConstUsageBits getSpecConstUsageBits() const { return mSpecConstUsageBits; }
    
        int getNumViews() const { return mNumViews; }
    
        Optional<PrimitiveMode> getGeometryShaderInputPrimitiveType() const
        {
            return mGeometryShaderInputPrimitiveType;
        }
    
        Optional<PrimitiveMode> getGeometryShaderOutputPrimitiveType() const
        {
            return mGeometryShaderOutputPrimitiveType;
        }
    
        Optional<GLint> geoGeometryShaderMaxVertices() const { return mGeometryShaderMaxVertices; }
    
        Optional<GLint> getGeometryShaderInvocations() const { return mGeometryShaderInvocations; }
    
        CompileStatus getCompileStatus() const { return mCompileStatus; }
    
      private:
        friend class Shader;
    
        std::string mLabel;
    
        ShaderType mShaderType;
        int mShaderVersion;
        std::string mTranslatedSource;
        sh::BinaryBlob mCompiledBinary;
        std::string mSource;
    
        sh::WorkGroupSize mLocalSize;
    
        std::vector<sh::ShaderVariable> mInputVaryings;
        std::vector<sh::ShaderVariable> mOutputVaryings;
        std::vector<sh::ShaderVariable> mUniforms;
        std::vector<sh::InterfaceBlock> mUniformBlocks;
        std::vector<sh::InterfaceBlock> mShaderStorageBlocks;
        std::vector<sh::ShaderVariable> mAllAttributes;
        std::vector<sh::ShaderVariable> mActiveAttributes;
        std::vector<sh::ShaderVariable> mActiveOutputVariables;
    
        bool mEarlyFragmentTestsOptimization;
        rx::SpecConstUsageBits mSpecConstUsageBits;
    
        // ANGLE_multiview.
        int mNumViews;
    
        // Geometry Shader.
        Optional<PrimitiveMode> mGeometryShaderInputPrimitiveType;
        Optional<PrimitiveMode> mGeometryShaderOutputPrimitiveType;
        Optional<GLint> mGeometryShaderMaxVertices;
        int mGeometryShaderInvocations;
    
        // Tessellation Shader
        int mTessControlShaderVertices;
        GLenum mTessGenMode;
        GLenum mTessGenSpacing;
        GLenum mTessGenVertexOrder;
        GLenum mTessGenPointMode;
    
        // Indicates if this shader has been successfully compiled
        CompileStatus mCompileStatus;
    };
    
    class Shader final : angle::NonCopyable, public LabeledObject
    {
      public:
        Shader(ShaderProgramManager *manager,
               rx::GLImplFactory *implFactory,
               const gl::Limitations &rendererLimitations,
               ShaderType type,
               ShaderProgramID handle);
    
        void onDestroy(const Context *context);
    
        void setLabel(const Context *context, const std::string &label) override;
        const std::string &getLabel() const override;
    
        ShaderType getType() const { return mType; }
        ShaderProgramID getHandle() const;
    
        rx::ShaderImpl *getImplementation() const { return mImplementation.get(); }
    
        void setSource(GLsizei count, const char *const *string, const GLint *length);
        int getInfoLogLength();
        void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
        std::string getInfoLogString() const { return mInfoLog; }
        int getSourceLength() const;
        const std::string &getSourceString() const { return mState.getSource(); }
        void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
        int getTranslatedSourceLength();
        int getTranslatedSourceWithDebugInfoLength();
        const std::string &getTranslatedSource();
        void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer);
        void getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer);
        const sh::BinaryBlob &getCompiledBinary();
    
        void compile(const Context *context);
        bool isCompiled();
        bool isCompleted();
    
        void addRef();
        void release(const Context *context);
        unsigned int getRefCount() const;
        bool isFlaggedForDeletion() const;
        void flagForDeletion();
        bool hasEarlyFragmentTestsOptimization() const
        {
            return mState.mEarlyFragmentTestsOptimization;
        }
        rx::SpecConstUsageBits getSpecConstUsageBits() const { return mState.mSpecConstUsageBits; }
    
        int getShaderVersion();
    
        const std::vector<sh::ShaderVariable> &getInputVaryings();
        const std::vector<sh::ShaderVariable> &getOutputVaryings();
        const std::vector<sh::ShaderVariable> &getUniforms();
        const std::vector<sh::InterfaceBlock> &getUniformBlocks();
        const std::vector<sh::InterfaceBlock> &getShaderStorageBlocks();
        const std::vector<sh::ShaderVariable> &getActiveAttributes();
        const std::vector<sh::ShaderVariable> &getAllAttributes();
        const std::vector<sh::ShaderVariable> &getActiveOutputVariables();
    
        // Returns mapped name of a transform feedback varying. The original name may contain array
        // brackets with an index inside, which will get copied to the mapped name. The varying must be
        // known to be declared in the shader.
        std::string getTransformFeedbackVaryingMappedName(const std::string &tfVaryingName);
    
        const sh::WorkGroupSize &getWorkGroupSize();
    
        int getNumViews();
    
        Optional<PrimitiveMode> getGeometryShaderInputPrimitiveType();
        Optional<PrimitiveMode> getGeometryShaderOutputPrimitiveType();
        int getGeometryShaderInvocations();
        Optional<GLint> getGeometryShaderMaxVertices();
        int getTessControlShaderVertices();
        GLenum getTessGenMode();
        GLenum getTessGenSpacing();
        GLenum getTessGenVertexOrder();
        GLenum getTessGenPointMode();
    
        const std::string &getCompilerResourcesString() const;
    
        const ShaderState &getState() const { return mState; }
    
        GLuint getCurrentMaxComputeWorkGroupInvocations() const
        {
            return mCurrentMaxComputeWorkGroupInvocations;
        }
    
        unsigned int getMaxComputeSharedMemory() const { return mMaxComputeSharedMemory; }
        bool hasBeenDeleted() const { return mDeleteStatus; }
    
        void resolveCompile();
    
      private:
        struct CompilingState;
    
        ~Shader() override;
        static void GetSourceImpl(const std::string &source,
                                  GLsizei bufSize,
                                  GLsizei *length,
                                  char *buffer);
    
        ShaderState mState;
        std::unique_ptr<rx::ShaderImpl> mImplementation;
        const gl::Limitations mRendererLimitations;
        const ShaderProgramID mHandle;
        const ShaderType mType;
        unsigned int mRefCount;  // Number of program objects this shader is attached to
        bool mDeleteStatus;  // Flag to indicate that the shader can be deleted when no longer in use
        std::string mInfoLog;
    
        // We keep a reference to the translator in order to defer compiles while preserving settings.
        BindingPointer<Compiler> mBoundCompiler;
        std::unique_ptr<CompilingState> mCompilingState;
        std::string mCompilerResourcesString;
    
        ShaderProgramManager *mResourceManager;
    
        GLuint mCurrentMaxComputeWorkGroupInvocations;
        unsigned int mMaxComputeSharedMemory;
    };
    
    bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y);
    
    const char *GetShaderTypeString(ShaderType type);
    }  // namespace gl
    
    #endif  // LIBANGLE_SHADER_H_