Nameless Engine
Loading...
Searching...
No Matches
DirectXDescriptorHeap.h
1#pragma once
2
3// Standard.
4#include <variant>
5#include <memory>
6#include <unordered_set>
7#include <mutex>
8#include <atomic>
9#include <queue>
10#include <functional>
11
12// Custom.
13#include "render/directx/descriptors/DirectXDescriptor.h"
14#include "render/general/resources/GpuResource.h"
15#include "DirectXDescriptorType.hpp"
16
17// External.
18#include "directx/d3dx12.h"
19#include "misc/Error.h"
20
21// OS.
22#include <wrl.h>
23
24namespace ne {
25 using namespace Microsoft::WRL;
26
27 class DirectXRenderer;
28 class DirectXResource;
29 class DirectXDescriptorHeap;
30
32 enum class DescriptorHeapType : int {
33 RTV = 0,
34 DSV,
35 CBV_SRV_UAV,
36 };
37
45 // This class is fully managed by the heap.
46 friend class DirectXDescriptorHeap;
47
48 public:
50
51 /* Notifies the heap. */
53
56
57 // Intentionally disable `move` because heap will store a raw pointer to the range
58 // and we don't want to accidentally `move` the range which will make the heap's raw pointer invalid.
61 operator=(ContinuousDirectXDescriptorRange&& other) noexcept = delete;
62
68 static constexpr INT getRangeGrowSize() { return iRangeGrowSize; }
69
75 size_t getRangeSize();
76
82 size_t getRangeCapacity();
83
90
99 D3D12_GPU_DESCRIPTOR_HANDLE getGpuDescriptorHandleToRangeStart() const;
100
101 private:
112 std::unordered_set<DirectXDescriptor*> allocatedDescriptors;
113
116
124
127
137 };
138
150 const std::function<void()>& onRangeIndicesChanged,
151 const std::string& sRangeName);
152
163 [[nodiscard]] std::optional<Error> markDescriptorAsUnused(DirectXDescriptor* pDescriptor);
164
175 std::variant<std::optional<INT>, Error> tryReserveFreeHeapIndexToCreateDescriptor();
176
178 std::pair<std::recursive_mutex, InternalData> mtxInternalData;
179
181 const std::function<void()> onRangeIndicesChanged;
182
184 const std::string sRangeName;
185
187 DirectXDescriptorHeap* const pHeap = nullptr;
188
194 static constexpr INT iRangeGrowSize = 50; // NOLINT: see static asserts
195 };
196
199 // Notifies the heap about descriptor being destroyed.
200 friend class DirectXDescriptor;
201
202 // Notifies the heap about range being destroyed.
204
205 // Only resource can request descriptors.
206 friend class DirectXResource;
207
208 public:
212 ComPtr<ID3D12DescriptorHeap> pHeap;
213
215 std::unordered_set<ContinuousDirectXDescriptorRange*> continuousDescriptorRanges;
216
219
225 INT iHeapSize = 0;
226
236
244
254 std::unordered_set<DirectXDescriptor*> bindedSingleDescriptors;
255 };
256
257 DirectXDescriptorHeap() = delete;
259 DirectXDescriptorHeap& operator=(const DirectXDescriptorHeap&) = delete;
260
263
269 static constexpr INT getHeapGrowSize() { return iHeapGrowSize; }
270
279 static std::variant<std::unique_ptr<DirectXDescriptorHeap>, Error>
280 create(DirectXRenderer* pRenderer, DescriptorHeapType heapType);
281
292 std::variant<std::unique_ptr<ContinuousDirectXDescriptorRange>, Error>
294 const std::string& sRangeName, const std::function<void()>& onRangeIndicesChanged);
295
304 INT getHeapCapacity();
305
314 INT getHeapSize();
315
322
328 inline UINT getDescriptorSize() const { return iDescriptorSize; }
329
335 inline ID3D12DescriptorHeap* getInternalHeap() const { return mtxInternalData.second.pHeap.Get(); }
336
344 std::pair<std::recursive_mutex, InternalData>* getInternalData() { return &mtxInternalData; }
345
346 protected:
354 static std::string convertHeapTypeToString(DescriptorHeapType heapType);
355
363
375 DirectXDescriptor* pDescriptor, ContinuousDirectXDescriptorRange* pRange = nullptr);
376
385
396 void createView(
397 CD3DX12_CPU_DESCRIPTOR_HANDLE heapHandle,
398 const DirectXResource* pResource,
399 DirectXDescriptorType descriptorType,
400 std::optional<size_t> cubemapFaceIndex) const;
401
412 [[nodiscard]] std::optional<Error> expandHeap(ContinuousDirectXDescriptorRange* pChangedRange);
413
427 [[nodiscard]] std::variant<bool, Error>
429
442 [[nodiscard]] std::optional<Error>
443 createHeap(INT iCapacity, ContinuousDirectXDescriptorRange* pChangedRange);
444
452 std::vector<DirectXDescriptorType> getDescriptorTypesHandledByThisHeap() const;
453
462 [[nodiscard]] std::optional<Error> rebindViewsUpdateIndices();
463
464 private:
482 [[nodiscard]] std::optional<Error> assignDescriptor(
483 DirectXResource* pResource,
484 DirectXDescriptorType descriptorType,
485 ContinuousDirectXDescriptorRange* pRange = nullptr,
486 bool bBindDescriptorsToCubemapFaces = true);
487
497 static bool isShrinkingPossible(INT iSize, INT iCapacity, INT iGrowSize);
498
506 [[nodiscard]] std::optional<Error> expandRange(ContinuousDirectXDescriptorRange* pRange);
507
510
512 std::pair<std::recursive_mutex, InternalData> mtxInternalData;
513
516
518 DescriptorHeapType heapType;
519
521 std::string sHeapType;
522
524 D3D12_DESCRIPTOR_HEAP_TYPE d3dHeapType;
525
527 static constexpr INT iHeapGrowSize = 300; // NOLINT: don't recreate heap too often
528 };
529} // namespace ne
Definition: DirectXDescriptorHeap.h:44
size_t getRangeSize()
Definition: DirectXDescriptorHeap.cpp:1047
const std::string sRangeName
Definition: DirectXDescriptorHeap.h:184
std::variant< std::optional< INT >, Error > tryReserveFreeHeapIndexToCreateDescriptor()
Definition: DirectXDescriptorHeap.cpp:1109
INT getRangeStartInHeap()
Definition: DirectXDescriptorHeap.cpp:1057
size_t getRangeCapacity()
Definition: DirectXDescriptorHeap.cpp:1052
D3D12_GPU_DESCRIPTOR_HANDLE getGpuDescriptorHandleToRangeStart() const
Definition: DirectXDescriptorHeap.cpp:1062
const std::function< void()> onRangeIndicesChanged
Definition: DirectXDescriptorHeap.h:181
DirectXDescriptorHeap *const pHeap
Definition: DirectXDescriptorHeap.h:187
std::optional< Error > markDescriptorAsUnused(DirectXDescriptor *pDescriptor)
Definition: DirectXDescriptorHeap.cpp:1087
static constexpr INT iRangeGrowSize
Definition: DirectXDescriptorHeap.h:194
static constexpr INT getRangeGrowSize()
Definition: DirectXDescriptorHeap.h:68
std::pair< std::recursive_mutex, InternalData > mtxInternalData
Definition: DirectXDescriptorHeap.h:178
Definition: DirectXDescriptorHeap.h:198
INT getHeapSize()
Definition: DirectXDescriptorHeap.cpp:217
static std::string convertHeapTypeToString(DescriptorHeapType heapType)
Definition: DirectXDescriptorHeap.cpp:227
void onDescriptorRangeBeingDestroyed(ContinuousDirectXDescriptorRange *pRange)
Definition: DirectXDescriptorHeap.cpp:427
static std::variant< std::unique_ptr< DirectXDescriptorHeap >, Error > create(DirectXRenderer *pRenderer, DescriptorHeapType heapType)
Definition: DirectXDescriptorHeap.cpp:11
DirectXRenderer * pRenderer
Definition: DirectXDescriptorHeap.h:509
static constexpr INT getHeapGrowSize()
Definition: DirectXDescriptorHeap.h:269
void onDescriptorBeingDestroyed(DirectXDescriptor *pDescriptor, ContinuousDirectXDescriptorRange *pRange=nullptr)
Definition: DirectXDescriptorHeap.cpp:320
D3D12_DESCRIPTOR_HEAP_TYPE d3dHeapType
Definition: DirectXDescriptorHeap.h:524
std::string sHeapType
Definition: DirectXDescriptorHeap.h:521
std::optional< Error > expandRange(ContinuousDirectXDescriptorRange *pRange)
Definition: DirectXDescriptorHeap.cpp:542
std::variant< bool, Error > shrinkHeapIfPossible(ContinuousDirectXDescriptorRange *pChangedRange)
Definition: DirectXDescriptorHeap.cpp:574
~DirectXDescriptorHeap()
Definition: DirectXDescriptorHeap.cpp:286
std::vector< DirectXDescriptorType > getDescriptorTypesHandledByThisHeap() const
Definition: DirectXDescriptorHeap.cpp:912
UINT getDescriptorSize() const
Definition: DirectXDescriptorHeap.h:328
std::optional< Error > assignDescriptor(DirectXResource *pResource, DirectXDescriptorType descriptorType, ContinuousDirectXDescriptorRange *pRange=nullptr, bool bBindDescriptorsToCubemapFaces=true)
Definition: DirectXDescriptorHeap.cpp:47
static bool isShrinkingPossible(INT iSize, INT iCapacity, INT iGrowSize)
Definition: DirectXDescriptorHeap.cpp:520
std::pair< std::recursive_mutex, InternalData > mtxInternalData
Definition: DirectXDescriptorHeap.h:512
DescriptorHeapType heapType
Definition: DirectXDescriptorHeap.h:518
std::pair< std::recursive_mutex, InternalData > * getInternalData()
Definition: DirectXDescriptorHeap.h:344
std::variant< std::unique_ptr< ContinuousDirectXDescriptorRange >, Error > allocateContinuousDescriptorRange(const std::string &sRangeName, const std::function< void()> &onRangeIndicesChanged)
Definition: DirectXDescriptorHeap.cpp:25
std::optional< Error > expandHeap(ContinuousDirectXDescriptorRange *pChangedRange)
Definition: DirectXDescriptorHeap.cpp:472
size_t getNoLongerUsedDescriptorCount()
Definition: DirectXDescriptorHeap.cpp:222
std::optional< Error > rebindViewsUpdateIndices()
Definition: DirectXDescriptorHeap.cpp:927
UINT iDescriptorSize
Definition: DirectXDescriptorHeap.h:515
ID3D12DescriptorHeap * getInternalHeap() const
Definition: DirectXDescriptorHeap.h:335
void createView(CD3DX12_CPU_DESCRIPTOR_HANDLE heapHandle, const DirectXResource *pResource, DirectXDescriptorType descriptorType, std::optional< size_t > cubemapFaceIndex) const
Definition: DirectXDescriptorHeap.cpp:596
INT getHeapCapacity()
Definition: DirectXDescriptorHeap.cpp:212
static constexpr INT iHeapGrowSize
Definition: DirectXDescriptorHeap.h:527
std::optional< Error > createHeap(INT iCapacity, ContinuousDirectXDescriptorRange *pChangedRange)
Definition: DirectXDescriptorHeap.cpp:859
Definition: DirectXDescriptor.h:18
Definition: DirectXRenderer.h:36
Definition: DirectXResource.h:32
Definition: Error.h:27
Definition: DirectXDescriptorHeap.h:103
std::unordered_set< DirectXDescriptor * > allocatedDescriptors
Definition: DirectXDescriptorHeap.h:112
INT iRangeStartInHeap
Definition: DirectXDescriptorHeap.h:123
INT iRangeCapacity
Definition: DirectXDescriptorHeap.h:126
std::queue< INT > noLongerUsedDescriptorIndices
Definition: DirectXDescriptorHeap.h:115
INT iNextFreeIndexInRange
Definition: DirectXDescriptorHeap.h:136
Definition: DirectXDescriptorHeap.h:210
std::queue< INT > noLongerUsedSingleDescriptorIndices
Definition: DirectXDescriptorHeap.h:243
std::unordered_set< ContinuousDirectXDescriptorRange * > continuousDescriptorRanges
Definition: DirectXDescriptorHeap.h:215
std::unordered_set< DirectXDescriptor * > bindedSingleDescriptors
Definition: DirectXDescriptorHeap.h:254
INT iNextFreeHeapIndex
Definition: DirectXDescriptorHeap.h:235
INT iHeapCapacity
Definition: DirectXDescriptorHeap.h:218
INT iHeapSize
Definition: DirectXDescriptorHeap.h:225
ComPtr< ID3D12DescriptorHeap > pHeap
Definition: DirectXDescriptorHeap.h:212