1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci
9cb93a386Sopenharmony_ci#ifndef GrD3DRenderTarget_DEFINED
10cb93a386Sopenharmony_ci#define GrD3DRenderTarget_DEFINED
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ci#include "src/gpu/GrRenderTarget.h"
13cb93a386Sopenharmony_ci#include "src/gpu/d3d/GrD3DTextureResource.h"
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ci#include "include/gpu/d3d/GrD3DTypes.h"
16cb93a386Sopenharmony_ci#include "src/gpu/GrGpu.h"
17cb93a386Sopenharmony_ci#include "src/gpu/d3d/GrD3DDescriptorHeap.h"
18cb93a386Sopenharmony_ci#include "src/gpu/d3d/GrD3DResourceProvider.h"
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_ciclass GrD3DGpu;
21cb93a386Sopenharmony_ciclass GrD3DRenderTarget;
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_cistruct GrD3DTextureResourceInfo;
24cb93a386Sopenharmony_ci
25cb93a386Sopenharmony_ciclass GrD3DRenderTarget: public GrRenderTarget, public virtual GrD3DTextureResource {
26cb93a386Sopenharmony_cipublic:
27cb93a386Sopenharmony_ci    static sk_sp<GrD3DRenderTarget> MakeWrappedRenderTarget(GrD3DGpu*, SkISize, int sampleCnt,
28cb93a386Sopenharmony_ci                                                            const GrD3DTextureResourceInfo&,
29cb93a386Sopenharmony_ci                                                            sk_sp<GrD3DResourceState>);
30cb93a386Sopenharmony_ci    ~GrD3DRenderTarget() override;
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ci    GrBackendFormat backendFormat() const override { return this->getBackendFormat(); }
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_ci    /**
35cb93a386Sopenharmony_ci     * If this render target is multisampled, this returns the MSAA texture for rendering. This
36cb93a386Sopenharmony_ci     * will be different than *this* when we have separate render/resolve images. If not
37cb93a386Sopenharmony_ci     * multisampled returns nullptr.
38cb93a386Sopenharmony_ci     */
39cb93a386Sopenharmony_ci    const GrD3DTextureResource* msaaTextureResource() const;
40cb93a386Sopenharmony_ci    GrD3DTextureResource* msaaTextureResource();
41cb93a386Sopenharmony_ci
42cb93a386Sopenharmony_ci    bool canAttemptStencilAttachment(bool useMSAASurface) const override {
43cb93a386Sopenharmony_ci        SkASSERT(useMSAASurface == (this->numSamples() > 1));
44cb93a386Sopenharmony_ci        return true;
45cb93a386Sopenharmony_ci    }
46cb93a386Sopenharmony_ci
47cb93a386Sopenharmony_ci    GrBackendRenderTarget getBackendRenderTarget() const override;
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci    D3D12_CPU_DESCRIPTOR_HANDLE colorRenderTargetView() const {
50cb93a386Sopenharmony_ci        return fColorRenderTargetView.fHandle;
51cb93a386Sopenharmony_ci    }
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci    DXGI_FORMAT stencilDxgiFormat() const;
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci    // Key used for the program desc
56cb93a386Sopenharmony_ci    void genKey(GrProcessorKeyBuilder* b) const;
57cb93a386Sopenharmony_ci
58cb93a386Sopenharmony_ciprotected:
59cb93a386Sopenharmony_ci    GrD3DRenderTarget(GrD3DGpu* gpu,
60cb93a386Sopenharmony_ci                      SkISize dimensions,
61cb93a386Sopenharmony_ci                      const GrD3DTextureResourceInfo& info,
62cb93a386Sopenharmony_ci                      sk_sp<GrD3DResourceState> state,
63cb93a386Sopenharmony_ci                      const GrD3DTextureResourceInfo& msaaInfo,
64cb93a386Sopenharmony_ci                      sk_sp<GrD3DResourceState> msaaState,
65cb93a386Sopenharmony_ci                      const GrD3DDescriptorHeap::CPUHandle& colorRenderTargetView,
66cb93a386Sopenharmony_ci                      const GrD3DDescriptorHeap::CPUHandle& resolveRenderTargetView);
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ci    GrD3DRenderTarget(GrD3DGpu* gpu,
69cb93a386Sopenharmony_ci                      SkISize dimensions,
70cb93a386Sopenharmony_ci                      const GrD3DTextureResourceInfo& info,
71cb93a386Sopenharmony_ci                      sk_sp<GrD3DResourceState> state,
72cb93a386Sopenharmony_ci                      const GrD3DDescriptorHeap::CPUHandle& renderTargetView);
73cb93a386Sopenharmony_ci
74cb93a386Sopenharmony_ci    void onAbandon() override;
75cb93a386Sopenharmony_ci    void onRelease() override;
76cb93a386Sopenharmony_ci
77cb93a386Sopenharmony_ci    // This accounts for the texture's memory and any MSAA renderbuffer's memory.
78cb93a386Sopenharmony_ci    size_t onGpuMemorySize() const override {
79cb93a386Sopenharmony_ci        int numColorSamples = this->numSamples();
80cb93a386Sopenharmony_ci        if (numColorSamples > 1) {
81cb93a386Sopenharmony_ci            // Add one to account for the resolved VkImage.
82cb93a386Sopenharmony_ci            numColorSamples += 1;
83cb93a386Sopenharmony_ci        }
84cb93a386Sopenharmony_ci        return GrSurface::ComputeSize(this->backendFormat(), this->dimensions(),
85cb93a386Sopenharmony_ci                                      numColorSamples, GrMipmapped::kNo);
86cb93a386Sopenharmony_ci    }
87cb93a386Sopenharmony_ci
88cb93a386Sopenharmony_ciprivate:
89cb93a386Sopenharmony_ci    // Extra param to disambiguate from constructor used by subclasses.
90cb93a386Sopenharmony_ci    enum Wrapped { kWrapped };
91cb93a386Sopenharmony_ci    GrD3DRenderTarget(GrD3DGpu* gpu,
92cb93a386Sopenharmony_ci                      SkISize dimensions,
93cb93a386Sopenharmony_ci                      const GrD3DTextureResourceInfo& info,
94cb93a386Sopenharmony_ci                      sk_sp<GrD3DResourceState> state,
95cb93a386Sopenharmony_ci                      const GrD3DTextureResourceInfo& msaaInfo,
96cb93a386Sopenharmony_ci                      sk_sp<GrD3DResourceState> msaaState,
97cb93a386Sopenharmony_ci                      const GrD3DDescriptorHeap::CPUHandle& colorRenderTargetView,
98cb93a386Sopenharmony_ci                      const GrD3DDescriptorHeap::CPUHandle& resolveRenderTargetView,
99cb93a386Sopenharmony_ci                      Wrapped);
100cb93a386Sopenharmony_ci
101cb93a386Sopenharmony_ci    GrD3DRenderTarget(GrD3DGpu* gpu,
102cb93a386Sopenharmony_ci                      SkISize dimensions,
103cb93a386Sopenharmony_ci                      const GrD3DTextureResourceInfo& info,
104cb93a386Sopenharmony_ci                      sk_sp<GrD3DResourceState> state,
105cb93a386Sopenharmony_ci                      const GrD3DDescriptorHeap::CPUHandle& renderTargetView,
106cb93a386Sopenharmony_ci                      Wrapped);
107cb93a386Sopenharmony_ci
108cb93a386Sopenharmony_ci    GrD3DGpu* getD3DGpu() const;
109cb93a386Sopenharmony_ci
110cb93a386Sopenharmony_ci    bool completeStencilAttachment(GrAttachment* stencil, bool useMSAASurface) override {
111cb93a386Sopenharmony_ci        SkASSERT(useMSAASurface == (this->numSamples() > 1));
112cb93a386Sopenharmony_ci        return true;
113cb93a386Sopenharmony_ci    }
114cb93a386Sopenharmony_ci
115cb93a386Sopenharmony_ci    // In Direct3D we call the release proc after we are finished with the underlying
116cb93a386Sopenharmony_ci    // GrD3DTextureResource::Resource object (which occurs after the GPU finishes all work on it).
117cb93a386Sopenharmony_ci    void onSetRelease(sk_sp<GrRefCntedCallback> releaseHelper) override {
118cb93a386Sopenharmony_ci        // Forward the release proc on to GrD3DTextureResource
119cb93a386Sopenharmony_ci        this->setResourceRelease(std::move(releaseHelper));
120cb93a386Sopenharmony_ci    }
121cb93a386Sopenharmony_ci
122cb93a386Sopenharmony_ci    void releaseInternalObjects();
123cb93a386Sopenharmony_ci
124cb93a386Sopenharmony_ci    std::unique_ptr<GrD3DTextureResource> fMSAATextureResource;
125cb93a386Sopenharmony_ci
126cb93a386Sopenharmony_ci    GrD3DDescriptorHeap::CPUHandle fColorRenderTargetView;
127cb93a386Sopenharmony_ci    GrD3DDescriptorHeap::CPUHandle fResolveRenderTargetView;
128cb93a386Sopenharmony_ci};
129cb93a386Sopenharmony_ci
130cb93a386Sopenharmony_ci#endif
131