• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 GrD3DDescriptorHeap_DEFINED
9 #define GrD3DDescriptorHeap_DEFINED
10 
11 #include "include/gpu/d3d/GrD3DTypes.h"
12 #include "src/gpu/GrManagedResource.h"
13 #include "src/utils/SkBitSet.h"
14 
15 class GrD3DGpu;
16 
17 class GrD3DDescriptorHeap {
18 public:
19     static std::unique_ptr<GrD3DDescriptorHeap> Make(GrD3DGpu* gpu, D3D12_DESCRIPTOR_HEAP_TYPE,
20                                                      unsigned int numDescriptors,
21                                                      D3D12_DESCRIPTOR_HEAP_FLAGS);
22 
23     ~GrD3DDescriptorHeap() = default;
24 
uniqueID()25     uint32_t uniqueID() const { return fUniqueID; }
26 
27     struct CPUHandle {
28         D3D12_CPU_DESCRIPTOR_HANDLE fHandle;
29         uint32_t fHeapID;
30     };
31 
32     struct GPUHandle {
33         D3D12_GPU_DESCRIPTOR_HANDLE fHandle;
34         uint32_t fHeapID;
35     };
36 
37     CPUHandle getCPUHandle(unsigned int index); // write-only if shader-visible
38     GPUHandle getGPUHandle(unsigned int index);
descriptorHeap()39     ID3D12DescriptorHeap* descriptorHeap() const { return fHeap.get(); }
handleIncrementSize()40     size_t handleIncrementSize() { return fHandleIncrementSize; }
41 
getIndex(const CPUHandle & handle)42     size_t getIndex(const CPUHandle& handle) {
43         SkASSERT(handle.fHeapID == fUniqueID);
44         size_t index = (handle.fHandle.ptr - fCPUHeapStart.ptr) / fHandleIncrementSize;
45         SkASSERT(index < fHeap->GetDesc().NumDescriptors);
46         SkASSERT(handle.fHandle.ptr == fCPUHeapStart.ptr + index * fHandleIncrementSize);
47         return index;
48     }
49 
getIndex(const GPUHandle & handle)50     size_t getIndex(const GPUHandle& handle) {
51         SkASSERT(handle.fHeapID == fUniqueID);
52         size_t index = (handle.fHandle.ptr - fCPUHeapStart.ptr) / fHandleIncrementSize;
53         SkASSERT(index < fHeap->GetDesc().NumDescriptors);
54         SkASSERT(handle.fHandle.ptr == fCPUHeapStart.ptr + index * fHandleIncrementSize);
55         return index;
56     }
57 
58 protected:
59     GrD3DDescriptorHeap(const gr_cp<ID3D12DescriptorHeap>&, unsigned int handleIncrementSize);
60 
GenID()61     static uint32_t GenID() {
62         static std::atomic<uint32_t> nextID{1};
63         uint32_t id;
64         do {
65             id = nextID++;
66         } while (id == SK_InvalidUniqueID);
67         return id;
68     }
69 
70     gr_cp<ID3D12DescriptorHeap> fHeap;
71     size_t fHandleIncrementSize;
72     D3D12_CPU_DESCRIPTOR_HANDLE fCPUHeapStart;
73     D3D12_GPU_DESCRIPTOR_HANDLE fGPUHeapStart;
74     uint32_t fUniqueID;
75 };
76 
77 #endif
78