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