UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MetalRHIContext.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5// Metal RHI public headers.
6#include "MetalRHIPrivate.h"
7#include "MetalThirdParty.h"
8#include "MetalState.h"
9#include "MetalResources.h"
10#include "MetalViewport.h"
11#include "MetalDevice.h"
12#include "MetalCommandList.h"
13#include "MetalCommandEncoder.h"
14#include "MetalRHIRenderQuery.h"
16#include "RHICore.h"
17
18class FMetalEventNode;
19
20#if PLATFORM_VISIONOS
21namespace MetalRHIVisionOS
22{
25}
26#endif
27
33
35{
36 None = 0,
37
38 // Block the calling thread until the submission thread has dispatched all work.
40
41 // Both the calling thread until the GPU has signaled completion of all dispatched work.
43};
45
46
48{
49public:
52
54 {
55 check(CmdList.IsBottomOfPipe());
56 return static_cast<FMetalRHICommandContext&>(CmdList.GetContext().GetLowestLevelContext());
57 }
58
59 void ResetContext();
60 void BeginComputeEncoder();
61 void EndComputeEncoder();
62 void BeginBlitEncoder();
63 void EndBlitEncoder();
64
66 inline class FMetalProfiler* GetProfiler() const { return Profiler; }
67
68 virtual void RHISetComputePipelineState(FRHIComputePipelineState* ComputePipelineState) override;
69
70 virtual void RHIDispatchComputeShader(uint32 ThreadGroupCountX, uint32 ThreadGroupCountY, uint32 ThreadGroupCountZ) final override;
71
72 virtual void RHIDispatchIndirectComputeShader(FRHIBuffer* ArgumentBuffer, uint32 ArgumentOffset) final override;
73
74 // Useful when used with geometry shader (emit polygons to different viewports), otherwise SetViewPort() is simpler
75 // @param Count >0
76 // @param Data must not be 0
77 virtual void RHISetMultipleViewports(uint32 Count, const FViewportBounds* Data) final override;
78
80 virtual void RHIClearUAVFloat(FRHIUnorderedAccessView* UnorderedAccessViewRHI, const FVector4f& Values) final override;
81 virtual void RHIClearUAVUint(FRHIUnorderedAccessView* UnorderedAccessViewRHI, const FUintVector4& Values) final override;
82
83 virtual void RHICopyTexture(FRHITexture* SourceTextureRHI, FRHITexture* DestTextureRHI, const FRHICopyTextureInfo& CopyInfo) final override;
84 virtual void RHICopyBufferRegion(FRHIBuffer* DstBufferRHI, uint64 DstOffset, FRHIBuffer* SrcBufferRHI, uint64 SrcOffset, uint64 NumBytes) final override;
85
86#if (RHI_NEW_GPU_PROFILER == 0)
87 virtual void RHICalibrateTimers(FRHITimestampCalibrationQuery* CalibrationQuery) final override;
88#endif
89
90 virtual void RHIBeginRenderQuery(FRHIRenderQuery* RenderQuery) final override;
91 virtual void RHIEndRenderQuery(FRHIRenderQuery* RenderQuery) final override;
92
93 // This method is queued with an RHIThread, otherwise it will flush after it is queued; without an RHI thread there is no benefit to queuing this frame advance commands
94 virtual void RHIEndDrawingViewport(FRHIViewport* Viewport, bool bPresent, bool bLockToVsync) override;
95
96 virtual void RHISetStreamSource(uint32 StreamIndex, FRHIBuffer* VertexBuffer, uint32 Offset) final override;
97
98 // @param MinX including like Win32 RECT
99 // @param MinY including like Win32 RECT
100 // @param MaxX excluding like Win32 RECT
101 // @param MaxY excluding like Win32 RECT
102 virtual void RHISetViewport(float MinX, float MinY, float MinZ, float MaxX, float MaxY, float MaxZ) final override;
103
104 virtual void RHISetStereoViewport(float LeftMinX, float RightMinX, float LeftMinY, float RightMinY, float MinZ, float LeftMaxX, float RightMaxX, float LeftMaxY, float RightMaxY, float MaxZ) final override;
105
106 // @param MinX including like Win32 RECT
107 // @param MinY including like Win32 RECT
108 // @param MaxX excluding like Win32 RECT
109 // @param MaxY excluding like Win32 RECT
110 virtual void RHISetScissorRect(bool bEnable, uint32 MinX, uint32 MinY, uint32 MaxX, uint32 MaxY) final override;
111
112 virtual void RHISetGraphicsPipelineState(FRHIGraphicsPipelineState* GraphicsState, uint32 StencilRef, bool bApplyAdditionalState) final override;
113
114 virtual void RHISetStaticUniformBuffers(const FUniformBufferStaticBindings& InUniformBuffers) final override;
115 virtual void RHISetStaticUniformBuffer(FUniformBufferStaticSlot Slot, FRHIUniformBuffer* Buffer) final override;
116
119
120 virtual void RHISetStencilRef(uint32 StencilRef) final override;
121
122 virtual void RHISetBlendFactor(const FLinearColor& BlendFactor) final override;
123
124 void SetRenderTargets(uint32 NumSimultaneousRenderTargets, const FRHIRenderTargetView* NewRenderTargets, const FRHIDepthRenderTargetView* NewDepthStencilTarget);
125
126 void SetRenderTargetsAndClear(const FRHISetRenderTargetsInfo& RenderTargetsInfo);
127
128 virtual void RHIDrawPrimitive(uint32 BaseVertexIndex, uint32 NumPrimitives, uint32 NumInstances) final override;
129
130 virtual void RHIDrawPrimitiveIndirect(FRHIBuffer* ArgumentBuffer, uint32 ArgumentOffset) final override;
131
132 virtual void RHIDrawIndexedIndirect(FRHIBuffer* IndexBufferRHI, FRHIBuffer* ArgumentsBufferRHI, int32 DrawArgumentsIndex, uint32 NumInstances) final override;
133
134 // @param NumPrimitives need to be >0
135 virtual void RHIDrawIndexedPrimitive(FRHIBuffer* IndexBuffer, int32 BaseVertexIndex, uint32 FirstInstance, uint32 NumVertices, uint32 StartIndex, uint32 NumPrimitives, uint32 NumInstances) final override;
136
137 virtual void RHIDrawIndexedPrimitiveIndirect(FRHIBuffer* IndexBuffer, FRHIBuffer* ArgumentBuffer, uint32 ArgumentOffset) final override;
138
139#if PLATFORM_SUPPORTS_MESH_SHADERS
140 virtual void RHIDispatchMeshShader(uint32 ThreadGroupCountX, uint32 ThreadGroupCountY, uint32 ThreadGroupCountZ) final override;
141 virtual void RHIDispatchIndirectMeshShader(FRHIBuffer* ArgumentBuffer, uint32 ArgumentOffset) final override;
142#endif
143
150 virtual void RHISetDepthBounds(float MinDepth, float MaxDepth) final override;
151
152#if WITH_RHI_BREADCRUMBS
153 virtual void RHIBeginBreadcrumbGPU(FRHIBreadcrumbNode* Breadcrumb) final override;
154 virtual void RHIEndBreadcrumbGPU(FRHIBreadcrumbNode* Breadcrumb) final override;
155#endif
156
157 virtual void RHICopyToStagingBuffer(FRHIBuffer* SourceBufferRHI, FRHIStagingBuffer* DestinationStagingBufferRHI, uint32 Offset, uint32 NumBytes) final override;
158 virtual void RHIWriteGPUFence(FRHIGPUFence* FenceRHI) final override;
159
160 virtual void RHIBeginTransitions(TArrayView<const FRHITransition*> Transitions);
161 virtual void RHIEndTransitions(TArrayView<const FRHITransition*> Transitions);
162
163 virtual void RHIBeginParallelRenderPass(TSharedPtr<FRHIParallelRenderPassInfo> InInfo, const TCHAR* InName) final override;
164 virtual void RHIEndParallelRenderPass() final override;
165
166 virtual void RHIBeginRenderPass(const FRHIRenderPassInfo& InInfo, const TCHAR* InName) final override;
167 virtual void RHIEndRenderPass() final override;
168
169 virtual void RHINextSubpass() final override;
170
171#if METAL_RHI_RAYTRACING
172 virtual void RHIBindAccelerationStructureMemory(FRHIRayTracingScene* Scene, FRHIBuffer* Buffer, uint32 BufferOffset) final override;
173 virtual void RHIBuildAccelerationStructures(TConstArrayView<FRayTracingGeometryBuildParams> Params, const FRHIBufferRange& ScratchBufferRange) final override;
174 virtual void RHIBuildAccelerationStructures(TConstArrayView<FRayTracingSceneBuildParams> Params) final override;
175 virtual void RHIClearShaderBindingTable(FRHIShaderBindingTable* SBT) final override;
178 uint32 Width, uint32 Height) final override;
179
182 FRHIBuffer* ArgumentBuffer, uint32 ArgumentOffset) final override;
183 virtual void RHISetBindingsOnShaderBindingTable(
186 ERayTracingBindingType BindingType) final override;
187
188 void RHICommitShaderBindingTable(FRHIShaderBindingTable* InSBT, FRHIBuffer* InlineBindingDataBuffer);
189
192
194 uint32_t ScratchBufferOffset, FMetalBufferPtr HitGroupContributionsBuffer, uint32_t HitGroupContributionsBufferOffset, uint32_t MaxNumInstances, FMetalAccelerationStructure* AS);
195 void BuildAccelerationStructure(MTLAccelerationStructurePtr AS, MTL::AccelerationStructureDescriptor* Descriptor,
196 FMetalBufferPtr ScratchBuffer, uint32_t ScratchBufferOffset);
197
198 void RefitAccelerationStructure(MTLAccelerationStructurePtr SrcBLAS, MTLAccelerationStructurePtr DstBLAS, MTL::PrimitiveAccelerationStructureDescriptor* Descriptor, MTL::Buffer* ScratchBufferRes, uint32_t ScratchOffset);
199#endif // METAL_RHI_RAYTRACING
200
201 void FillBuffer(MTL::Buffer* Buffer, NS::Range Range, uint8 Value);
204 void CopyFromTextureToTexture(MTL::Texture* Texture, uint32 sourceSlice, uint32 sourceLevel, MTL::Origin sourceOrigin, MTL::Size sourceSize, MTL::Texture* toTexture, uint32 destinationSlice, uint32 destinationLevel, MTL::Origin destinationOrigin);
205 void CopyFromBufferToBuffer(FMetalBufferPtr SourceBuffer, NS::UInteger SourceOffset, FMetalBufferPtr DestinationBuffer, NS::UInteger DestinationOffset, NS::UInteger Size);
206
207 void CommitRenderResourceTables(void);
208 void PrepareToRender(uint32 PrimitiveType);
209 bool PrepareToDraw(uint32 PrimitiveType);
210 void PrepareToDispatch();
211 void SetupParallelContext(const FRHIParallelRenderPassInfo* ParallelRenderPassInfo);
212
214
215#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
217 {
219 }
220#endif
221
222 void PushDescriptorUpdates();
223 void InsertComputeMemoryBarrier();
224
225 enum class EPhase
226 {
227 Wait,
228 Execute,
229 Signal
230 } CurrentPhase = EPhase::Wait;
231
233 {
234 if (Payloads.Num() == 0 || Phase < CurrentPhase)
235 {
236 NewPayload();
237 }
238
239 CurrentPhase = Phase;
240 return Payloads.Last();
241 }
242
244 {
245 Payloads.Add(new FMetalPayload(Device.GetCommandQueue(EMetalQueueType::Direct)));
246 }
247
249 {
250 if (!ContextSyncPoint)
251 {
253 BatchedSyncPoints.ToSignal.Add(ContextSyncPoint);
254 }
255
256 return ContextSyncPoint;
257 }
258
259 // Sync points which are waited at the start / signaled at the end
260 // of the whole batch of command lists this context recorded.
261 struct
262 {
265 } BatchedSyncPoints;
266
267 // Inserts a command to signal the specified sync point
268 void SignalSyncPoint(FMetalSyncPoint* SyncPoint);
269
270 // Inserts a command that blocks the GPU queue until the specified sync point is signaled.
271 void WaitSyncPoint(FMetalSyncPoint* SyncPoint);
272
273 void StartTiming(class FMetalEventNode* EventNode);
274 void EndTiming(class FMetalEventNode* EventNode);
275
276 void SynchronizeResource(MTL::Resource* Resource);
277 void SynchronizeTexture(MTL::Texture* Texture, uint32 Slice, uint32 Level);
278
280 void SignalEvent(MTLEventPtr Event, uint32_t SignalCount);
281
283 void WaitForEvent(MTLEventPtr Event, uint32_t SignalCount);
284
285#if PLATFORM_VISIONOS
286 void BeginRenderingImmersive(const MetalRHIVisionOS::BeginRenderingImmersiveParams& Params);
287 cp_frame_t SwiftFrame = nullptr;
288#endif // PLATFORM_VISIONOS
289 void SetCustomPresentViewport(FRHIViewport* Viewport) { CustomPresentViewport = Viewport; }
290 FRHIViewport* CustomPresentViewport = nullptr;
291
292 FMetalCommandBuffer* GetCurrentCommandBuffer();
293
295 {
296 // Nothing to do
297 }
298
300 {
301 return GlobalUniformBuffers;
302 }
303
305 {
306 Profiler = InProfiler;
307 }
308
310 {
311 return Profiler;
312 }
313
315 {
316 return QueryBuffer.ToSharedRef();
317 }
318
320 {
321 return StateCache;
322 }
323
325 {
326 return CommandQueue;
327 }
328
330 {
331 return Device;
332 }
333
334 inline bool IsInsideRenderPass() const
335 {
336 return bWithinRenderPass;
337 }
338
339 void StartCommandBuffer();
340 void EndCommandBuffer();
341
342#if RHI_NEW_GPU_PROFILER
343 void FlushProfilerStats();
344#endif
345
346 void FlushCommands(EMetalFlushFlags Flags);
347
348protected:
350
353
356
358
361
364
365 MTL::RenderPassDescriptor* RenderPassDesc = nullptr;
366
368 class FMetalProfiler* Profiler = nullptr;
369
371 uint64_t UploadSyncCounter = 0;
372
373 bool bWithinRenderPass = false;
374 bool bIsParallelContext = false;
375 void ResolveTexture(UE::RHICore::FResolveTextureInfo Info);
376
378
379 // The array of recorded payloads the submission thread will process.
380 // These are returned when the context is finalized.
382
383 // A sync point signaled when all payloads in this context have completed.
385
387
388#if PLATFORM_SUPPORTS_BINDLESS_RENDERING
390#endif
391
392private:
393 void RHIClearMRT(bool bClearColor, int32 NumClearColors, const FLinearColor* ColorArray, bool bClearDepth, float Depth, bool bClearStencil, uint32 Stencil);
394};
395
397{
398public:
401
403
405
407 {
408 UploadFunctions.Add(Function);
409 }
410
411private:
412 FMetalRHICommandContext* UploadContext;
413 FMetalRHICommandContext* WaitContext;
414 TArray<UploadContextFunction> UploadFunctions;
415
416 MTLEventPtr UploadSyncEvent;
417 uint64_t UploadSyncCounter = 0;
418};
419
420struct FMetalContextArray : public TRHIPipelineArray<FMetalRHICommandContext*>
421{
422 FMetalContextArray(FRHIContextArray const& Contexts);
423};
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
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
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
EMetalFlushFlags
Definition MetalRHIContext.h:35
ERayTracingBindingType
Definition RHICommandList.h:281
uint8 FUniformBufferStaticSlot
Definition RHIDefinitions.h:722
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
void BuildAccelerationStructure(FVulkanCommandListContext &CommandContext, FVulkanRayTracingScene &Scene, FVulkanBuffer *InScratchBuffer, uint32 InScratchOffset, FVulkanBuffer *InInstanceBuffer, uint32 InInstanceOffset, uint32 NumInstances, EAccelerationStructureBuildMode BuildMode)
Definition VulkanRayTracing.cpp:757
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition MetalCommandBuffer.h:17
Definition MetalCommandEncoder.h:149
Definition MetalCommandList.h:19
Definition MetalCommandQueue.h:39
Definition MetalDevice.h:102
FMetalCommandQueue & GetCommandQueue(EMetalQueueType QueueType)
Definition MetalDevice.h:139
Definition MetalProfiler.h:131
Definition MetalProfiler.h:320
Definition MetalRHIContext.h:48
TArray< FMetalPayload * > Payloads
Definition MetalRHIContext.h:381
TSharedPtr< FMetalQueryBufferPool, ESPMode::ThreadSafe > QueryBuffer
Definition MetalRHIContext.h:363
bool IsInsideRenderPass() const
Definition MetalRHIContext.h:334
FMetalCommandQueue & GetCommandQueue()
Definition MetalRHIContext.h:324
FMetalProfiler * GetProfiler()
Definition MetalRHIContext.h:309
const TArray< FRHIUniformBuffer * > & GetStaticUniformBuffers() const
Definition MetalRHIContext.h:299
FMetalStateCache & GetStateCache()
Definition MetalRHIContext.h:319
FMetalSyncPoint * GetContextSyncPoint()
Definition MetalRHIContext.h:248
FMetalDevice & Device
Definition MetalRHIContext.h:349
TRefCountPtr< FMetalFence > CurrentEncoderFence
Definition MetalRHIContext.h:370
FMetalStateCache StateCache
Definition MetalRHIContext.h:360
void SetProfiler(FMetalProfiler *InProfiler)
Definition MetalRHIContext.h:304
FMetalCommandEncoder CurrentEncoder
Definition MetalRHIContext.h:357
void SetCustomPresentViewport(FRHIViewport *Viewport)
Definition MetalRHIContext.h:289
FMetalDevice & GetDevice()
Definition MetalRHIContext.h:329
FMetalSyncPointRef ContextSyncPoint
Definition MetalRHIContext.h:384
TArray< FMetalSyncPointRef > ToSignal
Definition MetalRHIContext.h:264
EPhase
Definition MetalRHIContext.h:226
static FMetalRHICommandContext & Get(FRHICommandListBase &CmdList)
Definition MetalRHIContext.h:53
void NewPayload()
Definition MetalRHIContext.h:243
TSharedRef< FMetalQueryBufferPool, ESPMode::ThreadSafe > GetQueryBufferPool()
Definition MetalRHIContext.h:314
FMetalCommandQueue & CommandQueue
Definition MetalRHIContext.h:352
TArray< FMetalSyncPointRef > ToWait
Definition MetalRHIContext.h:263
FMetalParallelRenderPassInfo * ParallelRenderPassInfo
Definition MetalRHIContext.h:386
FMetalPayload * GetPayload(EPhase Phase)
Definition MetalRHIContext.h:232
class FMetalProfiler * GetProfiler() const
Definition MetalRHIContext.h:66
TArray< FRHIUniformBuffer * > GlobalUniformBuffers
Definition MetalRHIContext.h:377
FMetalCommandList CommandList
Definition MetalRHIContext.h:355
void BeginRecursiveCommand()
Definition MetalRHIContext.h:294
Definition MetalRHIContext.h:397
void EnqueueFunction(UploadContextFunction Function)
Definition MetalRHIContext.h:406
TFunction< void(FMetalRHICommandContext *)> UploadContextFunction
Definition MetalRHIContext.h:402
~FMetalRHIUploadContext()
Definition MetalRHIContext.cpp:839
Definition MetalStateCache.h:45
Definition MetalSubmission.h:64
static FMetalSyncPointRef Create(EMetalSyncPointType Type)
Definition MetalSubmission.h:85
Definition RHIResources.h:1581
Definition RHICommandList.h:455
bool IsBottomOfPipe() const
Definition RHICommandList.h:653
IRHICommandContext & GetContext()
Definition RHICommandList.h:686
Definition RHIResources.h:1078
Definition RHIResources.h:1018
Definition RHIResources.h:5541
Definition RHIResources.h:4073
Definition RHIResources.h:2387
Definition RHIResources.h:1058
Definition RHIResources.h:947
Definition RHIResources.h:1115
Definition RHIResources.h:3755
Definition RHIResources.h:984
Definition RHIResources.h:2444
Definition RHIResources.h:4018
Definition RHIResources.h:4167
Definition RHIResources.h:3863
Definition RHIResources.h:3981
Definition RHIResources.h:2153
Definition RHIResources.h:1232
Definition RHIResources.h:3294
Definition RHIResources.h:2515
Definition RHIContext.h:49
Definition RHIContext.h:693
IRHIComputeContext & GetLowestLevelContext()
Definition RHIContext.h:506
Definition RHIContext.h:573
Definition ArrayView.h:139
Definition Array.h:670
Definition AndroidPlatformMisc.h:14
Definition RHIPipeline.h:55
Definition RefCounting.h:454
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition Color.h:48
Definition MetalRHIContext.h:421
Definition MetalRHIContext.h:29
MTL::RenderPassDescriptor * RenderPassDesc
Definition MetalRHIContext.h:31
MTLParallelRenderCommandEncoderPtr ParallelEncoder
Definition MetalRHIContext.h:30
Definition MetalSubmission.h:155
Definition RHICommandList.h:212
Definition RHICommandList.h:183
Definition RHIDefinitions.h:1401
Definition RHIResources.h:5548
Definition RHIResources.h:5248
Definition RHICommandList.h:267
Definition RHICommandList.h:248
Definition RHI.h:507
Definition RHICore.h:14