UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RHITransition.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Async/Mutex.h"
6#include "Async/UniqueLock.h"
8#include "Misc/Optional.h"
9#include "RHIDefinitions.h"
10#include "RHIAllocators.h"
11#include "RHIAccess.h"
12#include "RHIPipeline.h"
13#include "RHIValidationCommon.h"
14
15
16// The size in bytes of the storage required by the platform RHI for each resource transition.
19
21{
22 static const uint16 kDepthPlaneSlice = 0;
23 static const uint16 kStencilPlaneSlice = 1;
25
29
31
45
54
55 inline bool IsAllMips() const
56 {
57 return MipIndex == kAllSubresources;
58 }
59
60 inline bool IsAllArraySlices() const
61 {
63 }
64
65 inline bool IsAllPlaneSlices() const
66 {
68 }
69
70 inline bool IsWholeResource() const
71 {
73 }
74
75 inline bool IsZeroIndexResource() const
76 {
77 return (MipIndex == 0) && (ArraySlice == 0) && (PlaneSlice == 0);
78 }
79
80 inline bool IgnoreDepthPlane() const
81 {
83 }
84
85 inline bool IgnoreStencilPlane() const
86 {
88 }
89
90 inline bool operator == (FRHISubresourceRange const& RHS) const
91 {
92 return MipIndex == RHS.MipIndex
93 && ArraySlice == RHS.ArraySlice
94 && PlaneSlice == RHS.PlaneSlice;
95 }
96
97 inline bool operator != (FRHISubresourceRange const& RHS) const
98 {
99 return !(*this == RHS);
100 }
101};
102
117
119{
120 union
121 {
122 class FRHIResource* Resource = nullptr;
128 };
129
130 enum class EType : uint8
131 {
132 Unknown,
133 Texture,
134 Buffer,
135 UAV,
136 BVH,
138
143
145
161
169
177
185
193
199
205
211
212 inline bool operator == (FRHITransitionInfo const& RHS) const
213 {
214 return Resource == RHS.Resource
215 && Type == RHS.Type
216 && AccessBefore == RHS.AccessBefore
217 && AccessAfter == RHS.AccessAfter
218 && Flags == RHS.Flags
220 }
221
222 inline bool operator != (FRHITransitionInfo const& RHS) const
223 {
224 return !(*this == RHS);
225 }
226};
227
229{
230 union
231 {
232 class FRHIResource* Resource = nullptr;
235 };
236
237 enum class EType : uint8
238 {
239 Texture,
240 Buffer
242
244
249
254
259
260 bool IsTexture() const
261 {
262 return Type == EType::Texture;
263 }
264
265 bool IsBuffer() const
266 {
267 return Type == EType::Buffer;
268 }
269
271 {
272 return Resource == Other.Resource;
273 }
274
275 inline bool operator != (const FRHITransientAliasingOverlap& RHS) const
276 {
277 return !(*this == RHS);
278 }
279};
280
282{
283 union
284 {
285 class FRHIResource* Resource = nullptr;
288 };
289
290 // List of prior resource overlaps to use when acquiring. Must be empty for discard operations.
292
293 enum class EType : uint8
294 {
295 Texture,
296 Buffer
298
299 enum class EAction : uint8
300 {
301 Acquire,
302 Discard
304
306
316
326
327 UE_DEPRECATED(5.5, "Discard aliasing ops are no longer necessary.")
336
337 UE_DEPRECATED(5.5, "Discard aliasing ops are no longer necessary.")
346
347 bool IsAcquire() const
348 {
349 return Action == EAction::Acquire;
350 }
351
352 UE_DEPRECATED(5.5, "Discard aliasing ops are no longer necessary.")
354 {
355 return Action == EAction::Discard;
356 }
357
358 bool IsTexture() const
359 {
360 return Type == EType::Texture;
361 }
362
363 bool IsBuffer() const
364 {
365 return Type == EType::Buffer;
366 }
367
368 inline bool operator == (const FRHITransientAliasingInfo& RHS) const
369 {
370 return Resource == RHS.Resource
371 && Type == RHS.Type
372 && Action == RHS.Action;
373 }
374
375 inline bool operator != (const FRHITransientAliasingInfo& RHS) const
376 {
377 return !(*this == RHS);
378 }
379};
380
431
448
460
461struct FRHITransition;
463
465{
466 None = 0,
467 AllowDuringRenderPass = 1 << 0, // Specific transition are happening during RenderPass and are reported by the validation layer, we need to allow some of them
468};
469
470// Opaque data structure used to represent a pending resource transition in the RHI.
473 : public RHIValidation::FTransitionResource
474#endif
475{
476public:
477 template <typename T>
478 inline T* GetPrivateData()
479 {
482 checkSlow(Addr + GRHITransitionPrivateData_SizeInBytes - (uintptr_t)this == GetTotalAllocationSize());
483 return reinterpret_cast<T*>(Addr);
484 }
485
486 template <typename T>
487 inline const T* GetPrivateData() const
488 {
489 return const_cast<FRHITransition*>(this)->GetPrivateData<T>();
490 }
491
493
494private:
495 // Prevent copying and moving. Only pointers to these structures are allowed.
496 FRHITransition(const FRHITransition&) = delete;
497 FRHITransition(FRHITransition&&) = delete;
498
499 // Private constructor. Memory for transitions is allocated manually with extra space at the tail of the structure for RHI use.
501 : State(int8(int32(SrcPipelines) | (int32(DstPipelines) << int32(ERHIPipeline::Num))))
502 , Flags(InFlags)
504 , AllowedSrc(SrcPipelines)
505 , AllowedDst(DstPipelines)
506#endif
507 {}
508
509 // Give private access to specific functions/RHI commands that need to allocate or control transitions.
516
517 static uint64 GetTotalAllocationSize()
518 {
519 // Allocate extra space at the end of this structure for private RHI use. This is determined by GRHITransitionPrivateData_SizeInBytes.
521 }
522
523 static uint64 GetAlignment()
524 {
526 }
527
528 inline void MarkBegin(ERHIPipeline Pipeline) const
529 {
530#if DO_CHECK || USING_CODE_ANALYSIS
531 checkf(EnumHasAllFlags(AllowedSrc, Pipeline), TEXT("Transition is being used on a source pipeline that it wasn't created for."));
532#endif
533
535 int8 PreviousValue = FPlatformAtomics::InterlockedAnd(&State, ~Mask);
536 checkf((PreviousValue & Mask) == Mask, TEXT("RHIBeginTransitions has been called twice on this transition for at least one pipeline."));
537
538 if (PreviousValue == Mask)
539 {
540 Cleanup();
541 }
542 }
543
544 inline void MarkEnd(ERHIPipeline Pipeline) const
545 {
546#if DO_CHECK || USING_CODE_ANALYSIS
547 checkf(EnumHasAllFlags(AllowedDst, Pipeline), TEXT("Transition is being used on a destination pipeline that it wasn't created for."));
548#endif
549
551 int8 PreviousValue = FPlatformAtomics::InterlockedAnd(&State, ~Mask);
552 checkf((PreviousValue & Mask) == Mask, TEXT("RHIEndTransitions has been called twice on this transition for at least one pipeline."));
553
554 if (PreviousValue == Mask)
555 {
556 Cleanup();
557 }
558 }
559
560 RHI_API void Cleanup() const;
561
562 mutable int8 State;
563 static_assert((int32(ERHIPipeline::Num) * 2) < (sizeof(State) * 8), "Not enough bits to hold pipeline state.");
565
566#if DO_CHECK || USING_CODE_ANALYSIS
567 mutable ERHIPipeline AllowedSrc;
568 mutable ERHIPipeline AllowedDst;
569#endif
570};
571
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define ENABLE_RHI_VALIDATION
Definition Build.h:475
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::int8 int8
An 8-bit signed integer.
Definition Platform.h:1121
#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
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:28
@ Num
Definition MetalRHIPrivate.h:234
#define USING_CODE_ANALYSIS
Definition MicrosoftPlatformCodeAnalysis.h:10
const bool
Definition NetworkReplayStreaming.h:178
ERHIAccess
Definition RHIAccess.h:11
EResourceTransitionFlags
Definition RHIDefinitions.h:1517
ERHITransitionCreateFlags
Definition RHIDefinitions.h:1495
ERHIPipeline
Definition RHIPipeline.h:13
ETransitionFlag
Definition RHITransition.h:465
RHI_API uint64 GRHITransitionPrivateData_AlignInBytes
Definition RHITransition.cpp:7
RHI_API FRHIViewableResource * GetViewableResource(const FRHITransitionInfo &Info)
Definition RHITransition.cpp:9
RHI_API uint64 GRHITransitionPrivateData_SizeInBytes
Definition RHITransition.cpp:6
RHI_API FRHITransition * RHICreateTransition(const FRHITransitionCreateInfo &CreateInfo)
Definition DynamicRHI.cpp:811
if(Failed) console_printf("Failed.\n")
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition RHIResources.h:1581
Definition RHICommandList.h:455
Definition RHICommandList.h:2735
Definition RHIResources.h:3712
Definition RHIResources.h:54
Definition RHIResources.h:2153
Definition RHIResources.h:3294
Definition RHIResources.h:1265
Definition ArrayView.h:139
UE_FORCEINLINE_HINT constexpr SizeType Num() const
Definition ArrayView.h:380
Definition RHITransition.h:113
uint64 SizeInBytes
Definition RHITransition.h:114
FRHICommitResourceInfo(uint64 InSizeInBytes)
Definition RHITransition.h:115
Definition RHITransition.h:21
bool operator!=(FRHISubresourceRange const &RHS) const
Definition RHITransition.h:97
uint16 PlaneSlice
Definition RHITransition.h:28
bool IsWholeResource() const
Definition RHITransition.h:70
uint16 ArraySlice
Definition RHITransition.h:27
FRHISubresourceRange(uint32 InMipIndex, uint32 InArraySlice, uint32 InPlaneSlice)
Definition RHITransition.h:32
bool operator==(FRHISubresourceRange const &RHS) const
Definition RHITransition.h:90
bool IsAllPlaneSlices() const
Definition RHITransition.h:65
FRHISubresourceRange(uint16 InMipIndex, uint16 InArraySlice, uint16 InPlaneSlice)
Definition RHITransition.h:46
static const uint16 kStencilPlaneSlice
Definition RHITransition.h:23
static const uint16 kAllSubresources
Definition RHITransition.h:24
static const uint16 kDepthPlaneSlice
Definition RHITransition.h:22
bool IgnoreDepthPlane() const
Definition RHITransition.h:80
FRHISubresourceRange()=default
bool IsZeroIndexResource() const
Definition RHITransition.h:75
bool IsAllMips() const
Definition RHITransition.h:55
bool IgnoreStencilPlane() const
Definition RHITransition.h:85
uint16 MipIndex
Definition RHITransition.h:26
bool IsAllArraySlices() const
Definition RHITransition.h:60
Definition RHITransition.h:450
FRHIViewableResource * Resource
Definition RHITransition.h:458
FRHITrackedAccessInfo()=default
FRHITrackedAccessInfo(FRHIViewableResource *InResource, ERHIAccess InAccess, ERHIPipeline InPipelines)
Definition RHITransition.h:453
Definition RHITransition.h:433
ERHIPipeline Pipelines
Definition RHITransition.h:446
FRHITrackedAccess(ERHIAccess InAccess, ERHIPipeline InPipelines)
Definition RHITransition.h:440
FRHITrackedAccess()=default
ERHIAccess Access
Definition RHITransition.h:445
FRHITrackedAccess(ERHIAccess InAccess)
Definition RHITransition.h:436
Definition RHITransition.h:282
EAction
Definition RHITransition.h:300
enum FRHITransientAliasingInfo::EType Type
TArrayView< const FRHITransientAliasingOverlap > Overlaps
Definition RHITransition.h:291
class FRHIResource * Resource
Definition RHITransition.h:285
FRHITransientAliasingInfo()=default
static FRHITransientAliasingInfo Acquire(class FRHITexture *Texture, TArrayView< const FRHITransientAliasingOverlap > InOverlaps)
Definition RHITransition.h:307
bool operator!=(const FRHITransientAliasingInfo &RHS) const
Definition RHITransition.h:375
bool operator==(const FRHITransientAliasingInfo &RHS) const
Definition RHITransition.h:368
bool IsBuffer() const
Definition RHITransition.h:363
bool IsTexture() const
Definition RHITransition.h:358
EType
Definition RHITransition.h:294
bool IsDiscard() const
Definition RHITransition.h:353
class FRHIBuffer * Buffer
Definition RHITransition.h:287
class FRHITexture * Texture
Definition RHITransition.h:286
static FRHITransientAliasingInfo Acquire(class FRHIBuffer *Buffer, TArrayView< const FRHITransientAliasingOverlap > InOverlaps)
Definition RHITransition.h:317
bool IsAcquire() const
Definition RHITransition.h:347
enum FRHITransientAliasingInfo::EAction Action
Definition RHITransition.h:229
EType
Definition RHITransition.h:238
bool IsBuffer() const
Definition RHITransition.h:265
class FRHIResource * Resource
Definition RHITransition.h:232
bool IsTexture() const
Definition RHITransition.h:260
FRHITransientAliasingOverlap(FRHIBuffer *InBuffer)
Definition RHITransition.h:255
enum FRHITransientAliasingOverlap::EType Type
class FRHITexture * Texture
Definition RHITransition.h:233
FRHITransientAliasingOverlap(FRHITexture *InTexture)
Definition RHITransition.h:250
class FRHIBuffer * Buffer
Definition RHITransition.h:234
bool operator==(const FRHITransientAliasingOverlap &Other) const
Definition RHITransition.h:270
FRHITransientAliasingOverlap(FRHIResource *InResource, EType InType)
Definition RHITransition.h:245
bool operator!=(const FRHITransientAliasingOverlap &RHS) const
Definition RHITransition.h:275
Definition RHITransition.h:382
ERHITransitionCreateFlags Flags
Definition RHITransition.h:400
TArrayView< const FRHITransientAliasingInfo > AliasingInfos
Definition RHITransition.h:402
FRHITransitionCreateInfo()=default
ERHIPipeline SrcPipelines
Definition RHITransition.h:398
ERHIPipeline DstPipelines
Definition RHITransition.h:399
TArrayView< const FRHITransitionInfo > TransitionInfos
Definition RHITransition.h:401
FRHITransitionCreateInfo(ERHIPipeline InSrcPipelines, ERHIPipeline InDstPipelines, ERHITransitionCreateFlags InFlags=ERHITransitionCreateFlags::None, TArrayView< const FRHITransitionInfo > InTransitionInfos={}, TArrayView< const FRHITransientAliasingInfo > InAliasingInfos={})
Definition RHITransition.h:385
bool operator==(FRHITransitionCreateInfo const &RHS) const
Definition RHITransition.h:404
Definition RHITransition.h:119
class FRHIBuffer * Buffer
Definition RHITransition.h:125
enum FRHITransitionInfo::EType Type
ERHIAccess AccessBefore
Definition RHITransition.h:139
ERHIAccess AccessAfter
Definition RHITransition.h:140
class FRHIUnorderedAccessView * UAV
Definition RHITransition.h:126
FRHITransitionInfo(class FRHIBuffer *InRHIBuffer, ERHIAccess InNewState)
Definition RHITransition.h:206
FRHITransitionInfo(class FRHIUnorderedAccessView *InUAV, ERHIAccess InNewState)
Definition RHITransition.h:200
FRHITransitionInfo(class FRHIBuffer *InRHIBuffer, ERHIAccess InPreviousState, ERHIAccess InNewState, EResourceTransitionFlags InFlags=EResourceTransitionFlags::None)
Definition RHITransition.h:170
FRHITransitionInfo(class FRHIRayTracingAccelerationStructure *InBVH, ERHIAccess InPreviousState, ERHIAccess InNewState, EResourceTransitionFlags InFlags=EResourceTransitionFlags::None)
Definition RHITransition.h:186
class FRHIResource * Resource
Definition RHITransition.h:122
bool operator==(FRHITransitionInfo const &RHS) const
Definition RHITransition.h:212
class FRHIRayTracingAccelerationStructure * BVH
Definition RHITransition.h:127
FRHITransitionInfo(class FRHIBuffer *InRHIBuffer, ERHIAccess InPreviousState, ERHIAccess InNewState, FRHICommitResourceInfo InCommitInfo)
Definition RHITransition.h:178
FRHITransitionInfo()=default
EResourceTransitionFlags Flags
Definition RHITransition.h:141
FRHITransitionInfo(class FRHITexture *InTexture, ERHIAccess InNewState)
Definition RHITransition.h:194
class FRHIViewableResource * ViewableResource
Definition RHITransition.h:123
FRHITransitionInfo(class FRHIUnorderedAccessView *InUAV, ERHIAccess InPreviousState, ERHIAccess InNewState, EResourceTransitionFlags InFlags=EResourceTransitionFlags::None)
Definition RHITransition.h:162
TOptional< FRHICommitResourceInfo > CommitInfo
Definition RHITransition.h:142
FRHITransitionInfo(class FRHITexture *InTexture, ERHIAccess InPreviousState, ERHIAccess InNewState, EResourceTransitionFlags InFlags=EResourceTransitionFlags::None, uint32 InMipIndex=kAllSubresources, uint32 InArraySlice=kAllSubresources, uint32 InPlaneSlice=kAllSubresources)
Definition RHITransition.h:146
class FRHITexture * Texture
Definition RHITransition.h:124
EType
Definition RHITransition.h:131
bool operator!=(FRHITransitionInfo const &RHS) const
Definition RHITransition.h:222
Definition RHITransition.h:475
const T * GetPrivateData() const
Definition RHITransition.h:487
bool AllowInRenderingPass() const
Definition RHITransition.h:492
friend struct FRHICommandBeginTransitions
Definition RHITransition.h:513
T * GetPrivateData()
Definition RHITransition.h:478
friend struct FRHICommandEndTransitions
Definition RHITransition.h:514
friend RHI_API FRHITransition * RHICreateTransition(const FRHITransitionCreateInfo &CreateInfo)
Definition DynamicRHI.cpp:811
friend struct FRHICommandResourceTransition
Definition RHITransition.h:515
Definition NumericLimits.h:41
Definition Optional.h:131