10#include "Containers/Array.h"
33#define UE_API RENDERCORE_API
35namespace UE {
namespace Trace {
class FChannel; } }
73#if (UE_BUILD_SHIPPING || UE_BUILD_TEST)
77 extern RENDERCORE_API TAtomic<bool> GMainThreadBlockedOnRenderThread;
112UE_DEPRECATED(5.6,
"FlushPendingDeleteRHIResources_GameThread is deprecated. Enqueue a render command that calls ImmediateFlush(EImmediateFlushType::FlushRHIThreadFlushResources) on the immediate RHI command list instead.")
146 #define LogRenderCommand(TypeName) UE_LOG(LogRHI, Warning, TEXT("Render command '%s' is being executed on a dedicated server."), TEXT(#TypeName))
148 #define LogRenderCommand(TypeName)
153 #define ShouldExecuteOnRenderThread() false
155 #define ShouldExecuteOnRenderThread() (LIKELY(GIsThreadedRendering || !IsInGameThread()))
189template <
typename TSTR>
203 static inline const TCHAR* GetDescription()
209 return EStatDataType::ST_int64;
240#define DECLARE_RENDER_COMMAND_TAG(Type, Name) \
241 struct PREPROCESSOR_JOIN(TSTR_, PREPROCESSOR_JOIN(Name, __LINE__)) \
243 static const char* CStr() { return #Name; } \
244 static const TCHAR* TStr() { return TEXT(#Name); } \
246 using Type = TRenderCommandTag<PREPROCESSOR_JOIN(TSTR_, PREPROCESSOR_JOIN(Name, __LINE__))>;
326 enum class ECommandType :
uint8
334 virtual ~FCommand() =
default;
336 FCommand(ECommandType
InType)
340 FCommand*
Next =
nullptr;
344 struct FExecuteFunctionCommand
349 : FCommand(ECommandType::ExecuteFunction)
360 struct FExecuteCommandListCommand :
public FCommand
363 : FCommand(ECommandType::ExecuteCommandList)
394 template <
typename RenderCommandTag,
typename FunctionType>
400 template <
typename RenderCommandTag>
417 template <
typename LambdaType>
424 for (FCommand* Command = Commands.Head; Command; Command = Command->Next)
426 if (Command->Type == ECommandType::ExecuteFunction)
428 FExecuteFunctionCommand*
FunctionCommand =
static_cast<FExecuteFunctionCommand*
>(Command);
435 check(Command->Type == ECommandType::ExecuteCommandList);
436 FExecuteCommandListCommand*
CommandListCommand =
static_cast<FExecuteCommandListCommand*
>(Command);
454 return !Commands.Head;
460 template <
typename T,
typename...
TArgs>
461 inline T* AllocNoDestruct(
TArgs&&... Args)
479 bool bClosed =
false;
536 class FRenderCommandTaskBase
551 template <
typename LambdaType>
552 class TRenderCommandTask :
public FRenderCommandTaskBase
566 inline TStatId GetStatId()
const
568 return Tag.GetStatId();
576 class FRenderCommandListTask :
public FRenderCommandTaskBase
585 FRenderThreadCommandPipe::ExecuteCommands(CommandList);
593 template <
typename RenderCommandTag,
typename LambdaType>
629 Instance.EnqueueAndLaunch(CommandList);
638 ExecuteCommands(CommandList);
688 return NumInFlightCommands.load(std::memory_order_relaxed) == 0 && NumInFlightCommandLists.load(std::memory_order_relaxed) == 0;
705 checkf(!UE::RenderCommandPipe::IsReplaying(*
this),
TEXT(
"Enqueuing command queues from the render command pipe replay task is not allowed."));
716 template <
typename RenderCommandTag>
720 if (UE::RenderCommandPipe::IsReplaying(*
this))
737 template <
typename RenderCommandTag>
741 if (UE::RenderCommandPipe::IsReplaying(*
this))
797 std::atomic_int32_t NumInFlightCommands{ 0 };
798 std::atomic_int32_t NumInFlightCommandLists{ 0 };
800 bool bRecording =
false;
801 bool bReplaying =
false;
802 bool bEnabled =
true;
938 return RootCommandList;
943 return TaskCommandLists;
951 bool bSubmitRootCommandList =
false;
956 if (DispatchTaskEvent)
958 return *DispatchTaskEvent;
985 int32 ReleasePipeRef()
987 return ReleasePipeRefs(1);
990 bool HasDispatchTask()
992 return DispatchTaskEvent.
IsSet();
1007 template <
typename RenderCommandTag,
typename FunctionType>
1008 inline bool Enqueue(FunctionType&&
Function)
1013 template <
typename RenderCommandTag,
typename FunctionType>
1022 return CommandLists.Last();
1034 return Pipe && Pipe->
IsValid() ? CommandLists[Pipe->
GetIndex()] : GetRenderThread();
1041 std::atomic_int32_t NumPipeRefs = 0;
1044 uint8 bInitialized : 1 =
false;
1045 uint8 bRecording : 1 =
true;
1046 uint8 bSubmitted : 1 =
false;
1080 template <
typename RenderCommandTag>
1083#if !WITH_STATE_STREAM
1094 template <
typename RenderCommandTag>
1097#if !WITH_STATE_STREAM
1113 template <
typename RenderCommandTag>
1119 template <
typename RenderCommandTag>
1122#if !WITH_STATE_STREAM
1138 template <
typename RenderCommandTag>
1146#define DECLARE_RENDER_COMMAND_PIPE(Name, PrefixKeywords) \
1147 namespace UE::RenderCommandPipe { extern PrefixKeywords FRenderCommandPipe Name; }
1150#define DEFINE_RENDER_COMMAND_PIPE(Name, Flags) \
1151 namespace UE::RenderCommandPipe \
1153 FRenderCommandPipe Name( \
1156 TEXT("r.RenderCommandPipe." #Name), \
1157 TEXT("Whether to enable the " #Name " Render Command Pipe") \
1159 TEXT(" 1: on (default)") \
1167#define ENQUEUE_RENDER_COMMAND(Type) \
1168 DECLARE_RENDER_COMMAND_TAG(PREPROCESSOR_JOIN(FRenderCommandTag_, PREPROCESSOR_JOIN(Type, __LINE__)), Type) \
1169 FRenderCommandDispatcher::Enqueue<PREPROCESSOR_JOIN(FRenderCommandTag_, PREPROCESSOR_JOIN(Type, __LINE__))>
1237template <
typename StructType>
1243 template <
typename...
TArgs>
1249 Struct->InitRHI(RHICmdList);
1257 Struct->ReleaseRHI(RHICmdList);
1316 RenderCommands =
new RenderCommandFunctionArray;
1328 (*RenderCommandArray)[
Index](RHICmdList);
1335 void EnqueueRenderCommand(RenderCommandFunction&& Lambda)
1341 RenderCommandFunctionArray* RenderCommands;
1359template <
typename TagType,
typename LambdaType>
1372 inline TStatId GetStatId()
const
1374 return TagType::GetStatId();
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#define ensure( InExpression)
Definition AssertionMacros.h:464
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
EParallelForFlags
Definition ParallelFor.h:47
#define DECLARE_STATS_GROUP(GroupDesc, GroupId, GroupCat)
Definition Stats.h:689
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define TRACE_CPUPROFILER_EVENT_SCOPE_USE_ON_CHANNEL(DeclName, NameStr, ScopeName, Channel, Condition)
Definition CpuProfilerTrace.h:517
#define TRACE_CPUPROFILER_EVENT_SCOPE_ON_CHANNEL_STR(NameStr, Channel)
Definition CpuProfilerTrace.h:525
#define DECLARE_MULTICAST_DELEGATE(DelegateName)
Definition DelegateCombinations.h:23
#define DECLARE_MULTICAST_DELEGATE_OneParam(DelegateName, Param1Type)
Definition DelegateCombinations.h:49
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
RENDERCORE_API bool GIsThreadedRendering
Definition RenderingThread.cpp:48
FRHICommandListImmediate & GetImmediateCommandList_ForRenderCommand()
Definition RenderingThread.cpp:1330
FStopRenderingThread::FDelegate FStopRenderingThreadDelegate
Definition RenderingThread.h:1300
void CheckNotBlockedOnRenderThread()
Definition RenderingThread.h:80
RENDERCORE_API void FlushPendingDeleteRHIResources_GameThread()
Definition RenderingThread.cpp:1316
#define ShouldExecuteOnRenderThread()
Definition RenderingThread.h:155
RENDERCORE_API bool GUseThreadedRendering
Definition RenderingThread.cpp:49
RENDERCORE_API void ShutdownRenderingThread()
Definition RenderingThread.cpp:809
ERenderCommandPipeFlags
Definition RenderingThread.h:262
RENDERCORE_API TOptional< bool > GPendingUseThreadedRendering
Definition RenderingThread.cpp:50
RENDERCORE_API bool IsRenderingThreadHealthy()
Definition RenderingThread.cpp:840
RENDERCORE_API ERenderCommandPipeMode GRenderCommandPipeMode
Definition RenderingThread.cpp:136
RENDERCORE_API void FlushRenderingCommands()
Definition RenderingThread.cpp:1272
RENDERCORE_API TAtomic< bool > GMainThreadBlockedOnRenderThread
ERenderCommandPipeMode
Definition RenderingThread.h:250
RENDERCORE_API void StartRenderCommandFenceBundler()
Definition RenderingThread.cpp:874
RENDERCORE_API FDelegateHandle RegisterStopRenderingThreadDelegate(const FStopRenderingThreadDelegate &InDelegate)
Definition RenderingThread.cpp:659
ERenderCommandListFlags
Definition RenderingThread.h:806
#define ENQUEUE_RENDER_COMMAND(Type)
Definition RenderingThread.h:1167
RENDERCORE_API void AdvanceRenderingThreadStatsGT(bool bDiscardCallstack, int64 StatsFrame, int32 DisableChangeTagStartFrame)
Definition RenderingThread.cpp:308
RENDERCORE_API bool GIsThreadedRendering
Definition RenderingThread.cpp:48
RENDERCORE_API void FlushPendingDeleteRHIResources_RenderThread()
Definition RenderingThread.cpp:1325
RENDERCORE_API void UnregisterStopRenderingThreadDelegate(FDelegateHandle InDelegateHandle)
Definition RenderingThread.cpp:664
RENDERCORE_API void LatchRenderThreadConfiguration()
Definition RenderingThread.cpp:763
RENDERCORE_API void StopRenderCommandFenceBundler()
Definition RenderingThread.cpp:919
RENDERCORE_API void CheckRenderingThreadHealth()
Definition RenderingThread.cpp:817
RENDERCORE_API void InitRenderingThread()
Definition RenderingThread.cpp:795
RENDERCORE_API class FRHICommandListImmediate & GetImmediateCommandList_ForRenderCommand()
Definition RenderingThread.cpp:1330
TVariant< TUniqueFunction< void()>, TUniqueFunction< void(FRHICommandList &)>, TUniqueFunction< void(FRHICommandListImmediate &)> > FRenderCommandFunctionVariant
Definition RenderingThread.h:280
#define UE_API
Definition SColorGradingComponentViewer.h:12
CORE_API bool IsInParallelRenderingThread()
Definition ThreadingBase.cpp:301
CORE_API bool IsInGameThread()
Definition ThreadingBase.cpp:185
CORE_API bool IsInRenderingThread()
Definition ThreadingBase.cpp:273
#define UE_TRACE_CHANNEL_EXTERN(ChannelName,...)
Definition Trace.h:448
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
Definition IConsoleManager.h:1471
Definition RenderingThread.h:121
static RENDERCORE_API FOnFlushRenderingCommandsEnd OnFlushRenderingCommandsEnd
Definition RenderingThread.h:127
static RENDERCORE_API FOnFlushRenderingCommandsStart OnFlushRenderingCommandsStart
Definition RenderingThread.h:124
DECLARE_MULTICAST_DELEGATE(FOnFlushRenderingCommandsStart)
DECLARE_MULTICAST_DELEGATE(FOnFlushRenderingCommandsEnd)
Definition IDelegateInstance.h:14
EPageSize
Definition MemStack.h:81
Definition UnrealType.h:3087
Definition RHICommandList.h:3819
Definition RenderingThread.h:1068
static void Enqueue(FRenderCommandPipe &Pipe, FRenderCommandPipe::FEmptyFunction &&Function)
Definition RenderingThread.h:1139
static void Submit(FRenderCommandList *RenderCommandList, FRenderCommandList *ParentCommandList=nullptr)
Definition RenderingThread.h:1075
static void Enqueue(TUniqueFunction< void(FRHICommandListImmediate &)> &&Function)
Definition RenderingThread.h:1081
static void Enqueue(FRenderCommandPipe *Pipe, FRenderCommandPipe::FEmptyFunction &&Function)
Definition RenderingThread.h:1120
static void Enqueue(FRenderCommandPipe &Pipe, FRenderCommandPipe::FCommandListFunction &&Function)
Definition RenderingThread.h:1114
static void Enqueue(FRenderCommandPipe *Pipe, FRenderCommandPipe::FCommandListFunction &&Function)
Definition RenderingThread.h:1095
Definition RenderingThread.h:878
RENDERCORE_API FFlushScope()
Definition RenderingThread.cpp:1598
FFlushScope(const FFlushScope &)=delete
RENDERCORE_API ~FFlushScope()
Definition RenderingThread.cpp:1608
Definition RenderingThread.h:924
TArrayView< FRenderCommandList * > GetCommandLists()
Definition RenderingThread.h:941
~FParallelForContext()
Definition RenderingThread.h:926
RENDERCORE_API void Submit()
Definition RenderingThread.cpp:1643
FRenderCommandList * GetRootCommandList()
Definition RenderingThread.h:936
FParallelForContext(const FParallelForContext &)=delete
Definition RenderingThread.h:863
RENDERCORE_API ~FRecordScope()
Definition RenderingThread.cpp:1576
FRecordScope(const FRecordScope &)=delete
Definition RenderingThread.h:831
FMemStackBase::EPageSize EPageSize
Definition RenderingThread.h:841
FRenderCommandList * Head
Definition RenderingThread.h:1054
FRenderCommandList * Tail
Definition RenderingThread.h:1055
EStopRecordingAction
Definition RenderingThread.h:851
RENDERCORE_API void Close()
Definition RenderingThread.cpp:1726
static FRenderCommandList * Create(ERenderCommandListFlags InFlags=ERenderCommandListFlags::None, EPageSize InPageSize=EPageSize::Small)
Definition RenderingThread.h:843
UE::Tasks::FTask GetDispatchTask() const
Definition RenderingThread.h:954
RENDERCORE_API ~FRenderCommandList()
Definition RenderingThread.cpp:1677
Definition RenderingThread.h:489
~FRenderCommandPipeBase()
Definition RenderingThread.h:491
FContext * Context
Definition RenderingThread.h:527
UE::FMutex Mutex
Definition RenderingThread.h:528
void ResetContext()
Definition RenderingThread.h:497
Definition RenderingThread.cpp:1965
Definition RenderingThread.h:652
TUniqueFunction< void()> FEmptyFunction
Definition RenderingThread.h:655
const TCHAR * GetName() const
Definition RenderingThread.h:659
bool IsValid() const
Definition RenderingThread.h:664
bool Enqueue(FEmptyFunction &Function)
Definition RenderingThread.h:738
TUniqueFunction< void(FRHICommandList &)> FCommandListFunction
Definition RenderingThread.h:654
bool Enqueue(FRenderCommandList *RenderCommandList)
Definition RenderingThread.h:699
bool Enqueue(FCommandListFunction &Function)
Definition RenderingThread.h:717
bool IsRecording() const
Definition RenderingThread.h:681
bool IsEmpty() const
Definition RenderingThread.h:686
bool IsReplaying() const
Definition RenderingThread.h:675
int32 GetIndex() const
Definition RenderingThread.h:669
void SetEnabled(bool bInIsEnabled)
Definition RenderingThread.h:691
Definition RenderingThread.h:159
uint32 & GetSpecId() const
Definition RenderingThread.h:171
FRenderCommandTag(const TCHAR *InName, TStatId InStatId)
Definition RenderingThread.h:177
TStatId GetStatId() const
Definition RenderingThread.h:166
const TCHAR * GetName() const
Definition RenderingThread.h:161
Definition RenderingThread.h:532
static void Enqueue(FRenderCommandList *CommandList)
Definition RenderingThread.h:619
static void Enqueue(LambdaType &&Lambda)
Definition RenderingThread.h:594
Definition LightweightStats.h:424
Definition RHI.Build.cs:8
Definition ArrayView.h:139
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
Definition ConcurrentLinearAllocator.h:571
Definition BitArray.h:1944
Definition AndroidPlatformMisc.h:14
FGraphEventRef ConstructAndDispatchWhenReady(T &&... Args)
Definition TaskGraphInterfaces.h:614
Definition TaskGraphInterfaces.h:598
static FConstructor CreateTask(const FGraphEventArray *Prerequisites=nullptr, ENamedThreads::Type CurrentThreadIfKnown=ENamedThreads::AnyThread)
Definition TaskGraphInterfaces.h:664
Definition RenderingThread.h:191
static const TRenderCommandTag & Get()
Definition RenderingThread.h:193
Definition RenderingThread.h:1239
TRenderThreadStruct(const TRenderThreadStruct &)=delete
StructType * Get()
Definition RenderingThread.h:1290
const StructType * operator->() const
Definition RenderingThread.h:1265
StructType * operator->()
Definition RenderingThread.h:1270
~TRenderThreadStruct()
Definition RenderingThread.h:1253
const StructType * Get() const
Definition RenderingThread.h:1285
const StructType & operator*() const
Definition RenderingThread.h:1275
TRenderThreadStruct(TArgs &&... Args)
Definition RenderingThread.h:1244
StructType & operator*()
Definition RenderingThread.h:1280
Definition ContainerAllocationPolicies.h:894
Definition FunctionFwd.h:19
Definition InheritedContext.h:118
void CaptureInheritedContext()
Definition InheritedContext.h:121
Definition InheritedContext.h:54
Definition RenderingThread.h:325
bool Enqueue(FRenderCommandFunctionVariant &&Function)
Definition RenderingThread.h:401
FCommandList(FMemStackBase &InAllocator)
Definition RenderingThread.h:371
void Close()
Definition RenderingThread.h:410
int32 Num
Definition RenderingThread.h:474
FCommand * Head
Definition RenderingThread.h:472
bool IsEmpty() const
Definition RenderingThread.h:452
void ConsumeCommands(const LambdaType &Lambda)
Definition RenderingThread.h:418
~FCommandList()
Definition RenderingThread.h:389
bool Enqueue(FunctionType &&Function)
Definition RenderingThread.h:395
int32 NumCommands() const
Definition RenderingThread.h:447
FCommandList(FMemStackBase &InAllocator, FCommandList &CommandListToConsume)
Definition RenderingThread.h:376
FCommand * Tail
Definition RenderingThread.h:473
Definition RenderingThread.h:313
UE_API FSyncScope()
Definition RenderingThread.cpp:2286
UE_API ~FSyncScope()
Definition RenderingThread.cpp:2310
Definition ScopeLock.h:21
bool IsValid() const
Definition Task.h:62
UE_FORCEINLINE_HINT Type GetRenderThread()
Definition TaskGraphInterfaces.h:123
Type
Definition TaskGraphInterfaces.h:57
@ GameThread
Definition TaskGraphInterfaces.h:61
Type
Definition TaskGraphInterfaces.h:249
@ FireAndForget
Definition TaskGraphInterfaces.h:253
Definition UnrealEngine.cpp:13678
EFlushMode
Definition RenderingThread.h:46
Definition RenderingThread.cpp:1469
Definition AdvancedWidgetsModule.cpp:13
U16 Index
Definition radfft.cpp:71
Definition RenderingThread.h:511
bool bDeleteAfterExecute
Definition RenderingThread.h:524
FContext(FContext &&Other)
Definition RenderingThread.h:517
FMemStackBase Allocator
Definition RenderingThread.h:522
FContext()
Definition RenderingThread.h:512
UE::RenderCommandPipe::FCommandList CommandList
Definition RenderingThread.h:523
Definition RenderingThread.h:1176
FRenderThreadStructBase()=default
FRenderThreadStructBase(const FRenderThreadStructBase &)=delete
void ReleaseRHI(FRHICommandListImmediate &)
Definition RenderingThread.h:1183
void InitRHI(FRHICommandListImmediate &)
Definition RenderingThread.h:1182
Definition UnrealTypeTraits.h:40
Definition Optional.h:131
constexpr bool IsSet() const
Definition Optional.h:69
constexpr OptionalType * GetPtrOrNull()
Definition Optional.h:478
Definition LightweightStats.h:416