UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
D3D12Descriptors.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "Containers/List.h"
7#include "Containers/Queue.h"
8#include "D3D12RHI.h"
9#include "D3D12RHICommon.h"
10#include "MultiGPU.h"
11#include "RHIPipeline.h"
13
14class FD3D12View;
15
18
30
47
62
64{
65 None = 0,
66 GpuVisible = 1 << 0,
67 Poolable = 1 << 1,
68};
70
80
93
95{
96public:
98
99 // Heap created with its own D3D heap object.
101
102 // Heap created as a suballocation of another heap.
104
106
107 ID3D12DescriptorHeap* GetHeap() const { return Heap; }
108 ERHIDescriptorHeapType GetType() const { return Type; }
109 ED3D12DescriptorHeapFlags GetFlags() const { return Flags; }
110
115
116 uint32 GetOffset() const { return Offset; }
117 uint32 GetNumDescriptors() const { return NumDescriptors; }
118 uint32 GetDescriptorSize() const { return DescriptorSize; }
119 bool IsGlobal() const { return bIsGlobal; }
120 bool IsSuballocation() const { return bIsSuballocation; }
121
122 uint32 GetMemorySize() const { return DescriptorSize * NumDescriptors; }
123
124 D3D12_CPU_DESCRIPTOR_HANDLE GetCPUSlotHandle(uint32 Slot) const { return CD3DX12_CPU_DESCRIPTOR_HANDLE(CpuBase, Slot, DescriptorSize); }
125 D3D12_GPU_DESCRIPTOR_HANDLE GetGPUSlotHandle(uint32 Slot) const { return CD3DX12_GPU_DESCRIPTOR_HANDLE(GpuBase, Slot, DescriptorSize); }
126
128
129private:
131
132 const CD3DX12_CPU_DESCRIPTOR_HANDLE CpuBase;
133 const CD3DX12_GPU_DESCRIPTOR_HANDLE GpuBase;
134
135 // Offset in descriptors into the heap, only used when heap is suballocated.
136 const uint32 Offset = 0;
137
138 // Total number of descriptors in this heap.
139 const uint32 NumDescriptors;
140
141 // Device provided size of each descriptor in this heap.
142 const uint32 DescriptorSize;
143
144 const ERHIDescriptorHeapType Type;
145 const ED3D12DescriptorHeapFlags Flags;
146
147 // Enabled if this heap is the "global" heap.
148 const bool bIsGlobal;
149
150 // Enabled if this heap was allocated inside another heap.
151 const bool bIsSuballocation;
152};
154
185
200
203{
204public:
207
208 // Setup the actual heap
210 void CleanupResources();
211
212 // Allocate an available sub heap block from the global heap
215
218
219 D3D12_CPU_DESCRIPTOR_HANDLE GetCPUSlotHandle(ERHIPipeline Pipeline, FD3D12OnlineDescriptorBlock* InBlock) const { return Heaps[Pipeline]->GetCPUSlotHandle(InBlock->BaseSlot); }
221
222 // Called by the EOP task to recycle blocks
224
225private:
227
229
230 FCriticalSection CriticalSection;
231};
232
234{
235 size_t Start;
236 size_t End;
237};
238
250
251struct FD3D12OfflineDescriptor : public D3D12_CPU_DESCRIPTOR_HANDLE
252{
253public:
254 operator bool () const { return ptr != 0; }
256
257 // Descriptor version can be used to invalidate any caches that are based on D3D12_CPU_DESCRIPTOR_HANDLE,
258 // for example to detect when a view has been updated following a resource rename.
259 void IncrementVersion() { ++Version; }
260 uint32 GetVersion() const { return Version; }
261
262private:
264 uint32 HeapIndex = 0;
265 uint32 Version = 0;
266};
267
270{
271public:
275
276 inline ERHIDescriptorHeapType GetHeapType() const { return HeapType; }
277
279 void FreeHeapSlot(FD3D12OfflineDescriptor& Descriptor);
280
281 void CleanupResources();
282
283private:
284 void AllocateHeap();
285
288
289 ERHIDescriptorHeapType HeapType;
290 uint32 NumDescriptorsPerHeap{};
291 uint32 DescriptorSize{};
292
293 FCriticalSection CriticalSection;
294};
295
299{
300public:
303
305 void Destroy();
306
311
313
314private:
316
317 TArray<FD3D12DescriptorManager, TFixedAllocator<2>> GlobalHeaps; // Use TFixedAllocator to prevent move of CRITICAL_SECTION
318
319 struct FPooledHeap
320 {
323 , NumDescriptors(InNumDescriptors)
324 , Type(InType)
325 , Flags(InFlags)
326 {
327 }
328
330 uint32 NumDescriptors;
333 };
334 TArray<FPooledHeap> PooledHeaps;
335 FCriticalSection PooledHeapsCS;
336};
#define checkNoEntry()
Definition AssertionMacros.h:316
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
ERHIDescriptorTypeMask D3D12DescriptorTypeMaskFromHeapType(ERHIDescriptorHeapType InHeapType)
Definition D3D12Descriptors.h:48
ED3D12DescriptorHeapFlags
Definition D3D12Descriptors.h:64
D3D12_DESCRIPTOR_HEAP_TYPE Translate(ERHIDescriptorHeapType InHeapType)
Definition D3D12Descriptors.h:19
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
void Init()
Definition LockFreeList.h:4
const bool
Definition NetworkReplayStreaming.h:178
ERHIDescriptorTypeMask
Definition RHIDefinitions.h:1367
ERHIDescriptorType
Definition RHIDefinitions.h:1348
ERHIDescriptorHeapType
Definition RHIDefinitions.h:1338
constexpr ERHIDescriptorTypeMask RHIDescriptorTypeMaskFromType(ERHIDescriptorType InType)
Definition RHIDefinitions.h:1391
ERHIPipeline
Definition RHIPipeline.h:13
#define FD3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER
Definition WindowsD3D12RHIDefinitions.h:14
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition D3D12Descriptors.h:299
void Destroy()
Definition D3D12Descriptors.cpp:525
FD3D12DescriptorHeap * AllocateHeap(const TCHAR *InDebugName, ERHIDescriptorHeapType InHeapType, uint32 InNumDescriptors, ED3D12DescriptorHeapFlags InHeapFlags)
Definition D3D12Descriptors.cpp:564
void AddHeapToPool(TRefCountPtr< ID3D12DescriptorHeap > &&InHeap, ERHIDescriptorHeapType InType, uint32 InNumDescriptors, ED3D12DescriptorHeapFlags InFlags)
Definition D3D12Descriptors.cpp:624
FD3D12DescriptorHeap * AllocateIndependentHeap(const TCHAR *InDebugName, ERHIDescriptorHeapType InHeapType, uint32 InNumDescriptors, ED3D12DescriptorHeapFlags InHeapFlags)
Definition D3D12Descriptors.cpp:550
void ImmediateFreeHeap(FD3D12DescriptorHeap *InHeap)
Definition D3D12Descriptors.cpp:604
~FD3D12DescriptorHeapManager()
Definition D3D12Descriptors.cpp:469
void DeferredFreeHeap(FD3D12DescriptorHeap *InHeap)
Definition D3D12Descriptors.cpp:583
Definition D3D12Descriptors.h:157
bool HandlesAllocationWithFlags(ERHIDescriptorType InDescriptorType, ED3D12DescriptorHeapFlags InHeapFlags) const
Definition D3D12Descriptors.h:171
FD3D12DescriptorHeap * GetHeap()
Definition D3D12Descriptors.h:163
bool IsHeapAChild(const FD3D12DescriptorHeap *InHeap)
Definition D3D12Descriptors.h:177
const FD3D12DescriptorHeap * GetHeap() const
Definition D3D12Descriptors.h:164
FD3D12DescriptorManager()=delete
bool HandlesHeapAllocationsWithFlags(ERHIDescriptorHeapType InHeapType, ED3D12DescriptorHeapFlags InHeapFlags) const
Definition D3D12Descriptors.h:166
Definition D3D12RHICommon.h:78
Definition D3D12Device.h:176
Definition D3D12Descriptors.h:270
FD3D12OfflineDescriptor AllocateHeapSlot()
Definition D3D12Descriptors.cpp:372
void CleanupResources()
Definition D3D12Descriptors.cpp:453
void FreeHeapSlot(FD3D12OfflineDescriptor &Descriptor)
Definition D3D12Descriptors.cpp:406
ERHIDescriptorHeapType GetHeapType() const
Definition D3D12Descriptors.h:276
Definition D3D12Descriptors.h:203
D3D12_CPU_DESCRIPTOR_HANDLE GetCPUSlotHandle(ERHIPipeline Pipeline, FD3D12OnlineDescriptorBlock *InBlock) const
Definition D3D12Descriptors.h:219
void CleanupResources()
Definition D3D12Descriptors.cpp:268
ID3D12DescriptorHeap * GetHeap(ERHIPipeline Pipeline)
Definition D3D12Descriptors.h:216
void FreeHeapBlock(FD3D12OnlineDescriptorBlock *InHeapBlock)
Definition D3D12Descriptors.cpp:299
FD3D12OnlineDescriptorBlock * AllocateHeapBlock()
Definition D3D12Descriptors.cpp:277
D3D12_GPU_DESCRIPTOR_HANDLE GetGPUSlotHandle(ERHIPipeline Pipeline, FD3D12OnlineDescriptorBlock *InBlock) const
Definition D3D12Descriptors.h:220
FD3D12DescriptorHeap * GetDescriptorHeap(ERHIPipeline Pipeline)
Definition D3D12Descriptors.h:217
void Recycle(FD3D12OnlineDescriptorBlock *Block)
Definition D3D12Descriptors.cpp:310
Definition D3D12View.h:221
Definition RHIDescriptorAllocator.h:87
bool HandlesAllocation(ERHIDescriptorType InType) const
Definition RHIDescriptorAllocator.h:107
bool HandlesAllocations(ERHIDescriptorTypeMask InTypeMask) const
Definition RHIDescriptorAllocator.h:112
Definition RefCounting.h:283
Definition Array.h:670
Definition List.h:439
bool AddTail(const ElementType &InElement)
Definition List.h:573
Definition Queue.h:48
Definition RHIPipeline.h:55
Definition RefCounting.h:454
UE_FORCEINLINE_HINT ReferencedType * GetReference() const
Definition RefCounting.h:584
Definition D3D12Descriptors.h:82
FD3D12OfflineDescriptor CreateOfflineCopy(FD3D12Device *Device, D3D12_CPU_DESCRIPTOR_HANDLE InDescriptor, ERHIDescriptorHeapType InType)
Definition D3D12Descriptors.cpp:101
void CopyDescriptors(FD3D12Device *Device, FD3D12DescriptorHeap *TargetHeap, FD3D12DescriptorHeap *SourceHeap, uint32 FirstDescriptor, uint32 NumDescriptors)
Definition D3D12Descriptors.cpp:19
void FreeOfflineCopy(FD3D12Device *Device, FD3D12OfflineDescriptor &InDescriptor, ERHIDescriptorHeapType InType)
Definition D3D12Descriptors.cpp:118
FD3D12DescriptorHeap * CreateDescriptorHeap(FD3D12Device *Device, const TCHAR *DebugName, ERHIDescriptorHeapType HeapType, uint32 NumDescriptors, ED3D12DescriptorHeapFlags Flags, bool bGlobal=false)
void CopyDescriptor(FD3D12Device *Device, FD3D12DescriptorHeap *TargetHeap, FRHIDescriptorHandle DstHandle, D3D12_CPU_DESCRIPTOR_HANDLE SrcCpuHandle)
Definition D3D12Descriptors.cpp:8
Definition D3D12Descriptors.h:95
ID3D12DescriptorHeap * GetHeap() const
Definition D3D12Descriptors.h:107
ERHIDescriptorTypeMask GetDescriptorTypeMask() const
Definition D3D12Descriptors.h:111
uint32 GetNumDescriptors() const
Definition D3D12Descriptors.h:117
D3D12_CPU_DESCRIPTOR_HANDLE GetCPUSlotHandle(uint32 Slot) const
Definition D3D12Descriptors.h:124
FD3D12DescriptorHeap()=delete
ERHIDescriptorHeapType GetType() const
Definition D3D12Descriptors.h:108
ED3D12DescriptorHeapFlags GetFlags() const
Definition D3D12Descriptors.h:109
D3D12_GPU_DESCRIPTOR_HANDLE GetGPUSlotHandle(uint32 Slot) const
Definition D3D12Descriptors.h:125
uint32 GetDescriptorSize() const
Definition D3D12Descriptors.h:118
bool IsSuballocation() const
Definition D3D12Descriptors.h:120
uint32 GetOffset() const
Definition D3D12Descriptors.h:116
~FD3D12DescriptorHeap()
Definition D3D12Descriptors.cpp:167
uint32 GetMemorySize() const
Definition D3D12Descriptors.h:122
bool IsGlobal() const
Definition D3D12Descriptors.h:119
bool CanBePooled() const
Definition D3D12Descriptors.h:127
Definition D3D12Descriptors.h:252
uint32 GetVersion() const
Definition D3D12Descriptors.h:260
void IncrementVersion()
Definition D3D12Descriptors.h:259
FD3D12OfflineDescriptor()
Definition D3D12Descriptors.h:255
Definition D3D12Descriptors.h:240
TDoubleLinkedList< FD3D12OfflineHeapFreeRange > FreeList
Definition D3D12Descriptors.h:248
TRefCountPtr< FD3D12DescriptorHeap > Heap
Definition D3D12Descriptors.h:247
FD3D12OfflineHeapEntry(FD3D12DescriptorHeap *InHeap, const D3D12_CPU_DESCRIPTOR_HANDLE &InHeapBase, size_t InSize)
Definition D3D12Descriptors.h:241
Definition D3D12Descriptors.h:234
size_t Start
Definition D3D12Descriptors.h:235
size_t End
Definition D3D12Descriptors.h:236
Definition D3D12Descriptors.h:188
uint32 Size
Definition D3D12Descriptors.h:197
uint32 SizeUsed
Definition D3D12Descriptors.h:198
uint32 BaseSlot
Definition D3D12Descriptors.h:196
FD3D12OnlineDescriptorBlock(uint32 InBaseSlot, uint32 InSize)
Definition D3D12Descriptors.h:190
Definition RHIDefinitions.h:1401