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