Edit

kc3-lang/angle/src/libANGLE/renderer/d3d/ShaderD3D.h

Branch :

  • Show log

    Commit

  • Author : Xinghua Cao
    Date : 2020-11-20 12:24:41
    Hash : 378653f8
    Message : D3D: throw a perf warning for uniform block We had translated an uniform block only containing a large array member into StructuredBuffer instead of cbuffer on D3D backend for slow fxc compile performance issue with dynamic uniform indexing. This patch throw a warning if a uniform block containing a large array member fails to hit the optimization. Bug: angleproject:3682 Change-Id: I33459b559923f16a8dfb70c6f46ec52f68d96e06 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2552365 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jiajia Qin <jiajia.qin@intel.com>

  • src/libANGLE/renderer/d3d/ShaderD3D.h
  • //
    // Copyright 2014 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.
    //
    
    // ShaderD3D.h: Defines the rx::ShaderD3D class which implements rx::ShaderImpl.
    
    #ifndef LIBANGLE_RENDERER_D3D_SHADERD3D_H_
    #define LIBANGLE_RENDERER_D3D_SHADERD3D_H_
    
    #include "libANGLE/renderer/ShaderImpl.h"
    
    #include <map>
    
    namespace angle
    {
    struct CompilerWorkaroundsD3D;
    struct FeaturesD3D;
    }  // namespace angle
    
    namespace gl
    {
    struct Extensions;
    }
    
    namespace rx
    {
    class DynamicHLSL;
    class RendererD3D;
    struct D3DUniform;
    
    class ShaderD3D : public ShaderImpl
    {
      public:
        ShaderD3D(const gl::ShaderState &state,
                  const angle::FeaturesD3D &features,
                  const gl::Extensions &extensions);
        ~ShaderD3D() override;
    
        std::shared_ptr<WaitableCompileEvent> compile(const gl::Context *context,
                                                      gl::ShCompilerInstance *compilerInstance,
                                                      ShCompileOptions options) override;
    
        std::string getDebugInfo() const override;
    
        // D3D-specific methods
        void uncompile();
    
        bool hasUniform(const std::string &name) const;
    
        // Query regular uniforms with their name. Query sampler fields of structs with field selection
        // using dot (.) operator.
        unsigned int getUniformRegister(const std::string &uniformName) const;
    
        unsigned int getUniformBlockRegister(const std::string &blockName) const;
        bool shouldUniformBlockUseStructuredBuffer(const std::string &blockName) const;
        unsigned int getShaderStorageBlockRegister(const std::string &blockName) const;
        unsigned int getReadonlyImage2DRegisterIndex() const { return mReadonlyImage2DRegisterIndex; }
        unsigned int getImage2DRegisterIndex() const { return mImage2DRegisterIndex; }
        bool useImage2DFunction(const std::string &functionName) const;
        const std::set<std::string> &getSlowCompilingUniformBlockSet() const;
        void appendDebugInfo(const std::string &info) const { mDebugInfo += info; }
    
        void generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const;
    
        bool usesMultipleRenderTargets() const { return mUsesMultipleRenderTargets; }
        bool usesFragColor() const { return mUsesFragColor; }
        bool usesFragData() const { return mUsesFragData; }
        bool usesSecondaryColor() const { return mUsesSecondaryColor; }
        bool usesFragCoord() const { return mUsesFragCoord; }
        bool usesFrontFacing() const { return mUsesFrontFacing; }
        bool usesHelperInvocation() const { return mUsesHelperInvocation; }
        bool usesPointSize() const { return mUsesPointSize; }
        bool usesPointCoord() const { return mUsesPointCoord; }
        bool usesDepthRange() const { return mUsesDepthRange; }
        bool usesFragDepth() const { return mUsesFragDepth; }
        bool usesVertexID() const { return mUsesVertexID; }
        bool usesViewID() const { return mUsesViewID; }
        bool hasANGLEMultiviewEnabled() const { return mHasANGLEMultiviewEnabled; }
    
        ShShaderOutput getCompilerOutputType() const;
    
      private:
        bool mUsesMultipleRenderTargets;
        bool mUsesFragColor;
        bool mUsesFragData;
        bool mUsesSecondaryColor;
        bool mUsesFragCoord;
        bool mUsesFrontFacing;
        bool mUsesHelperInvocation;
        bool mUsesPointSize;
        bool mUsesPointCoord;
        bool mUsesDepthRange;
        bool mUsesFragDepth;
        bool mHasANGLEMultiviewEnabled;
        bool mUsesVertexID;
        bool mUsesViewID;
        bool mUsesDiscardRewriting;
        bool mUsesNestedBreak;
        bool mRequiresIEEEStrictCompiling;
    
        ShShaderOutput mCompilerOutputType;
        mutable std::string mDebugInfo;
        std::map<std::string, unsigned int> mUniformRegisterMap;
        std::map<std::string, unsigned int> mUniformBlockRegisterMap;
        std::map<std::string, bool> mUniformBlockUseStructuredBufferMap;
        std::set<std::string> mSlowCompilingUniformBlockSet;
        std::map<std::string, unsigned int> mShaderStorageBlockRegisterMap;
        unsigned int mReadonlyImage2DRegisterIndex;
        unsigned int mImage2DRegisterIndex;
        std::set<std::string> mUsedImage2DFunctionNames;
        ShCompileOptions mAdditionalOptions;
    };
    }  // namespace rx
    
    #endif  // LIBANGLE_RENDERER_D3D_SHADERD3D_H_