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/GrD3DDescriptorHeap.h" 9#include "src/gpu/d3d/GrD3DGpu.h" 10 11std::unique_ptr<GrD3DDescriptorHeap> GrD3DDescriptorHeap::Make(GrD3DGpu* gpu, 12 D3D12_DESCRIPTOR_HEAP_TYPE type, 13 unsigned int numDescriptors, 14 D3D12_DESCRIPTOR_HEAP_FLAGS flags) { 15 D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {}; 16 heapDesc.Type = type; 17 heapDesc.NumDescriptors = numDescriptors; 18 heapDesc.Flags = flags; 19 20 ID3D12DescriptorHeap* heap; 21 gpu->device()->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&heap)); 22 23 return std::unique_ptr<GrD3DDescriptorHeap>( 24 new GrD3DDescriptorHeap(std::move(gr_cp<ID3D12DescriptorHeap>(heap)), 25 gpu->device()->GetDescriptorHandleIncrementSize(type))); 26} 27 28GrD3DDescriptorHeap::GrD3DDescriptorHeap(const gr_cp<ID3D12DescriptorHeap>& heap, 29 unsigned int handleIncrementSize) 30 : fHeap(heap) 31 , fHandleIncrementSize(handleIncrementSize) 32 , fUniqueID(GenID()) { 33 fCPUHeapStart = fHeap->GetCPUDescriptorHandleForHeapStart(); 34 fGPUHeapStart = fHeap->GetGPUDescriptorHandleForHeapStart(); 35} 36 37GrD3DDescriptorHeap::CPUHandle GrD3DDescriptorHeap::getCPUHandle(unsigned int index) { 38 SkASSERT(index < fHeap->GetDesc().NumDescriptors); 39 D3D12_CPU_DESCRIPTOR_HANDLE handle = fCPUHeapStart; 40 handle.ptr += index * fHandleIncrementSize; 41 return {handle, fUniqueID}; 42} 43 44GrD3DDescriptorHeap::GPUHandle GrD3DDescriptorHeap::getGPUHandle(unsigned int index) { 45 SkASSERT(index < fHeap->GetDesc().NumDescriptors); 46 D3D12_GPU_DESCRIPTOR_HANDLE handle = fGPUHeapStart; 47 handle.ptr += index * fHandleIncrementSize; 48 return {handle, fUniqueID}; 49} 50 51 52 53