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