UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RHIGPUReadback.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 RHIGPUReadback.h: classes for managing fences and staging buffers for
5 asynchronous GPU memory updates and readbacks with minimal stalls and no
6 RHI thread flushes
7=============================================================================*/
8
9#pragma once
10
11#include "RHI.h"
12#include "DynamicRHI.h"
13#include "RHICommandList.h"
14
20{
21public:
22
24 {
25 Fence = RHICreateGPUFence(RequestName);
27 }
28
30
32 inline bool IsReady()
33 {
34 return !Fence || (Fence->NumPendingWriteCommands.GetValue() == 0 && Fence->Poll());
35 }
36
38 inline bool IsReady(FRHIGPUMask GPUMask)
39 {
40 return !Fence || Fence->Poll(GPUMask);
41 }
42
43 void Wait(FRHICommandListImmediate& RHICmdList, FRHIGPUMask GPUMask) const
44 {
45 if (Fence)
46 {
47 Fence->Wait(RHICmdList, GPUMask);
48 }
49 }
50
57 virtual void EnqueueCopy(FRHICommandList& RHICmdList, FRHIBuffer* SourceBuffer, uint32 NumBytes = 0)
58 {
60 }
61
62 virtual void EnqueueCopy(FRHICommandList& RHICmdList, FRHITexture* SourceTexture, const FIntVector& SourcePosition, uint32 SourceSlice, const FIntVector& Size)
63 {
65 }
66
68 {
69 FIntVector SourcePosition, Size;
70
71 if (Rect.IsValid())
72 {
73 SourcePosition = FIntVector(Rect.X1, Rect.Y1, 0);
74 Size = FIntVector(Rect.X2 - Rect.X1, Rect.Y2 - Rect.Y1, 1);
75 }
76 else
77 {
78 SourcePosition = FIntVector::ZeroValue;
80 }
81
82 EnqueueCopy(RHICmdList, SourceTexture, SourcePosition, SourceSlice, Size);
83 }
84
90 virtual void* Lock(uint32 NumBytes) = 0;
91
95 virtual void Unlock() = 0;
96
97 inline const FRHIGPUMask& GetLastCopyGPUMask() const { return LastCopyGPUMask; }
98
99 FName GetName() const { return Fence->GetFName(); }
100
101protected:
102
105
106 // We need to separately track which GPU buffer was last locked. It's possible for a new copy operation to
107 // be enqueued (writing to LastCopyGPUMask) while the buffer is technically locked, with the unlock and enqueued
108 // copy on the GPU itself happening later, during pass execution in FRDGBuilder::Execute (for example, this
109 // happens with Nanite streaming). It's not unsafe, because the operations are occurring in order on both the
110 // render thread and later pass Execute, but our locking logic needs to handle that scenario.
112};
113
116{
117public:
118
120
121 RHI_API void EnqueueCopy(FRHICommandList& RHICmdList, FRHIBuffer* SourceBuffer, uint32 NumBytes = 0) override;
122 RHI_API void* Lock(uint32 NumBytes) override;
123 RHI_API void Unlock() override;
125
126private:
127
128 // RHI staging buffers are single GPU -- need to be branched when using multiple GPUs
129#if WITH_MGPU
130 FStagingBufferRHIRef DestinationStagingBuffers[MAX_NUM_GPUS];
131#else
132 FStagingBufferRHIRef DestinationStagingBuffers[1];
133#endif
134};
135
136
139{
140public:
142
144
145 RHI_API void EnqueueCopy(FRHICommandList& RHICmdList, FRHITexture* SourceTexture, const FIntVector& SourcePosition, uint32 SourceSlice, const FIntVector& Size) override;
146
147 UE_DEPRECATED(5.0, "Use FRHIGPUTextureReadback::Lock( int32& OutRowPitchInPixels) instead.")
148 RHI_API void* Lock(uint32 NumBytes) override;
149
151 RHI_API void Unlock() override;
152
153 UE_DEPRECATED(5.0, "Use FRHIGPUTextureReadback::Lock( int32& OutRowPitchInPixels) instead.")
155
157
158#if WITH_MGPU
160#else
162#endif
163};
#define unimplemented()
Definition AssertionMacros.h:321
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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
FGPUFenceRHIRef RHICreateGPUFence(const FName &Name)
Definition DynamicRHI.h:1135
FInt32Vector3 FIntVector
Definition MathFwd.h:115
#define MAX_NUM_GPUS
Definition MultiGPU.h:25
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint32 Size
Definition VulkanMemory.cpp:4034
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
Definition RHIResources.h:1581
Definition RHICommandList.h:4626
Definition RHICommandList.h:3819
Definition RHIGPUReadback.h:116
RHI_API void Unlock() override
Definition RHIGPUReadback.cpp:75
RHI_API uint64 GetGPUSizeBytes() const
Definition RHIGPUReadback.cpp:81
RHI_API void EnqueueCopy(FRHICommandList &RHICmdList, FRHIBuffer *SourceBuffer, uint32 NumBytes=0) override
Definition RHIGPUReadback.cpp:38
virtual bool Poll() const =0
FThreadSafeCounter NumPendingWriteCommands
Definition RHIResources.h:2437
virtual void Wait(FRHICommandListImmediate &RHICmdList, FRHIGPUMask GPUMask) const =0
FName GetFName() const
Definition RHIResources.h:2435
Definition RHIGPUReadback.h:20
FGPUFenceRHIRef Fence
Definition RHIGPUReadback.h:103
FRHIGPUMemoryReadback(FName RequestName)
Definition RHIGPUReadback.h:23
FName GetName() const
Definition RHIGPUReadback.h:99
virtual void EnqueueCopy(FRHICommandList &RHICmdList, FRHIBuffer *SourceBuffer, uint32 NumBytes=0)
Definition RHIGPUReadback.h:57
virtual ~FRHIGPUMemoryReadback()
Definition RHIGPUReadback.h:29
const FRHIGPUMask & GetLastCopyGPUMask() const
Definition RHIGPUReadback.h:97
bool IsReady(FRHIGPUMask GPUMask)
Definition RHIGPUReadback.h:38
void Wait(FRHICommandListImmediate &RHICmdList, FRHIGPUMask GPUMask) const
Definition RHIGPUReadback.h:43
uint32 LastLockGPUIndex
Definition RHIGPUReadback.h:111
virtual void EnqueueCopy(FRHICommandList &RHICmdList, FRHITexture *SourceTexture, const FIntVector &SourcePosition, uint32 SourceSlice, const FIntVector &Size)
Definition RHIGPUReadback.h:62
FRHIGPUMask LastCopyGPUMask
Definition RHIGPUReadback.h:104
virtual void * Lock(uint32 NumBytes)=0
virtual void Unlock()=0
void EnqueueCopy(FRHICommandList &RHICmdList, FRHITexture *SourceTexture, FResolveRect Rect=FResolveRect(), uint32 SourceSlice=0)
Definition RHIGPUReadback.h:67
bool IsReady()
Definition RHIGPUReadback.h:32
Definition RHIGPUReadback.h:139
RHI_API uint64 GetGPUSizeBytes() const
Definition RHIGPUReadback.cpp:274
RHI_API void Unlock() override
Definition RHIGPUReadback.cpp:266
FTextureRHIRef DestinationStagingTextures[1]
Definition RHIGPUReadback.h:161
RHI_API void LockTexture(FRHICommandListImmediate &RHICmdList, void *&OutBufferPtr, int32 &OutRowPitchInPixels)
Definition RHIGPUReadback.cpp:261
RHI_API void EnqueueCopy(FRHICommandList &RHICmdList, FRHITexture *SourceTexture, const FIntVector &SourcePosition, uint32 SourceSlice, const FIntVector &Size) override
Definition RHIGPUReadback.cpp:103
Definition RHIResources.h:2153
int32 GetValue() const
Definition ThreadSafeCounter.h:120
Definition MultiGPU.h:33
Definition RHIResources.h:5209
Definition LinuxPlatformSplash.cpp:43
static const TIntVector3 ZeroValue
Definition IntVector.h:45