1 // 2 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // Clear11.h: Framebuffer clear utility class. 8 9 #ifndef LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_ 10 #define LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_ 11 12 #include <map> 13 #include <vector> 14 15 #include "libANGLE/angletypes.h" 16 #include "libANGLE/Error.h" 17 #include "libANGLE/Framebuffer.h" 18 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" 19 20 namespace rx 21 { 22 class Renderer11; 23 class RenderTarget11; 24 struct ClearParameters; 25 26 template <typename T> 27 struct RtvDsvClearInfo 28 { 29 T r, g, b, a; 30 float z; 31 float c1padding[3]; 32 }; 33 34 class Clear11 : angle::NonCopyable 35 { 36 public: 37 explicit Clear11(Renderer11 *renderer); 38 ~Clear11(); 39 40 // Clears the framebuffer with the supplied clear parameters, assumes that the framebuffer is currently applied. 41 gl::Error clearFramebuffer(const gl::Context *context, 42 const ClearParameters &clearParams, 43 const gl::FramebufferState &fboData); 44 45 private: 46 class ShaderManager final : angle::NonCopyable 47 { 48 public: 49 ShaderManager(); 50 ~ShaderManager(); 51 gl::Error getShadersAndLayout(Renderer11 *renderer, 52 const INT clearType, 53 const uint32_t numRTs, 54 const bool hasLayeredLayout, 55 const d3d11::InputLayout **il, 56 const d3d11::VertexShader **vs, 57 const d3d11::GeometryShader **gs, 58 const d3d11::PixelShader **ps); 59 60 private: 61 constexpr static size_t kNumShaders = D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; 62 63 d3d11::InputLayout mIl9; 64 d3d11::LazyShader<ID3D11VertexShader> mVs9; 65 d3d11::LazyShader<ID3D11PixelShader> mPsFloat9; 66 d3d11::LazyShader<ID3D11VertexShader> mVs; 67 d3d11::LazyShader<ID3D11VertexShader> mVsMultiview; 68 d3d11::LazyShader<ID3D11GeometryShader> mGsMultiview; 69 d3d11::LazyShader<ID3D11PixelShader> mPsDepth; 70 std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsFloat; 71 std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsUInt; 72 std::array<d3d11::LazyShader<ID3D11PixelShader>, kNumShaders> mPsSInt; 73 }; 74 75 bool useVertexBuffer() const; 76 gl::Error ensureConstantBufferCreated(); 77 gl::Error ensureVertexBufferCreated(); 78 gl::Error ensureResourcesInitialized(); 79 80 Renderer11 *mRenderer; 81 bool mResourcesInitialized; 82 83 // States 84 d3d11::RasterizerState mScissorEnabledRasterizerState; 85 d3d11::RasterizerState mScissorDisabledRasterizerState; 86 gl::DepthStencilState mDepthStencilStateKey; 87 d3d11::BlendStateKey mBlendStateKey; 88 89 // Shaders and shader resources 90 ShaderManager mShaderManager; 91 d3d11::Buffer mConstantBuffer; 92 d3d11::Buffer mVertexBuffer; 93 94 // Buffer data and draw parameters 95 RtvDsvClearInfo<float> mShaderData; 96 }; 97 98 } // namespace rx 99 100 #endif // LIBANGLE_RENDERER_D3D_D3D11_CLEAR11_H_ 101