1/*
2 * Copyright 2020 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "src/gpu/d3d/GrD3DAttachment.h"
9
10#include "src/gpu/d3d/GrD3DGpu.h"
11
12GrD3DAttachment::GrD3DAttachment(GrD3DGpu* gpu,
13                                 SkISize dimensions,
14                                 UsageFlags supportedUsages,
15                                 DXGI_FORMAT format,
16                                 const D3D12_RESOURCE_DESC& desc,
17                                 const GrD3DTextureResourceInfo& info,
18                                 sk_sp<GrD3DResourceState> state,
19                                 const GrD3DDescriptorHeap::CPUHandle& view)
20        : GrAttachment(gpu, dimensions, supportedUsages, desc.SampleDesc.Count, GrMipmapped::kNo,
21                       GrProtected::kNo)
22        , GrD3DTextureResource(info, state)
23        , fView(view)
24        , fFormat(format) {
25    this->registerWithCache(SkBudgeted::kYes);
26}
27
28sk_sp<GrD3DAttachment> GrD3DAttachment::MakeStencil(GrD3DGpu* gpu,
29                                                    SkISize dimensions,
30                                                    int sampleCnt,
31                                                    DXGI_FORMAT format) {
32    D3D12_RESOURCE_DESC resourceDesc = {};
33    resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
34    resourceDesc.Alignment = 0;  // default alignment
35    resourceDesc.Width = dimensions.width();
36    resourceDesc.Height = dimensions.height();
37    resourceDesc.DepthOrArraySize = 1;
38    resourceDesc.MipLevels = 1;
39    resourceDesc.Format = format;
40    resourceDesc.SampleDesc.Count = sampleCnt;
41    resourceDesc.SampleDesc.Quality = DXGI_STANDARD_MULTISAMPLE_QUALITY_PATTERN;
42    resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;  // use driver-selected swizzle
43    resourceDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
44
45    D3D12_CLEAR_VALUE clearValue = {};
46    clearValue.Format = format;
47    clearValue.DepthStencil.Depth = 0;
48    clearValue.DepthStencil.Stencil = 0;
49
50    GrD3DTextureResourceInfo info;
51    if (!GrD3DTextureResource::InitTextureResourceInfo(gpu, resourceDesc,
52                                                       D3D12_RESOURCE_STATE_DEPTH_WRITE,
53                                                       GrProtected::kNo, &clearValue, &info)) {
54        return nullptr;
55    }
56
57    GrD3DDescriptorHeap::CPUHandle view =
58            gpu->resourceProvider().createDepthStencilView(info.fResource.get());
59
60    sk_sp<GrD3DResourceState> state(new GrD3DResourceState(info.fResourceState));
61    return sk_sp<GrD3DAttachment>(new GrD3DAttachment(gpu, dimensions,
62                                                      UsageFlags::kStencilAttachment,
63                                                      format, resourceDesc, info,
64                                                      std::move(state), view));
65}
66
67void GrD3DAttachment::onRelease() {
68    GrD3DGpu* gpu = this->getD3DGpu();
69    this->releaseResource(gpu);
70
71    GrAttachment::onRelease();
72}
73
74void GrD3DAttachment::onAbandon() {
75    GrD3DGpu* gpu = this->getD3DGpu();
76    this->releaseResource(gpu);
77
78    GrAttachment::onAbandon();
79}
80
81GrD3DGpu* GrD3DAttachment::getD3DGpu() const {
82    SkASSERT(!this->wasDestroyed());
83    return static_cast<GrD3DGpu*>(this->getGpu());
84}
85