1 //
2 // Copyright (c) 2012 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 // RenderTarget11.h: Defines a DX11-specific wrapper for ID3D11View pointers
8 // retained by Renderbuffers.
9 
10 #ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_
11 #define LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_
12 
13 #include "libANGLE/renderer/d3d/RenderTargetD3D.h"
14 #include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h"
15 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
16 #include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
17 
18 namespace rx
19 {
20 class SwapChain11;
21 class Renderer11;
22 
23 class RenderTarget11 : public RenderTargetD3D
24 {
25   public:
26     RenderTarget11(const d3d11::Format &formatSet);
27     ~RenderTarget11() override;
28 
29     virtual const TextureHelper11 &getTexture() const                  = 0;
30     virtual const d3d11::RenderTargetView &getRenderTargetView() const = 0;
31     virtual const d3d11::DepthStencilView &getDepthStencilView() const = 0;
32     virtual const d3d11::SharedSRV &getShaderResourceView() const      = 0;
33     virtual const d3d11::SharedSRV &getBlitShaderResourceView() const  = 0;
34 
35     virtual unsigned int getSubresourceIndex() const = 0;
36 
37     void signalDirty(const gl::Context *context) override;
getBroadcastChannel()38     OnRenderTargetDirtyChannel *getBroadcastChannel() { return &mBroadcastChannel; }
39 
getFormatSet()40     const d3d11::Format &getFormatSet() const { return mFormatSet; }
41 
42   protected:
43     OnRenderTargetDirtyChannel mBroadcastChannel;
44     const d3d11::Format &mFormatSet;
45 };
46 
47 class TextureRenderTarget11 : public RenderTarget11
48 {
49   public:
50     // TextureRenderTarget11 takes ownership of any D3D11 resources it is given and will AddRef them
51     TextureRenderTarget11(d3d11::RenderTargetView &&rtv,
52                           const TextureHelper11 &resource,
53                           const d3d11::SharedSRV &srv,
54                           const d3d11::SharedSRV &blitSRV,
55                           GLenum internalFormat,
56                           const d3d11::Format &formatSet,
57                           GLsizei width,
58                           GLsizei height,
59                           GLsizei depth,
60                           GLsizei samples);
61     TextureRenderTarget11(d3d11::DepthStencilView &&dsv,
62                           const TextureHelper11 &resource,
63                           const d3d11::SharedSRV &srv,
64                           GLenum internalFormat,
65                           const d3d11::Format &formatSet,
66                           GLsizei width,
67                           GLsizei height,
68                           GLsizei depth,
69                           GLsizei samples);
70     ~TextureRenderTarget11() override;
71 
72     GLsizei getWidth() const override;
73     GLsizei getHeight() const override;
74     GLsizei getDepth() const override;
75     GLenum getInternalFormat() const override;
76     GLsizei getSamples() const override;
77 
78     const TextureHelper11 &getTexture() const override;
79     const d3d11::RenderTargetView &getRenderTargetView() const override;
80     const d3d11::DepthStencilView &getDepthStencilView() const override;
81     const d3d11::SharedSRV &getShaderResourceView() const override;
82     const d3d11::SharedSRV &getBlitShaderResourceView() const override;
83 
84     unsigned int getSubresourceIndex() const override;
85 
86   private:
87     GLsizei mWidth;
88     GLsizei mHeight;
89     GLsizei mDepth;
90     GLenum mInternalFormat;
91     GLsizei mSamples;
92 
93     unsigned int mSubresourceIndex;
94     TextureHelper11 mTexture;
95     d3d11::RenderTargetView mRenderTarget;
96     d3d11::DepthStencilView mDepthStencil;
97     d3d11::SharedSRV mShaderResource;
98 
99     // Shader resource view to use with internal blit shaders. Not set for depth/stencil render
100     // targets.
101     d3d11::SharedSRV mBlitShaderResource;
102 };
103 
104 class SurfaceRenderTarget11 : public RenderTarget11
105 {
106   public:
107     SurfaceRenderTarget11(SwapChain11 *swapChain, Renderer11 *renderer, bool depth);
108     ~SurfaceRenderTarget11() override;
109 
110     GLsizei getWidth() const override;
111     GLsizei getHeight() const override;
112     GLsizei getDepth() const override;
113     GLenum getInternalFormat() const override;
114     GLsizei getSamples() const override;
115 
116     const TextureHelper11 &getTexture() const override;
117     const d3d11::RenderTargetView &getRenderTargetView() const override;
118     const d3d11::DepthStencilView &getDepthStencilView() const override;
119     const d3d11::SharedSRV &getShaderResourceView() const override;
120     const d3d11::SharedSRV &getBlitShaderResourceView() const override;
121 
122     unsigned int getSubresourceIndex() const override;
123 
124   private:
125     SwapChain11 *mSwapChain;
126     bool mDepth;
127 };
128 
129 }  // namespace rx
130 
131 #endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERTARGET11_H_
132