UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
D3D12ExplicitDescriptorCache.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "D3D12RHICommon.h"
7
18
19// #dxr_todo UE-72158: FD3D12Device::GlobalViewHeap/GlobalSamplerHeap should be used instead of ad-hoc heaps here.
20// Unfortunately, this requires a major refactor of how global heaps work.
21// FD3D12CommandContext-s should not get static chunks of the global heap, but instead should dynamically allocate
22// chunks on as-needed basis and release them when possible.
23// This would allow calling code to sub-allocate heap blocks from the same global heap.
25{
26public:
27
29
31 {
33 uint32 NumDescriptors = 0;
35
36 // Information for stale entry release, updated upon adding the entry to the free list
37 uint64 LastUsedFrame = 0;
38 double LastUsedTime = 0.0;
39 };
40
45
47
48 FEntry AllocateHeap(D3D12_DESCRIPTOR_HEAP_TYPE Type, uint32 NumDescriptors);
49 void DeferredReleaseHeap(FEntry&& Entry);
50
51 void FlushFreeList();
52
53private:
54
55 void ReleaseHeap(FEntry&& Entry);
56
57 // Assumes CriticalSection is already locked
58 void ReleaseStaleEntries(uint32 MaxAgeInFrames, float MaxAgeInSeconds);
59
60 FCriticalSection CriticalSection;
61 TArray<FEntry> FreeList;
62 uint32 NumAllocatedEntries = 0;
63};
64
66{
68
71
73
74 // Returns descriptor heap base index or -1 if allocation is not possible.
75 // Thread-safe (uses atomic linear allocation).
77
78 void CopyDescriptors(int32 BaseIndex, const D3D12_CPU_DESCRIPTOR_HANDLE* InDescriptors, uint32 InNumDescriptors);
79
80 bool CompareDescriptors(int32 BaseIndex, const D3D12_CPU_DESCRIPTOR_HANDLE* InDescriptors, uint32 InNumDescriptors);
81
82 D3D12_CPU_DESCRIPTOR_HANDLE GetDescriptorCPU(uint32 Index) const;
84
85 // Cache D3D device pointer, as it's frequently accessed on the hot path in CopyDescriptors
87
91
93
94 // Marks the valid range of the heap when exhaustive sampler deduplication is enabled. Not used otherwise.
96
98 D3D12_CPU_DESCRIPTOR_HANDLE CPUBase = {};
100
102
104
106};
107
109{
110public:
111
113
115 : FD3D12DeviceChild(Device)
116 , ViewHeap(Device)
117 , SamplerHeap(Device)
118 {
119 check(MaxWorkerCount > 0u);
120 WorkerData.SetNum(MaxWorkerCount);
121 }
122
124
125 // Returns descriptor heap base index for this descriptor table allocation or -1 if allocation failed.
126 int32 Allocate(const D3D12_CPU_DESCRIPTOR_HANDLE* Descriptors, uint32 NumDescriptors, D3D12_DESCRIPTOR_HEAP_TYPE Type, uint32 WorkerIndex);
127
128 // Returns descriptor heap base index for this descriptor table allocation (checking for duplicates and reusing existing tables) or -1 if allocation failed.
129 int32 AllocateDeduplicated(const uint32* DescriptorVersions, const D3D12_CPU_DESCRIPTOR_HANDLE* Descriptors, uint32 NumDescriptors, D3D12_DESCRIPTOR_HEAP_TYPE Type, uint32 WorkerIndex);
130
133
134#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
136 bool bBindless = false;
137#endif
138
139 template<typename KeyType>
141 {
142 static FORCEINLINE bool Matches(KeyType A, KeyType B)
143 {
144 return A == B;
145 }
146 static FORCEINLINE uint32 GetKeyHash(KeyType Key)
147 {
148 return (uint32)Key;
149 }
150 };
151
153
155 {
158 : Begin(BaseIndex)
159 , Cursor(BaseIndex)
160 , End(BaseIndex + Count)
161 {
162 }
163
167
169 {
170 int32 Result = INDEX_NONE;
171 if (Cursor + Count <= End)
172 {
173 Result = Cursor;
174 Cursor += Count;
175 }
176 return Result;
177 }
178 };
179
181 {
182 const int32 BaseIndex = ViewHeap.Allocate(Count);
183 if (BaseIndex != INDEX_NONE)
184 {
185 WorkerData[WorkerIndex].ReservedViewDescriptors = FDescriptorSlotRange(BaseIndex, Count);
186 }
187 }
188
196
198};
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
void Init()
Definition LockFreeList.h:4
ERHIBindlessConfiguration
Definition RHIDefinitions.h:1432
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition D3D12CommandContext.h:513
Definition D3D12DescriptorCache.h:312
Definition D3D12RHICommon.h:78
Definition D3D12Device.h:176
Definition D3D12RHIPrivate.h:160
Definition D3D12ExplicitDescriptorCache.h:109
FD3D12ExplicitDescriptorHeap ViewHeap
Definition D3D12ExplicitDescriptorCache.h:131
TArray< FWorkerThreadData > WorkerData
Definition D3D12ExplicitDescriptorCache.h:197
void ReserveViewDescriptors(uint32 Count, uint32 WorkerIndex)
Definition D3D12ExplicitDescriptorCache.h:180
int32 Allocate(const D3D12_CPU_DESCRIPTOR_HANDLE *Descriptors, uint32 NumDescriptors, D3D12_DESCRIPTOR_HEAP_TYPE Type, uint32 WorkerIndex)
Definition D3D12ExplicitDescriptorCache.cpp:396
FD3D12ExplicitDescriptorHeap SamplerHeap
Definition D3D12ExplicitDescriptorCache.h:132
int32 AllocateDeduplicated(const uint32 *DescriptorVersions, const D3D12_CPU_DESCRIPTOR_HANDLE *Descriptors, uint32 NumDescriptors, D3D12_DESCRIPTOR_HEAP_TYPE Type, uint32 WorkerIndex)
Definition D3D12ExplicitDescriptorCache.cpp:340
Definition D3D12ExplicitDescriptorCache.h:25
void FlushFreeList()
Definition D3D12ExplicitDescriptorCache.cpp:187
void DeferredReleaseHeap(FEntry &&Entry)
Definition D3D12ExplicitDescriptorCache.cpp:65
~FD3D12ExplicitDescriptorHeapCache()
Definition D3D12ExplicitDescriptorCache.cpp:42
FD3D12ExplicitDescriptorHeapCache(FD3D12Device *Device)
Definition D3D12ExplicitDescriptorCache.h:41
FEntry AllocateHeap(D3D12_DESCRIPTOR_HEAP_TYPE Type, uint32 NumDescriptors)
Definition D3D12ExplicitDescriptorCache.cpp:88
Definition Array.h:670
U16 Index
Definition radfft.cpp:71
Definition D3D12StateCachePrivate.h:172
Definition D3D12View.h:54
Definition D3D12ExplicitDescriptorCache.h:155
int32 Cursor
Definition D3D12ExplicitDescriptorCache.h:165
int32 Allocate(int32 Count)
Definition D3D12ExplicitDescriptorCache.h:168
int32 Begin
Definition D3D12ExplicitDescriptorCache.h:164
int32 End
Definition D3D12ExplicitDescriptorCache.h:166
FDescriptorSlotRange(int32 BaseIndex, int32 Count)
Definition D3D12ExplicitDescriptorCache.h:157
Definition D3D12ExplicitDescriptorCache.h:190
TDescriptorHashMap ViewDescriptorTableCache
Definition D3D12ExplicitDescriptorCache.h:191
TDescriptorHashMap SamplerDescriptorTableCache
Definition D3D12ExplicitDescriptorCache.h:192
FDescriptorSlotRange ReservedViewDescriptors
Definition D3D12ExplicitDescriptorCache.h:194
Definition D3D12ExplicitDescriptorCache.h:141
static FORCEINLINE uint32 GetKeyHash(KeyType Key)
Definition D3D12ExplicitDescriptorCache.h:146
static FORCEINLINE bool Matches(KeyType A, KeyType B)
Definition D3D12ExplicitDescriptorCache.h:142
Definition D3D12ExplicitDescriptorCache.h:31
Definition D3D12ExplicitDescriptorCache.h:66
uint32 DescriptorSize
Definition D3D12ExplicitDescriptorCache.h:97
D3D12_CPU_DESCRIPTOR_HANDLE CPUBase
Definition D3D12ExplicitDescriptorCache.h:98
TArray< D3D12_CPU_DESCRIPTOR_HANDLE > Descriptors
Definition D3D12ExplicitDescriptorCache.h:103
D3D12_DESCRIPTOR_HEAP_TYPE Type
Definition D3D12ExplicitDescriptorCache.h:88
ID3D12DescriptorHeap * D3D12Heap
Definition D3D12ExplicitDescriptorCache.h:89
D3D12_CPU_DESCRIPTOR_HANDLE GetDescriptorCPU(uint32 Index) const
Definition D3D12ExplicitDescriptorCache.cpp:300
~FD3D12ExplicitDescriptorHeap()
Definition D3D12ExplicitDescriptorCache.cpp:200
bool CompareDescriptors(int32 BaseIndex, const D3D12_CPU_DESCRIPTOR_HANDLE *InDescriptors, uint32 InNumDescriptors)
Definition D3D12ExplicitDescriptorCache.cpp:288
int32 NumWrittenSamplerDescriptors
Definition D3D12ExplicitDescriptorCache.h:95
int32 Allocate(uint32 InNumDescriptors)
Definition D3D12ExplicitDescriptorCache.cpp:246
FD3D12ExplicitDescriptorHeapCache::FEntry HeapCacheEntry
Definition D3D12ExplicitDescriptorCache.h:101
D3D12_GPU_DESCRIPTOR_HANDLE GPUBase
Definition D3D12ExplicitDescriptorCache.h:99
ID3D12Device * D3DDevice
Definition D3D12ExplicitDescriptorCache.h:86
uint32 MaxNumDescriptors
Definition D3D12ExplicitDescriptorCache.h:90
int32 NumAllocatedDescriptors
Definition D3D12ExplicitDescriptorCache.h:92
void CopyDescriptors(int32 BaseIndex, const D3D12_CPU_DESCRIPTOR_HANDLE *InDescriptors, uint32 InNumDescriptors)
Definition D3D12ExplicitDescriptorCache.cpp:275
bool bExhaustiveSamplerDeduplication
Definition D3D12ExplicitDescriptorCache.h:105
D3D12_GPU_DESCRIPTOR_HANDLE GetDescriptorGPU(uint32 Index) const
Definition D3D12ExplicitDescriptorCache.cpp:307
Definition D3D12StateCachePrivate.h:101
Definition D3D12StateCachePrivate.h:257
Definition D3D12StateCachePrivate.h:197
Definition D3D12StateCachePrivate.h:232
Definition D3D12StateCachePrivate.h:78