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