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 #ifndef GrD3DCpuDescriptorManager_DEFINED
9 #define GrD3DCpuDescriptorManager_DEFINED
10 
11 #include "src/gpu/d3d/GrD3DDescriptorHeap.h"
12 
13 class GrD3DGpu;
14 
15 class GrD3DCpuDescriptorManager {
16 public:
17     GrD3DCpuDescriptorManager(GrD3DGpu*);
18 
19     GrD3DDescriptorHeap::CPUHandle createRenderTargetView(GrD3DGpu*,
20                                                           ID3D12Resource* textureResource);
21     void recycleRenderTargetView(const GrD3DDescriptorHeap::CPUHandle&);
22 
23     GrD3DDescriptorHeap::CPUHandle createDepthStencilView(GrD3DGpu*,
24                                                           ID3D12Resource* textureResource);
25     void recycleDepthStencilView(const GrD3DDescriptorHeap::CPUHandle&);
26 
27     GrD3DDescriptorHeap::CPUHandle createConstantBufferView(GrD3DGpu*,
28                                                             ID3D12Resource* bufferResource,
29                                                             size_t offset,
30                                                             size_t size);
31     GrD3DDescriptorHeap::CPUHandle createShaderResourceView(GrD3DGpu*,
32                                                             ID3D12Resource* resource);
33     void recycleConstantOrShaderView(const GrD3DDescriptorHeap::CPUHandle&);
34 
35     GrD3DDescriptorHeap::CPUHandle createSampler(GrD3DGpu*,
36                                                  D3D12_FILTER filter,
37                                                  float maxLOD,
38                                                  D3D12_TEXTURE_ADDRESS_MODE addressModeU,
39                                                  D3D12_TEXTURE_ADDRESS_MODE addressModeV);
40     void recycleSampler(const GrD3DDescriptorHeap::CPUHandle&);
41 
42 private:
43     class Heap {
44     public:
45         static std::unique_ptr<Heap> Make(GrD3DGpu* gpu, D3D12_DESCRIPTOR_HEAP_TYPE type,
46                                           unsigned int numDescriptors);
47 
48         GrD3DDescriptorHeap::CPUHandle allocateCPUHandle();
49         void freeCPUHandle(const GrD3DDescriptorHeap::CPUHandle&);
ownsHandle(const GrD3DDescriptorHeap::CPUHandle & handle)50         bool ownsHandle(const GrD3DDescriptorHeap::CPUHandle& handle) {
51             return handle.fHeapID == fHeap->uniqueID();
52         }
53 
canAllocate()54         bool canAllocate() { return fFreeCount > 0; }
55 
56     private:
Heap(std::unique_ptr<GrD3DDescriptorHeap> & heap,unsigned int numDescriptors)57         Heap(std::unique_ptr<GrD3DDescriptorHeap>& heap, unsigned int numDescriptors)
58             : fHeap(std::move(heap))
59             , fFreeBlocks(numDescriptors)
60             , fFreeCount(numDescriptors) {
61             for (unsigned int i = 0; i < numDescriptors; ++i) {
62                 fFreeBlocks.set(i);
63             }
64         }
65 
66         std::unique_ptr<GrD3DDescriptorHeap> fHeap;
67         SkBitSet fFreeBlocks;
68         unsigned int fFreeCount;
69     };
70 
71     class HeapPool {
72     public:
73         HeapPool(GrD3DGpu*, D3D12_DESCRIPTOR_HEAP_TYPE);
74 
75         GrD3DDescriptorHeap::CPUHandle allocateHandle(GrD3DGpu*);
76         void releaseHandle(const GrD3DDescriptorHeap::CPUHandle&);
77 
78     private:
79         std::vector<std::unique_ptr<Heap>> fDescriptorHeaps;
80         int fMaxAvailableDescriptors;
81         D3D12_DESCRIPTOR_HEAP_TYPE fHeapType;
82     };
83 
84     HeapPool fRTVDescriptorPool;
85     HeapPool fDSVDescriptorPool;
86     HeapPool fCBVSRVDescriptorPool;
87     HeapPool fSamplerDescriptorPool;
88 };
89 
90 #endif
91