// // 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 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 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; 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 mUniformRegisterMap; std::map mUniformBlockRegisterMap; std::map mUniformBlockUseStructuredBufferMap; std::map mShaderStorageBlockRegisterMap; unsigned int mReadonlyImage2DRegisterIndex; unsigned int mImage2DRegisterIndex; std::set mUsedImage2DFunctionNames; ShCompileOptions mAdditionalOptions; }; } // namespace rx #endif // LIBANGLE_RENDERER_D3D_SHADERD3D_H_