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