UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MetalSubmission.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
8#include "MetalProfiler.h"
9#include "RHIBreadcrumbs.h"
10#include "GPUProfiler.h"
11#include "MetalThirdParty.h"
12
13static constexpr uint32 GMetalMaxNumQueues = 1;
14
15class FMetalSyncPoint;
20
22
24{
25 // Sync points of this type do not include an FGraphEvent, so cannot
26 // report completion to the CPU (via either IsComplete() or Wait())
27 GPUOnly,
28
29 // Sync points of this type include an FGraphEvent. The IsComplete() and Wait() functions
30 // can be used to poll for completion from the CPU, or block the CPU, respectively.
32};
33
34// Fence type used by the device queues to manage GPU completion
36{
37 MTL::Event* MetalEvent;
39 std::atomic<uint64> LastSignaledValue = 0;
40};
41
42// Used by FMetalSyncPoint and the submission thread to fix up signaled fence values at the end-of-pipe
53
54//
55// A sync point is a logical point on a GPU queue's timeline that can be awaited by other queues, or the CPU.
56// These are used throughout the RHI as a way to abstract the underlying Metal fences. The submission thread
57// manages the underlying fences and signaled values, and reports completion to the relevant sync points via
58// an FGraphEvent.
59//
60// Sync points are one-shot, meaning they represent a single timeline point, and are released after use, via ref-counting.
61// Use FMetalSyncPoint::Create() to make a new sync point and hold a reference to it via a FMetalSyncPointRef object.
62//
64{
65 friend FMetalDynamicRHI;
66 friend FMetalCommandQueue;
68
69 // No copying or moving
70 FMetalSyncPoint(FMetalSyncPoint const&) = delete;
72
74 FGraphEventRef GraphEvent;
75
77 {
79 {
80 GraphEvent = FGraphEvent::CreateGraphEvent();
81 }
82 }
83
84public:
86 {
87 LLM_SCOPE_BYNAME(TEXT("RHIMisc/CreateSyncPoint"));
88 return new FMetalSyncPoint(Type);
89 }
90
91 bool IsComplete() const
92 {
93 checkf(GraphEvent, TEXT("This sync point was not created with a CPU event. Cannot check completion on the CPU."));
94 return GraphEvent->IsComplete();
95 }
96
97 void Wait() const;
98
100 {
101 checkf(GraphEvent, TEXT("This sync point was not created with a CPU event."));
102
104 {
105 Callback();
106 }, TStatId(), GraphEvent, ENamedThreads::AnyThread);
107 }
108
110 {
111 checkf(GraphEvent, TEXT("This sync point was not created with a CPU event."));
112 return GraphEvent;
113 }
114
116 {
117 return GraphEvent != nullptr
120 }
121};
122
125class FMetalEventNode;
126
128{
131#if RHI_NEW_GPU_PROFILER == 0
133#endif
134
135 bool IsEmpty() const
136 {
137 return TimestampQueries.Num() == 0 && OcclusionQueries.Num() == 0
138#if RHI_NEW_GPU_PROFILER == 0
139 && EventSampleCounters.Num() == 0
140#endif
141 ;
142 }
143};
144
145// Base class to avoid 8 bytes of padding after the vtable
147{
148 virtual ~FMetalPayloadBaseFixLayout() = default;
149};
150
151class FMetalTiming;
152
153// A single unit of work (specific to a single GPU node and queue type) to be processed by the submission thread.
155{
159
160 // Constants
162
163 // Wait
165 {
166 // Used to pause / resume iteration of the sync point array on the
167 // submission thread when we find a sync point that is unresolved.
169
171
178
180
181 // Flags.
182 bool bAlwaysSignal = false;
183 std::atomic<bool> bSubmitted { false };
184
185 // Used by RHIRunOnQueue
186 TFunction<void(MTL::CommandQueue*)> PreExecuteCallback;
187
188 // Execute
191
192 // Signal
195
198
200
202
203#if WITH_RHI_BREADCRUMBS
206#endif
207
208#if RHI_NEW_GPU_PROFILER
212#endif
213
214 virtual ~FMetalPayload();
215
216 virtual void PreExecute();
217
218 virtual bool HasPreExecuteWork() const
219 {
220 return PreExecuteCallback != nullptr;
221 }
222
223 virtual bool RequiresQueueFenceSignal() const
224 {
225 return bAlwaysSignal || SyncPointsToSignal.Num() > 0 || HasPreExecuteWork();
226 }
227
228 virtual bool HasWaitWork() const
229 {
230 return QueueFencesToWait.Num() > 0;
231 }
232
233 virtual bool HasSignalWork() const
234 {
235 return RequiresQueueFenceSignal() || SubmissionEvent != nullptr;
236 }
237
238protected:
240};
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
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
#define LLM_SCOPE_BYNAME(...)
Definition LowLevelMemTracker.h:1098
EMetalSyncPointType
Definition MetalSubmission.h:24
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition TaskGraphInterfaces.h:471
static FGraphEventRef CreateGraphEvent()
Definition TaskGraphInterfaces.h:743
bool IsComplete() const
Definition TaskGraphInterfaces.h:529
Definition MetalCommandBuffer.h:17
Definition MetalCommandQueue.h:39
Definition MetalDynamicRHI.h:74
Definition MetalProfiler.h:131
Definition MetalRHIContext.h:48
Definition MetalRHIRenderQuery.h:106
Definition MetalSubmission.h:64
void OnCompletionCallback(TUniqueFunction< void()> &&Func)
Definition MetalSubmission.h:99
EMetalSyncPointType GetType() const
Definition MetalSubmission.h:115
void Wait() const
Definition MetalSubmission.cpp:662
FGraphEvent * GetGraphEvent() const
Definition MetalSubmission.h:109
static FMetalSyncPointRef Create(EMetalSyncPointType Type)
Definition MetalSubmission.h:85
bool IsComplete() const
Definition MetalSubmission.h:91
Definition RefCounting.h:283
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition AndroidPlatformMisc.h:14
Definition UnrealString.h.inl:34
Definition SharedPointer.h:692
Definition FunctionFwd.h:19
Definition GPUProfiler.h:310
@ AnyThread
Definition TaskGraphInterfaces.h:67
U16 Index
Definition radfft.cpp:71
static FGraphEventRef CreateAndDispatchWhenReady(TUniqueFunction< void()> InFunction, TStatId InStatId=TStatId{}, const FGraphEventArray *InPrerequisites=nullptr, ENamedThreads::Type InDesiredThread=ENamedThreads::AnyThread)
Definition TaskGraphInterfaces.h:1128
Definition MetalSubmission.h:128
TMap< FMetalEventNode *, TArray< FMetalCounterSamplePtr > > EventSampleCounters
Definition MetalSubmission.h:132
TArray< FMetalRHIRenderQuery * > TimestampQueries
Definition MetalSubmission.h:130
bool IsEmpty() const
Definition MetalSubmission.h:135
TArray< FMetalRHIRenderQuery * > OcclusionQueries
Definition MetalSubmission.h:129
Definition MetalCounterSampler.h:20
Definition MetalSubmission.h:147
virtual ~FMetalPayloadBaseFixLayout()=default
Definition MetalSubmission.h:173
uint64 Value
Definition MetalSubmission.h:175
FMetalSignalEvent & Fence
Definition MetalSubmission.h:174
Definition MetalSubmission.h:155
TMap< FMetalEventNode *, TArray< FMetalCounterSamplePtr > > EventSampleCounters
Definition MetalSubmission.h:201
std::atomic< bool > bSubmitted
Definition MetalSubmission.h:183
friend FMetalCommandQueue
Definition MetalSubmission.h:157
FMetalCommandQueue & Queue
Definition MetalSubmission.h:161
friend FMetalDynamicRHI
Definition MetalSubmission.h:156
FMetalCommandBuffer * SignalCommandBuffer
Definition MetalSubmission.h:190
virtual bool HasSignalWork() const
Definition MetalSubmission.h:233
virtual ~FMetalPayload()
Definition MetalSubmission.cpp:948
uint64 CompletionFenceValue
Definition MetalSubmission.h:194
virtual bool RequiresQueueFenceSignal() const
Definition MetalSubmission.h:223
virtual bool HasWaitWork() const
Definition MetalSubmission.h:228
virtual void PreExecute()
Definition MetalSubmission.cpp:952
TArray< FQueueFence, TInlineAllocator< GMetalMaxNumQueues > > QueueFencesToWait
Definition MetalSubmission.h:177
TFunction< void(MTL::CommandQueue *)> PreExecuteCallback
Definition MetalSubmission.h:186
TOptional< uint64 > SubmissionTime
Definition MetalSubmission.h:197
FMetalBatchedPayloadObjects BatchedObjects
Definition MetalSubmission.h:199
virtual bool HasPreExecuteWork() const
Definition MetalSubmission.h:218
FGraphEventRef SubmissionEvent
Definition MetalSubmission.h:196
void AddQueueFenceWait(FMetalSignalEvent &Fence, uint64 Value)
Definition MetalSubmission.cpp:648
bool bAlwaysSignal
Definition MetalSubmission.h:182
TArray< FMetalSyncPointRef > SyncPointsToSignal
Definition MetalSubmission.h:193
TArray< FMetalCommandBuffer * > CommandBuffersToExecute
Definition MetalSubmission.h:189
friend FMetalRHICommandContext
Definition MetalSubmission.h:158
Definition MetalSubmission.h:44
uint64 Value
Definition MetalSubmission.h:46
FMetalResolvedFence(FMetalSignalEvent &Fence, uint64 Value)
Definition MetalSubmission.h:48
FMetalSignalEvent & Fence
Definition MetalSubmission.h:45
Definition MetalSubmission.h:36
std::atomic< uint64 > LastSignaledValue
Definition MetalSubmission.h:39
uint64 NextCompletionValue
Definition MetalSubmission.h:38
MTL::Event * MetalEvent
Definition MetalSubmission.h:37
Definition Optional.h:131
Definition LightweightStats.h:416