| // |
| // 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 &data, |
| 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; |
| 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; |
| 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 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 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, unsigned int> mShaderStorageBlockRegisterMap; |
| unsigned int mReadonlyImage2DRegisterIndex; |
| unsigned int mImage2DRegisterIndex; |
| std::set<std::string> mUsedImage2DFunctionNames; |
| ShCompileOptions mAdditionalOptions; |
| }; |
| } // namespace rx |
| |
| #endif // LIBANGLE_RENDERER_D3D_SHADERD3D_H_ |