UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
D3D12Device.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4D3D12Device.h: D3D12 Device Interfaces
5=============================================================================*/
6
7#pragma once
8
9#include "RHIBreadcrumbs.h"
10#include "RHIDiagnosticBuffer.h"
11
13#include "D3D12CommandContext.h"
14#include "D3D12Descriptors.h"
15#include "D3D12Query.h"
16#include "D3D12Queue.h"
17#include "D3D12Resources.h"
18#include "D3D12Submission.h"
19#include "D3D12GPUProfiler.h"
20
21#include "Containers/LruCache.h"
24
25class FD3D12Device;
27class FD3D12Buffer;
28class FD3D12Queue;
33
34//
35// Diagnostic buffer, backed by a virtual heap. Stays accessible after a GPU crash to allow readback of diagnostic messages.
36// Also used to track the progress of the GPU via breadcrumb markers.
37//
39{
40private:
41
44
45 D3D12_GPU_VIRTUAL_ADDRESS GpuAddress = 0;
46 D3D12_GPU_VIRTUAL_ADDRESS ToGPUAddress(void* Ptr) const
47 {
48 return GpuAddress + (uintptr_t(Ptr) - uintptr_t(Data));
49 }
50
51public:
54
55 D3D12_GPU_VIRTUAL_ADDRESS GetGPUQueueData () const { return ToGPUAddress(Data); }
56
57#if WITH_RHI_BREADCRUMBS
58 D3D12_GPU_VIRTUAL_ADDRESS GetGPUQueueMarkerIn () const { return ToGPUAddress(&Data->MarkerIn ); }
59 D3D12_GPU_VIRTUAL_ADDRESS GetGPUQueueMarkerOut() const { return ToGPUAddress(&Data->MarkerOut); }
60
61 uint32 ReadMarkerIn () const { return Data->MarkerIn; }
62 uint32 ReadMarkerOut() const { return Data->MarkerOut; }
63#endif
64
65 bool IsValid() const { return Resource.IsValid(); }
66};
67
68// Encapsulates the state required for tracking GPU queue performance across a frame.
70{
71public:
74
75#if RHI_NEW_GPU_PROFILER
76 // Timer calibration data
77 uint64 GPUFrequency = 0, GPUTimestamp = 0;
78 uint64 CPUFrequency = 0, CPUTimestamp = 0;
79
81
82#else
83
87
90
91 bool HasMoreTimestamps() const { return TimestampIndex < Timestamps.Num(); }
92 bool IsStartingWork() const { return (TimestampIndex & 0x01) == 0x00; }
93
95
96#endif
97
99};
100
101// Encapsulates a single D3D command queue, and maintains the
102// state required by the submission thread for managing the queue.
103class FD3D12Queue final
104{
105public:
106 void CleanupResources();
107
111
112 // The underlying D3D queue object
114
115 // A single D3D fence to manage completion of work on this queue
117
120
124
126
128
129 // A pool of reusable command list/allocator/context objects
130 struct
131 {
136
137 // The active timing struct on this queue. Updated / accessed by the interrupt thread.
139
141
142#if D3D12_RHI_RAYTRACING
144#endif
145
146 // On some hardware, some auxiliary queue types may not support tile mapping and a separate queue must be used
148
149 static constexpr uint32 MaxBatchedPayloads = 128;
151
152 // Batches the current payload's command lists, returning the latest fence value signaled for this queue.
154
155 // Call the underlying ID3D12Queue::ExecuteCommandLists function
159#endif
160 );
161
163 ~FD3D12Queue();
164
165#if RHI_NEW_GPU_PROFILER
167#endif
168
169private:
170 // Internal fence which may be used before calling ExecuteCommandLists
171 FD3D12Fence ExecuteCommandListsFence;
172
173};
174
176{
177public:
180
182
183#if (RHI_NEW_GPU_PROFILER == 0)
184 void RegisterGPUWork(uint32 NumPrimitives = 0, uint32 NumVertices = 0) { GPUProfilingData.RegisterGPUWork(NumPrimitives, NumVertices); }
185 void RegisterGPUDispatch(FIntVector GroupCount) { GPUProfilingData.RegisterGPUDispatch(GroupCount); }
186
187 // GPU Profiler
188 FORCEINLINE FD3D12GPUProfiler& GetGPUProfiler() { return GPUProfilingData; }
189#endif
190
192
193#if (RHI_NEW_GPU_PROFILER == 0)
195#endif
196
197 // Misc
198 void BlockUntilIdle();
201
202 // Specialized wrapper of ID3D12Device::CopyDescriptors for a common case of a single descriptor range. Similar to CopyDescriptorsSimple(), except source is provided as an array.
203 static void CopyDescriptors(ID3D12Device* D3DDevice, D3D12_CPU_DESCRIPTOR_HANDLE Destination, const D3D12_CPU_DESCRIPTOR_HANDLE* Source, uint32 NumSourceDescriptors, D3D12_DESCRIPTOR_HEAP_TYPE Type);
204 void CopyDescriptors(D3D12_CPU_DESCRIPTOR_HANDLE Destination, const D3D12_CPU_DESCRIPTOR_HANDLE* Source, uint32 NumSourceDescriptors, D3D12_DESCRIPTOR_HEAP_TYPE Type)
205 {
206 CopyDescriptors(GetDevice(), Destination, Source, NumSourceDescriptors, Type);
207 }
208
210 FD3D12ExplicitDescriptorHeapCache* GetExplicitDescriptorHeapCache() { return ExplicitDescriptorHeapCache; }
211
212 // Ray Tracing
213#if D3D12_RHI_RAYTRACING
214 void InitRayTracing();
215 void CleanupRayTracing();
216
220
223 FD3D12RayTracingCompactionRequestHandler* GetRayTracingCompactionRequestHandler() { return RayTracingCompactionRequestHandler; }
224
226
230
231 // Queries ray tracing pipeline state object metrics such as VGPR usage (if available/supported). Returns true if query succeeded.
233#endif // D3D12_RHI_RAYTRACING
234
235 // Heaps
236 inline FD3D12GlobalOnlineSamplerHeap& GetGlobalSamplerHeap() { return GlobalSamplerHeap; }
237
238 inline const D3D12_HEAP_PROPERTIES& GetConstantBufferPageProperties() { return ConstantBufferPageProperties; }
239
240 // Descriptor Managers
241 inline FD3D12DescriptorHeapManager& GetDescriptorHeapManager () { return DescriptorHeapManager; }
242#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
244 FD3D12BindlessDescriptorManager& GetBindlessDescriptorManager() { return BindlessDescriptorManager; }
245#endif
246 inline FD3D12OnlineDescriptorManager& GetOnlineDescriptorManager () { return OnlineDescriptorManager; }
248 {
250 return OfflineDescriptorManagers[static_cast<int>(InType)];
251 }
252
253 const FD3D12DefaultViews& GetDefaultViews() const { return DefaultViews; }
254
255 // Memory Allocators
256 inline FD3D12DefaultBufferAllocator& GetDefaultBufferAllocator() { return DefaultBufferAllocator; }
257 inline FD3D12FastAllocator& GetDefaultFastAllocator () { return DefaultFastAllocator; }
258 inline FD3D12TextureAllocatorPool& GetTextureAllocator () { return TextureAllocator; }
259
260 // Residency
261 inline FD3D12ResidencyManager& GetResidencyManager() { return ResidencyManager; }
262
263 // Samplers
265 void CreateSamplerInternal(const D3D12_SAMPLER_DESC& Desc, D3D12_CPU_DESCRIPTOR_HANDLE Descriptor);
266
267 // Command Allocators
270
271 // Contexts
272 FD3D12CommandContext& GetDefaultCommandContext() { return *ImmediateCommandContext; }
278
279 // Queries
282
283 // Command Lists
285 void ReleaseCommandList(FD3D12CommandList* CommandList);
286
287 // Queues
288 FD3D12Queue& GetQueue(ED3D12QueueType QueueType) { return Queues[(uint32)QueueType]; }
290
291 // shared code for different D3D12 devices (e.g. PC DirectX12 and XboxOne) called
292 // after device creation and GRHISupportsAsyncTextureCreation was set and before resource init
294 void CleanupResources();
295
296 // Wrapper of ID3D12Device::CreateCommandList
302 REFIID riid,
303 void** ppCommandList
304 );
305
306#if !D3D12RHI_SUPPORTS_UNCOMPRESSED_UAV
310 const D3D12_RESOURCE_DESC& InAliasResourceDesc,
312 D3D12_CPU_DESCRIPTOR_HANDLE InOfflineCpuHandle);
313#endif
314
317
318private:
319 // called by SetupAfterDeviceCreation() when the device gets initialized
320 void CreateDefaultViews();
321 void UpdateMSAASettings();
322 void UpdateConstantBufferPageProperties();
323
324#if (RHI_NEW_GPU_PROFILER == 0)
325 FD3D12GPUProfiler GPUProfilingData;
326#endif
327
328 struct FResidencyManager : public FD3D12ResidencyManager
329 {
330 FResidencyManager(FD3D12Device& Parent);
331 ~FResidencyManager();
332 } ResidencyManager;
333
334 FD3D12DescriptorHeapManager DescriptorHeapManager;
335#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
337 FD3D12BindlessDescriptorManager BindlessDescriptorManager;
338#endif
340
341 FD3D12GlobalOnlineSamplerHeap GlobalSamplerHeap;
342 FD3D12OnlineDescriptorManager OnlineDescriptorManager;
343
344 FD3D12DefaultViews DefaultViews;
345
347
348 FD3D12CommandContext* ImmediateCommandContext = nullptr;
349
351
353 uint32 SamplerID = 0;
354
356 FRWLock ResourceAllocationInfoMapMutex;
357 TMap<uint64, D3D12_RESOURCE_ALLOCATION_INFO> ResourceAllocationInfoMap;
358
359 // set by UpdateMSAASettings(), get by GetMSAAQuality()
360 // [SampleCount] = Quality, 0xffffffff if not supported
361 uint32 AvailableMSAAQualities[DX_MAX_MSAA_COUNT + 1];
362
363 // set by UpdateConstantBufferPageProperties, get by GetConstantBufferPageProperties
364 D3D12_HEAP_PROPERTIES ConstantBufferPageProperties;
365
366 FD3D12DefaultBufferAllocator DefaultBufferAllocator;
367 FD3D12FastAllocator DefaultFastAllocator;
368 FD3D12TextureAllocatorPool TextureAllocator;
369
370#if D3D12_RHI_RAYTRACING
372 FD3D12RayTracingCompactionRequestHandler* RayTracingCompactionRequestHandler = nullptr;
373// #dxr_todo UE-72158: unify RT descriptor cache with main FD3D12DescriptorCache
374#endif
375
376 FD3D12ExplicitDescriptorHeapCache* ExplicitDescriptorHeapCache = nullptr;
377 void DestroyExplicitDescriptorCache();
378};
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
@ InPlace
Definition CoreMiscDefines.h:162
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
ED3D12QueueType
Definition D3D12Queue.h:11
#define DX_MAX_MSAA_COUNT
Definition D3D12RHIDefinitions.h:10
D3DX12Residency::ResidencyManager FD3D12ResidencyManager
Definition D3D12Residency.h:188
ERHIDescriptorHeapType
Definition RHIDefinitions.h:1338
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition D3D12RHICommon.h:54
Definition D3D12Adapter.h:136
Definition D3D12Resources.h:1017
Definition D3D12CommandList.h:36
Definition D3D12CommandContext.h:513
Definition D3D12CommandList.h:63
Definition D3D12CommandContext.h:199
Definition D3D12CommandContext.h:446
Definition D3D12Allocation.h:440
Definition D3D12Descriptors.h:299
Definition D3D12Device.h:176
FD3D12ResidencyManager & GetResidencyManager()
Definition D3D12Device.h:261
FD3D12CommandContext * ObtainContextGraphics()
Definition D3D12Device.h:276
void ReleaseCommandAllocator(FD3D12CommandAllocator *Allocator)
Definition D3D12Device.cpp:713
FD3D12ContextCommon * ObtainContext(ED3D12QueueType QueueType)
Definition D3D12Device.cpp:676
FGPUTimingCalibrationTimestamp GetCalibrationTimestamp(ED3D12QueueType QueueType)
Definition D3D12Device.cpp:814
TRefCountPtr< FD3D12QueryHeap > ObtainQueryHeap(ED3D12QueueType QueueType, D3D12_QUERY_TYPE QueryType)
Definition D3D12Device.cpp:744
FD3D12ExplicitDescriptorHeapCache * GetExplicitDescriptorHeapCache()
Definition D3D12Device.h:210
FD3D12SamplerState * CreateSampler(const FSamplerStateInitializerRHI &Initializer, FD3D12SamplerState *FirstLinkedObject)
Definition D3D12State.cpp:246
void ReleaseQueryHeap(FD3D12QueryHeap *QueryHeap)
Definition D3D12Device.cpp:798
FORCEINLINE FD3D12GPUProfiler & GetGPUProfiler()
Definition D3D12Device.h:188
FD3D12DefaultBufferAllocator & GetDefaultBufferAllocator()
Definition D3D12Device.h:256
FD3D12DescriptorHeapManager & GetDescriptorHeapManager()
Definition D3D12Device.h:241
FD3D12CommandAllocator * ObtainCommandAllocator(ED3D12QueueType QueueType)
Definition D3D12Device.cpp:701
ID3D12Device * GetDevice()
Definition D3D12Device.cpp:188
FD3D12ContextCopy * ObtainContextCopy()
Definition D3D12Device.h:274
uint64 GetTimestampFrequency(ED3D12QueueType QueueType)
Definition D3D12Device.cpp:804
void ReleaseContext(FD3D12ContextCommon *Context)
Definition D3D12Device.cpp:694
void InitExplicitDescriptorHeap()
Definition D3D12Device.cpp:837
void CreateSamplerInternal(const D3D12_SAMPLER_DESC &Desc, D3D12_CPU_DESCRIPTOR_HANDLE Descriptor)
Definition WindowsD3D12Device.cpp:1928
const D3D12_HEAP_PROPERTIES & GetConstantBufferPageProperties()
Definition D3D12Device.h:238
void CleanupResources()
Definition D3D12Device.cpp:449
FD3D12CommandContext * ObtainContextCompute()
Definition D3D12Device.h:275
HRESULT CreateCommandList(UINT nodeMask, D3D12_COMMAND_LIST_TYPE type, ID3D12CommandAllocator *pCommandAllocator, ID3D12PipelineState *pInitialState, REFIID riid, void **ppCommandList)
Definition WindowsD3D12Device.cpp:2284
~FD3D12Device()
Definition D3D12Device.cpp:151
void CreateUnorderedAccessViewAlias(ID3D12Resource *InResource, ID3D12Resource *InCounterResource, const D3D12_RESOURCE_DESC &InAliasResourceDesc, const D3D12_UNORDERED_ACCESS_VIEW_DESC &InAliasViewDesc, D3D12_CPU_DESCRIPTOR_HANDLE InOfflineCpuHandle)
void BlockUntilIdle()
Definition D3D12Device.cpp:567
FD3D12GlobalOnlineSamplerHeap & GetGlobalSamplerHeap()
Definition D3D12Device.h:236
TRefCountPtr< ID3D12CommandQueue > TileMappingQueue
Definition D3D12Device.h:315
FD3D12CommandList * ObtainCommandList(FD3D12CommandAllocator *CommandAllocator, FD3D12QueryAllocator *TimestampAllocator, FD3D12QueryAllocator *PipelineStatsAllocator)
Definition D3D12Device.cpp:720
FD3D12Queue & GetQueue(ED3D12QueueType QueueType)
Definition D3D12Device.h:288
D3D12_RESOURCE_ALLOCATION_INFO GetResourceAllocationInfoUncached(const FD3D12ResourceDesc &InDesc)
Definition D3D12Device.cpp:596
FD3D12Fence TileMappingFence
Definition D3D12Device.h:316
void ReleaseCommandList(FD3D12CommandList *CommandList)
Definition D3D12Device.cpp:738
const FD3D12DefaultViews & GetDefaultViews() const
Definition D3D12Device.h:253
FD3D12TextureAllocatorPool & GetTextureAllocator()
Definition D3D12Device.h:258
FD3D12OnlineDescriptorManager & GetOnlineDescriptorManager()
Definition D3D12Device.h:246
FD3D12CommandContext & GetDefaultCommandContext()
Definition D3D12Device.h:272
FD3D12FastAllocator & GetDefaultFastAllocator()
Definition D3D12Device.h:257
void CopyDescriptors(D3D12_CPU_DESCRIPTOR_HANDLE Destination, const D3D12_CPU_DESCRIPTOR_HANDLE *Source, uint32 NumSourceDescriptors, D3D12_DESCRIPTOR_HEAP_TYPE Type)
Definition D3D12Device.h:204
FD3D12OfflineDescriptorManager & GetOfflineDescriptorManager(ERHIDescriptorHeapType InType)
Definition D3D12Device.h:247
void SetupAfterDeviceCreation()
Definition D3D12Device.cpp:224
void RegisterGPUWork(uint32 NumPrimitives=0, uint32 NumVertices=0)
Definition D3D12Device.h:184
void RegisterGPUDispatch(FIntVector GroupCount)
Definition D3D12Device.h:185
TArrayView< FD3D12Queue > GetQueues()
Definition D3D12Device.h:289
static void CopyDescriptors(ID3D12Device *D3DDevice, D3D12_CPU_DESCRIPTOR_HANDLE Destination, const D3D12_CPU_DESCRIPTOR_HANDLE *Source, uint32 NumSourceDescriptors, D3D12_DESCRIPTOR_HEAP_TYPE Type)
Definition WindowsD3D12Device.cpp:1933
D3D12_RESOURCE_ALLOCATION_INFO GetResourceAllocationInfo(const FD3D12ResourceDesc &InDesc)
Definition D3D12Device.cpp:642
Definition D3D12Device.h:39
D3D12_GPU_VIRTUAL_ADDRESS GetGPUQueueData() const
Definition D3D12Device.h:55
bool IsValid() const
Definition D3D12Device.h:65
~FD3D12DiagnosticBuffer()
Definition WindowsD3D12Device.cpp:2265
Definition D3D12RHIPrivate.h:160
Definition D3D12ExplicitDescriptorCache.h:25
Definition D3D12Allocation.h:534
Definition D3D12DescriptorCache.h:221
Definition D3D12Descriptors.h:270
Definition D3D12Descriptors.h:203
Definition D3D12Query.h:184
Definition D3D12Query.h:49
Definition D3D12Device.h:104
FD3D12BatchedPayloadObjects BatchedObjects
Definition D3D12Device.h:127
TRefCountPtr< ID3D12CommandQueue > D3DCommandQueue
Definition D3D12Device.h:113
TD3D12ObjectPool< FD3D12ContextCommon > Contexts
Definition D3D12Device.h:132
FD3D12Payload * PayloadToSubmit
Definition D3D12Device.h:121
~FD3D12Queue()
Definition D3D12Device.cpp:81
TD3D12ObjectPool< FD3D12CommandAllocator > Allocators
Definition D3D12Device.h:133
struct FD3D12Queue::@920 ObjectPool
static constexpr uint32 MaxBatchedPayloads
Definition D3D12Device.h:149
ED3D12QueueType const QueueType
Definition D3D12Device.h:109
uint64 FinalizePayload(bool bRequiresSignal, FPayloadArray &PayloadsToHandDown)
Definition D3D12Submission.cpp:550
TUniquePtr< FD3D12DiagnosticBuffer > DiagnosticBuffer
Definition D3D12Device.h:140
FD3D12CommandAllocator * BarrierAllocator
Definition D3D12Device.h:122
void CleanupResources()
Definition D3D12Device.cpp:442
uint32 NumCommandListsInBatch
Definition D3D12Device.h:125
FD3D12QueryAllocator BarrierTimestamps
Definition D3D12Device.h:123
bool bSupportsTileMapping
Definition D3D12Device.h:147
void ExecuteCommandLists(TArrayView< ID3D12CommandList * > D3DCommandLists)
Definition WindowsD3D12Device.cpp:2303
TMpscQueue< FD3D12Payload * > PendingSubmission
Definition D3D12Device.h:118
TSpscQueue< FD3D12Payload * > PendingInterrupt
Definition D3D12Device.h:119
FD3D12Timing * Timing
Definition D3D12Device.h:138
FD3D12Device *const Device
Definition D3D12Device.h:108
FD3D12Fence Fence
Definition D3D12Device.h:116
TD3D12ObjectPool< FD3D12CommandList > Lists
Definition D3D12Device.h:134
int32 const QueueIndex
Definition D3D12Device.h:110
Definition D3D12State.h:13
Definition D3D12RHICommon.h:128
Definition D3D12Allocation.h:1013
Definition D3D12Device.h:70
uint64 GetCurrentTimestamp() const
Definition D3D12Device.h:88
FD3D12Queue & Queue
Definition D3D12Device.h:72
TArray< uint64 > Timestamps
Definition D3D12Device.h:84
bool IsStartingWork() const
Definition D3D12Device.h:92
uint64 GetPreviousTimestamp() const
Definition D3D12Device.h:89
int32 TimestampIndex
Definition D3D12Device.h:85
uint64 BusyCycles
Definition D3D12Device.h:86
D3D12_QUERY_DATA_PIPELINE_STATISTICS PipelineStats
Definition D3D12Device.h:73
void AdvanceTimestamp()
Definition D3D12Device.h:94
bool HasMoreTimestamps() const
Definition D3D12Device.h:91
Definition UnrealTemplate.h:321
Definition RHIDiagnosticBuffer.h:13
FQueue * Data
Definition RHIDiagnosticBuffer.h:47
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition ContainerAllocationPolicies.h:1276
Definition LruCache.h:40
Definition UnrealString.h.inl:34
Definition MpscQueue.h:18
Definition RefCounting.h:454
UE_FORCEINLINE_HINT bool IsValid() const
Definition RefCounting.h:594
Definition SpscQueue.h:18
Definition StaticArray.h:26
Definition UniquePtr.h:107
Definition CriticalSection.h:14
Definition GPUProfiler.h:310
Definition D3D12Submission.h:169
Definition D3D12View.h:54
Definition D3D12Submission.h:42
Definition D3D12GPUProfiler.h:108
Definition WindowsD3D12Submission.h:13
Definition D3D12RHIPrivate.h:131
Definition D3D12Resources.h:134
Definition MultiGPU.h:33
Definition RHI.h:232
Definition D3D12RHICommon.h:380
Definition GPUProfiler.h:25