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