UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
D3D12Submission.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
7#include "D3D12Query.h"
8#include "D3D12Queue.h"
9#include "D3D12RHICommon.h"
10#include "Templates/Function.h"
12#include "RHIBreadcrumbs.h"
13#include "GPUProfiler.h"
14
15enum class ED3D12QueueType;
16
20class FD3D12QueryHeap;
21class FD3D12Queue;
22class FD3D12Timing;
23class FD3D12Buffer;
24class FD3D12Resource;
25
26class FD3D12SyncPoint;
28
30{
31 // Sync points of this type do not include an FGraphEvent, so cannot
32 // report completion to the CPU (via either IsComplete() or Wait())
33 GPUOnly,
34
35 // Sync points of this type include an FGraphEvent. The IsComplete() and Wait() functions
36 // can be used to poll for completion from the CPU, or block the CPU, respectively.
38};
39
40// Fence type used by the device queues to manage GPU completion
53
54// Used by FD3D12SyncPoint and the submission thread to fix up signaled fence values at the end-of-pipe
65
66//
67// A sync point is a logical point on a GPU queue's timeline that can be awaited by other queues, or the CPU.
68// These are used throughout the RHI as a way to abstract the underlying D3D12 fences. The submission thread
69// manages the underlying fences and signaled values, and reports completion to the relevant sync points via
70// an FGraphEvent.
71//
72// Sync points are one-shot, meaning they represent a single timeline point, and are released after use, via ref-counting.
73// Use FD3D12SyncPoint::Create() to make a new sync point and hold a reference to it via a FD3D12SyncPointRef object.
74//
76{
77 friend FD3D12DynamicRHI;
78 friend FD3D12Queue;
79
81
82 // No copying or moving
83 FD3D12SyncPoint(FD3D12SyncPoint const&) = delete;
85
87 FGraphEventRef GraphEvent;
88
90#if RHI_USE_SYNC_POINT_DEBUG_NAME
91 :DebugName(InDebugName)
92#endif
93 {
95 {
96 GraphEvent = FGraphEvent::CreateGraphEvent();
97 }
98 }
99
100public:
102 {
103 LLM_SCOPE_BYNAME(TEXT("RHIMisc/CreateSyncPoint"));
104 return new FD3D12SyncPoint(Type, InDebugName);
105 }
106
107 bool IsComplete() const
108 {
109 checkf(GraphEvent, TEXT("This sync point was not created with a CPU event. Cannot check completion on the CPU."));
110 return GraphEvent->IsComplete();
111 }
112
113 void Wait() const;
114
116 {
117 checkf(GraphEvent, TEXT("This sync point was not created with a CPU event."));
118 return GraphEvent;
119 }
120
122 {
123 return GraphEvent != nullptr
126 }
127
128 void* operator new(size_t Size)
129 {
130 check(Size == sizeof(FD3D12SyncPoint));
131
132 void* Memory = MemoryPool.Pop();
133 if (!Memory)
134 {
135 Memory = FMemory::Malloc(sizeof(FD3D12SyncPoint), alignof(FD3D12SyncPoint));
136 }
137 return Memory;
138 }
139
140 void operator delete(void* Pointer)
141 {
142 MemoryPool.Push(Pointer);
143 }
144
145 inline const TCHAR* GetDebugName() const
146 {
147#if RHI_USE_SYNC_POINT_DEBUG_NAME
148 return DebugName;
149#else
150 return TEXT("SyncPointBusyWait");
151#endif
152 }
153
154private:
155
156#if RHI_USE_SYNC_POINT_DEBUG_NAME
157 const TCHAR* DebugName = nullptr;
158#endif
159
160};
161
167
185
186// Hacky base class to avoid 8 bytes of padding after the vtable
188{
189 virtual ~FD3D12PayloadBaseFixLayout() = default;
190};
191
192// A single unit of work (specific to a single GPU node and queue type) to be processed by the submission thread.
194{
195 // Used to signal FD3D12ManualFence instances on the submission thread.
197 {
198 // The D3D fence to signal
200
201 // The value to signal the fence with.
203
204 FManualFence() = default;
209 };
210
211 // Constants
213
214 // Wait
216 {
217 // Used to pause / resume iteration of the sync point array on the
218 // submission thread when we find a sync point that is unresolved.
220
222
230
232
233 // UpdateReservedResources
235
236 // Flags.
237 bool bAlwaysSignal = false;
238 std::atomic<bool> bSubmitted { false };
239
240 // Used by RHIRunOnQueue
242
243 // Execute
245
246 // Signal
250
253
255
256 // Cleanup
258
260
261#if WITH_RHI_BREADCRUMBS
264#endif
265
266#if RHI_NEW_GPU_PROFILER
269#endif
270
271 virtual ~FD3D12PayloadBase();
272
273 virtual void PreExecute();
274
275 virtual bool HasPreExecuteWork() const
276 {
277 return PreExecuteCallback != nullptr;
278 }
279
280 virtual bool RequiresQueueFenceSignal() const
281 {
282 return bAlwaysSignal || SyncPointsToSignal.Num() > 0 || HasPreExecuteWork();
283 }
284
285 virtual bool HasWaitWork() const
286 {
287 return ManualFencesToWait.Num() > 0 || QueueFencesToWait.Num() > 0;
288 }
289
291 {
292 return ReservedResourcesToCommit.Num() > 0;
293 }
294
295 virtual bool HasSignalWork() const
296 {
297 return RequiresQueueFenceSignal() || ManualFencesToSignal.Num() > 0 || SubmissionEvent != nullptr
298 #if RHI_NEW_GPU_PROFILER
299 || EndFrameEvent.IsSet()
300 #endif
301 ;
302 }
303
304protected:
306};
307
308#include COMPILED_PLATFORM_HEADER(D3D12Submission.h)
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
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
ED3D12SyncPointType
Definition D3D12Submission.h:30
#define LLM_SCOPE_BYNAME(...)
Definition LowLevelMemTracker.h:1098
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
Definition TaskGraphInterfaces.h:471
static FGraphEventRef CreateGraphEvent()
Definition TaskGraphInterfaces.h:743
bool IsComplete() const
Definition TaskGraphInterfaces.h:529
Definition D3D12Resources.h:1017
Definition D3D12CommandList.h:36
Definition D3D12CommandList.h:63
Definition D3D12RHIPrivate.h:160
Definition D3D12Query.h:49
Definition D3D12Device.h:104
Definition D3D12Resources.h:181
Definition D3D12Submission.h:76
static FD3D12SyncPointRef Create(ED3D12SyncPointType Type, const TCHAR *InDebugName)
Definition D3D12Submission.h:101
ED3D12SyncPointType GetType() const
Definition D3D12Submission.h:121
bool IsComplete() const
Definition D3D12Submission.h:107
void Wait() const
Definition D3D12Submission.cpp:976
FGraphEvent * GetGraphEvent() const
Definition D3D12Submission.h:115
const TCHAR * GetDebugName() const
Definition D3D12Submission.h:145
Definition D3D12Device.h:70
Definition RefCounting.h:283
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition AndroidPlatformMisc.h:14
void Push(T *NewItem)
Definition LockFreeList.h:849
T * Pop()
Definition LockFreeList.h:858
Definition LockFreeList.h:904
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
Definition GPUProfiler.h:310
U16 Index
Definition radfft.cpp:71
Definition D3D12Submission.h:169
TArray< FD3D12QueryLocation > OcclusionQueries
Definition D3D12Submission.h:171
bool IsEmpty() const
Definition D3D12Submission.h:175
TArray< FD3D12QueryLocation > PipelineStatsQueries
Definition D3D12Submission.h:172
TArray< FD3D12QueryLocation > TimestampQueries
Definition D3D12Submission.h:170
TMap< TRefCountPtr< FD3D12QueryHeap >, TArray< FD3D12QueryRange > > QueryRanges
Definition D3D12Submission.h:173
Definition D3D12Submission.h:163
FD3D12Resource * Resource
Definition D3D12Submission.h:164
uint64 CommitSizeInBytes
Definition D3D12Submission.h:165
Definition D3D12Submission.h:42
TRefCountPtr< ID3D12Fence > D3DFence
Definition D3D12Submission.h:44
bool bInterruptAwaited
Definition D3D12Submission.h:47
FD3D12Fence(FD3D12Queue *OwnerQueue)
Definition D3D12Submission.h:49
uint64 NextCompletionValue
Definition D3D12Submission.h:45
FD3D12Queue *const OwnerQueue
Definition D3D12Submission.h:43
std::atomic< uint64 > LastSignaledValue
Definition D3D12Submission.h:46
Definition D3D12Submission.h:188
virtual ~FD3D12PayloadBaseFixLayout()=default
Definition D3D12Submission.h:197
uint64 Value
Definition D3D12Submission.h:202
FManualFence(TRefCountPtr< ID3D12Fence > &&Fence, uint64 Value)
Definition D3D12Submission.h:205
TRefCountPtr< ID3D12Fence > Fence
Definition D3D12Submission.h:199
Definition D3D12Submission.h:224
FD3D12Fence & Fence
Definition D3D12Submission.h:225
uint64 Value
Definition D3D12Submission.h:226
Definition D3D12Submission.h:194
TArray< FD3D12SyncPointRef > SyncPointsToSignal
Definition D3D12Submission.h:248
virtual bool HasUpdateReservedResourcesWork() const
Definition D3D12Submission.h:290
FGraphEventRef SubmissionEvent
Definition D3D12Submission.h:251
TArray< FManualFence > ManualFencesToWait
Definition D3D12Submission.h:229
TArray< FQueueFence, TInlineAllocator< GD3D12MaxNumQueues > > QueueFencesToWait
Definition D3D12Submission.h:228
TArray< FD3D12CommandList * > CommandListsToExecute
Definition D3D12Submission.h:244
virtual bool HasPreExecuteWork() const
Definition D3D12Submission.h:275
TOptional< uint64 > SubmissionTime
Definition D3D12Submission.h:252
std::atomic< bool > bSubmitted
Definition D3D12Submission.h:238
TArray< FD3D12CommandAllocator * > AllocatorsToRelease
Definition D3D12Submission.h:257
virtual bool HasWaitWork() const
Definition D3D12Submission.h:285
virtual bool RequiresQueueFenceSignal() const
Definition D3D12Submission.h:280
virtual bool HasSignalWork() const
Definition D3D12Submission.h:295
TOptional< FD3D12Timing * > Timing
Definition D3D12Submission.h:254
bool bAlwaysSignal
Definition D3D12Submission.h:237
virtual void PreExecute()
Definition D3D12Submission.cpp:1347
void AddQueueFenceWait(FD3D12Fence &Fence, uint64 Value)
Definition D3D12Submission.cpp:958
virtual ~FD3D12PayloadBase()
Definition D3D12Submission.cpp:1339
TArray< FManualFence > ManualFencesToSignal
Definition D3D12Submission.h:247
FD3D12Queue & Queue
Definition D3D12Submission.h:212
TFunction< void(ID3D12CommandQueue *)> PreExecuteCallback
Definition D3D12Submission.h:241
FD3D12BatchedPayloadObjects BatchedObjects
Definition D3D12Submission.h:259
TArray< FD3D12CommitReservedResourceDesc > ReservedResourcesToCommit
Definition D3D12Submission.h:234
uint64 CompletionFenceValue
Definition D3D12Submission.h:249
Definition D3D12Submission.h:56
FD3D12Fence & Fence
Definition D3D12Submission.h:57
uint64 Value
Definition D3D12Submission.h:58
FD3D12ResolvedFence(FD3D12Fence &Fence, uint64 Value)
Definition D3D12Submission.h:60
Definition Optional.h:131