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