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/resource/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
80 std::variant<unsigned int, Error> getResourceDescriptorOffsetFromRangeStart(
81 DirectXResource* pResource, DirectXDescriptorType descriptorType);
82
88 size_t getRangeSize();
89
95 size_t getRangeCapacity();
96
103
112 D3D12_GPU_DESCRIPTOR_HANDLE getGpuDescriptorHandleToRangeStart() const;
113
114 private:
125 std::unordered_set<DirectXDescriptor*> allocatedDescriptors;
126
129
137
140
150 };
151
163 const std::function<void()>& onRangeIndicesChanged,
164 const std::string& sRangeName);
165
176 [[nodiscard]] std::optional<Error> markDescriptorAsUnused(DirectXDescriptor* pDescriptor);
177
188 std::variant<std::optional<INT>, Error> tryReserveFreeHeapIndexToCreateDescriptor();
189
191 std::pair<std::recursive_mutex, InternalData> mtxInternalData;
192
194 const std::function<void()> onRangeIndicesChanged;
195
197 const std::string sRangeName;
198
200 DirectXDescriptorHeap* const pHeap = nullptr;
201
207 static constexpr INT iRangeGrowSize = 50; // NOLINT: see static asserts
208 };
209
212 // Notifies the heap about descriptor being destroyed.
213 friend class DirectXDescriptor;
214
215 // Notifies the heap about range being destroyed.
217
218 // Only resource can request descriptors.
219 friend class DirectXResource;
220
221 public:
225 ComPtr<ID3D12DescriptorHeap> pHeap;
226
228 std::unordered_set<ContinuousDirectXDescriptorRange*> continuousDescriptorRanges;
229
232
238 INT iHeapSize = 0;
239
249
257
267 std::unordered_set<DirectXDescriptor*> bindedSingleDescriptors;
268 };
269
270 DirectXDescriptorHeap() = delete;
272 DirectXDescriptorHeap& operator=(const DirectXDescriptorHeap&) = delete;
273
276
282 static constexpr INT getHeapGrowSize() { return iHeapGrowSize; }
283
292 static std::variant<std::unique_ptr<DirectXDescriptorHeap>, Error>
293 create(DirectXRenderer* pRenderer, DescriptorHeapType heapType);
294
305 std::variant<std::unique_ptr<ContinuousDirectXDescriptorRange>, Error>
307 const std::string& sRangeName, const std::function<void()>& onRangeIndicesChanged);
308
317 INT getHeapCapacity();
318
327 INT getHeapSize();
328
335
341 inline UINT getDescriptorSize() const { return iDescriptorSize; }
342
348 inline ID3D12DescriptorHeap* getInternalHeap() const { return mtxInternalData.second.pHeap.Get(); }
349
357 std::pair<std::recursive_mutex, InternalData>* getInternalData() { return &mtxInternalData; }
358
359 protected:
367 static std::string convertHeapTypeToString(DescriptorHeapType heapType);
368
376
388 DirectXDescriptor* pDescriptor, ContinuousDirectXDescriptorRange* pRange = nullptr);
389
398
409 void createView(
410 CD3DX12_CPU_DESCRIPTOR_HANDLE heapHandle,
411 const DirectXResource* pResource,
412 DirectXDescriptorType descriptorType,
413 std::optional<size_t> cubemapFaceIndex) const;
414
425 [[nodiscard]] std::optional<Error> expandHeap(ContinuousDirectXDescriptorRange* pChangedRange);
426
440 [[nodiscard]] std::variant<bool, Error>
442
455 [[nodiscard]] std::optional<Error>
456 createHeap(INT iCapacity, ContinuousDirectXDescriptorRange* pChangedRange);
457
465 std::vector<DirectXDescriptorType> getDescriptorTypesHandledByThisHeap() const;
466
475 [[nodiscard]] std::optional<Error> rebindViewsUpdateIndices();
476
477 private:
495 [[nodiscard]] std::optional<Error> assignDescriptor(
496 DirectXResource* pResource,
497 DirectXDescriptorType descriptorType,
498 ContinuousDirectXDescriptorRange* pRange = nullptr,
499 bool bBindDescriptorsToCubemapFaces = true);
500
510 static bool isShrinkingPossible(INT iSize, INT iCapacity, INT iGrowSize);
511
519 [[nodiscard]] std::optional<Error> expandRange(ContinuousDirectXDescriptorRange* pRange);
520
523
525 std::pair<std::recursive_mutex, InternalData> mtxInternalData;
526
529
531 DescriptorHeapType heapType;
532
534 std::string sHeapType;
535
537 D3D12_DESCRIPTOR_HEAP_TYPE d3dHeapType;
538
540 static constexpr INT iHeapGrowSize = 300; // NOLINT: don't recreate heap too often
541 };
542} // namespace ne
Definition: DirectXDescriptorHeap.h:44
size_t getRangeSize()
Definition: DirectXDescriptorHeap.cpp:1090
const std::string sRangeName
Definition: DirectXDescriptorHeap.h:197
std::variant< std::optional< INT >, Error > tryReserveFreeHeapIndexToCreateDescriptor()
Definition: DirectXDescriptorHeap.cpp:1152
INT getRangeStartInHeap()
Definition: DirectXDescriptorHeap.cpp:1100
size_t getRangeCapacity()
Definition: DirectXDescriptorHeap.cpp:1095
D3D12_GPU_DESCRIPTOR_HANDLE getGpuDescriptorHandleToRangeStart() const
Definition: DirectXDescriptorHeap.cpp:1105
const std::function< void()> onRangeIndicesChanged
Definition: DirectXDescriptorHeap.h:194
DirectXDescriptorHeap *const pHeap
Definition: DirectXDescriptorHeap.h:200
std::optional< Error > markDescriptorAsUnused(DirectXDescriptor *pDescriptor)
Definition: DirectXDescriptorHeap.cpp:1130
static constexpr INT iRangeGrowSize
Definition: DirectXDescriptorHeap.h:207
std::variant< unsigned int, Error > getResourceDescriptorOffsetFromRangeStart(DirectXResource *pResource, DirectXDescriptorType descriptorType)
Definition: DirectXDescriptorHeap.cpp:1048
static constexpr INT getRangeGrowSize()
Definition: DirectXDescriptorHeap.h:68
std::pair< std::recursive_mutex, InternalData > mtxInternalData
Definition: DirectXDescriptorHeap.h:191
Definition: DirectXDescriptorHeap.h:211
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:522
static constexpr INT getHeapGrowSize()
Definition: DirectXDescriptorHeap.h:282
void onDescriptorBeingDestroyed(DirectXDescriptor *pDescriptor, ContinuousDirectXDescriptorRange *pRange=nullptr)
Definition: DirectXDescriptorHeap.cpp:320
D3D12_DESCRIPTOR_HEAP_TYPE d3dHeapType
Definition: DirectXDescriptorHeap.h:537
std::string sHeapType
Definition: DirectXDescriptorHeap.h:534
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:341
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:525
DescriptorHeapType heapType
Definition: DirectXDescriptorHeap.h:531
std::pair< std::recursive_mutex, InternalData > * getInternalData()
Definition: DirectXDescriptorHeap.h:357
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:528
ID3D12DescriptorHeap * getInternalHeap() const
Definition: DirectXDescriptorHeap.h:348
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:540
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:116
std::unordered_set< DirectXDescriptor * > allocatedDescriptors
Definition: DirectXDescriptorHeap.h:125
INT iRangeStartInHeap
Definition: DirectXDescriptorHeap.h:136
INT iRangeCapacity
Definition: DirectXDescriptorHeap.h:139
std::queue< INT > noLongerUsedDescriptorIndices
Definition: DirectXDescriptorHeap.h:128
INT iNextFreeIndexInRange
Definition: DirectXDescriptorHeap.h:149
Definition: DirectXDescriptorHeap.h:223
std::queue< INT > noLongerUsedSingleDescriptorIndices
Definition: DirectXDescriptorHeap.h:256
std::unordered_set< ContinuousDirectXDescriptorRange * > continuousDescriptorRanges
Definition: DirectXDescriptorHeap.h:228
std::unordered_set< DirectXDescriptor * > bindedSingleDescriptors
Definition: DirectXDescriptorHeap.h:267
INT iNextFreeHeapIndex
Definition: DirectXDescriptorHeap.h:248
INT iHeapCapacity
Definition: DirectXDescriptorHeap.h:231
INT iHeapSize
Definition: DirectXDescriptorHeap.h:238
ComPtr< ID3D12DescriptorHeap > pHeap
Definition: DirectXDescriptorHeap.h:225