12#include "Containers/Array.h"
31#include "Templates/Invoke.h"
42#ifndef WITH_TASKGRAPH_VERBOSE_TRACE
43#define WITH_TASKGRAPH_VERBOSE_TRACE 0
46#if WITH_TASKGRAPH_VERBOSE_TRACE
47#define TASKGRAPH_VERBOSE_EVENT_SCOPE(Name) TRACE_CPUPROFILER_EVENT_SCOPE(Name)
49#define TASKGRAPH_VERBOSE_EVENT_SCOPE(Name)
112 UE_DEPRECATED(5.1,
"You should not use this function as it exists only to patch another system and can be removed any time.")
126 static constexpr uint32 ExecutionFlag = 0x80000000;
133 RefCount.fetch_add(1, std::memory_order_relaxed);
141#if !defined(__clang_analyzer__)
149 return RefCount.load(MemoryOrder);
153 std::atomic<uint32> RefCount;
186 CaptureInheritedContext();
212 return LowLevelTask.GetPriority();
217 return ExtendedPriority;
227 checkf(NumLocks.load(std::memory_order_relaxed) >= NumInitialLocks && NumLocks.load(std::memory_order_relaxed) < ExecutionFlag,
TEXT(
"Prerequisites can be added only before the task is launched"));
234 checkf(
PrevNumLocks + 1 < ExecutionFlag,
TEXT(
"Max number of task prerequisites reached: %d"), ExecutionFlag);
239 NumLocks.fetch_sub(1, std::memory_order_relaxed);
254 return Prerequisite.IsValid() ? AddPrerequisites(*Prerequisite.Pimpl) :
false;
259 template<
typename HigherLevelTaskType, std::enable_if_t<std::is_same_v<HigherLevelTaskType, FGraphEventRef>>* =
nullptr>
262 return Prerequisite.IsValid() ? AddPrerequisites(*Prerequisite.GetReference()) :
false;
280 checkf(NumLocks.load(std::memory_order_relaxed) >= NumInitialLocks && NumLocks.load(std::memory_order_relaxed) < ExecutionFlag,
TEXT(
"Prerequisites can be added only before the task is launched"));
295 using FPrerequisiteType = std::decay_t<decltype(*std::declval<PrerequisiteCollectionType>().begin())>;
296 if constexpr (std::is_same_v<FPrerequisiteType, FTaskBase*>)
300 else if constexpr (std::is_same_v<FPrerequisiteType, FGraphEventRef>)
302 Prerequisite =
Prereq.GetReference();
304 else if constexpr (std::is_pointer_v<FPrerequisiteType>)
306 Prerequisite =
Prereq->Pimpl;
310 Prerequisite =
Prereq.Pimpl;
313 if (Prerequisite ==
nullptr)
379 NumLocks.fetch_add(1, std::memory_order_relaxed);
394 if (TaskTriggered.exchange(
true, std::memory_order_relaxed))
411#if UE_TASK_TRACE_ENABLED
426 return Subsequents.IsClosed();
440 verify(LowLevelTask.TryCancel());
453 if (
Nested.AddSubsequent(*
this))
460 NumLocks.fetch_sub(1, std::memory_order_relaxed);
477 CORE_API void WaitWithNamedThreadsSupport();
481#if UE_TASK_TRACE_ENABLED
482 return TraceId.load(std::memory_order_relaxed);
496 if (!TrySetExecutionFlag())
504 ReleasePrerequisites();
509 if (GetPipe() !=
nullptr)
511 StartPipeExecution();
521 if (GetPipe() !=
nullptr)
523 FinishPipeExecution();
562 if (GetPipe() !=
nullptr)
568 ReleasePrerequisites();
573 StateChangeEvent.NotifyWeak();
623 NumLocks.store(0, std::memory_order_release);
632 ReleaseInternalReference();
640 if (TrySetExecutionFlag())
643 ReleasePrerequisites();
645 ReleaseInternalReference();
679 CORE_API FTaskBase* TryPushIntoPipe();
683 bool TrySetExecutionFlag()
687 return NumLocks.compare_exchange_strong(
ExpectedUnlocked, ExecutionFlag + 1, std::memory_order_acq_rel, std::memory_order_relaxed);
691 void ReleasePrerequisites()
697 Prerequisite->Release();
702 CORE_API void FinishPipeExecution();
712 static constexpr uint32 NumInitialLocks = 1;
713 std::atomic<uint32> NumLocks{ NumInitialLocks };
715 FPipe* Pipe{
nullptr };
722 std::atomic<bool> TaskTriggered =
false;
726#if UE_TASK_TRACE_ENABLED
736 template <
typename AllocatorType = FDefaultAllocator>
740 void Push(FTaskBase* Prerequisite)
747 void PushNoLock(FTaskBase* Prerequisite)
779 template <
typename AllocatorType = FDefaultAllocator>
783 bool PushIfNotClosed(FTaskBase*
NewItem)
789 if (bIsClosed.load(std::memory_order_acquire))
810 bool IsClosed()
const
817 std::atomic<bool> bIsClosed =
false;
833 template<
typename ResultType>
861 template<
typename TaskBodyType,
typename ResultType = TInvokeResult_T<TaskBodyType>,
typename Enable =
void>
890 template<
typename TaskBodyType>
923 template<
typename TaskBodyType>
938 static void*
operator new(
size_t Size)
951 static void operator delete(
void* Ptr,
size_t Size)
971 static void*
operator new(
size_t Size);
972 static void operator delete(
void* Ptr);
979 Init(
InDebugName, ETaskPriority::Normal, EExtendedTaskPriority::TaskEvent, ETaskFlags::None);
982 virtual void ExecuteTask()
override final
991 inline void* FTaskEventBase::operator
new(
size_t Size)
996 inline void FTaskEventBase::operator
delete(
void* Ptr)
1006 template<
typename TaskCollectionType>
1009 bool bResult =
true;
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
#define checkNoEntry()
Definition AssertionMacros.h:316
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define verify(expr)
Definition AssertionMacros.h:319
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
AUTORTFM_INFER UE_FORCEINLINE_HINT constexpr auto Invoke(FuncType &&Func, ArgTypes &&... Args) -> decltype(((FuncType &&) Func)((ArgTypes &&) Args...))
Definition Invoke.h:44
FORCEINLINE constexpr void DestructItem(ElementType *Element)
Definition MemoryOps.h:56
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
auto GetNum(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Length())
Definition StringConv.h:808
#define TASKGRAPH_VERBOSE_EVENT_SCOPE(Name)
Definition TaskPrivate.h:49
#define UE_TRACE_CHANNELEXPR_IS_ENABLED(ChannelsExpr)
Definition Trace.h:452
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
uint32 Size
Definition VulkanMemory.cpp:4034
static constexpr uint32 InvalidThreadId
Definition Thread.h:99
void * Allocate()
Definition LockFreeFixedSizeAllocator.h:51
void Free(void *Item)
Definition LockFreeFixedSizeAllocator.h:100
Definition LockFreeFixedSizeAllocator.h:334
Definition InheritedContext.h:118
Definition InheritedContext.h:54
UE_API void Lock()
Definition RecursiveMutex.cpp:40
UE_API void Unlock()
Definition RecursiveMutex.cpp:115
Definition UniqueLock.h:20
Definition TaskPrivate.h:120
bool IsNamedThreadTask() const
Definition TaskPrivate.h:205
void SetPipe(FPipe &InPipe)
Definition TaskPrivate.h:376
void AddPrerequisites(const PrerequisiteCollectionType &InPrerequisites, bool bLockPrerequisite)
Definition TaskPrivate.h:270
EExtendedTaskPriority GetExtendedPriority() const
Definition TaskPrivate.h:215
void Release()
Definition TaskPrivate.h:136
void AddNested(FTaskBase &Nested)
Definition TaskPrivate.h:444
void Close()
Definition TaskPrivate.h:543
bool AddPrerequisites(const HigherLevelTaskType &Prerequisite)
Definition TaskPrivate.h:252
virtual ~FTaskBase()
Definition TaskPrivate.h:189
virtual void ExecuteTask()=0
bool Trigger(uint64 TaskSize)
Definition TaskPrivate.h:392
bool AddSubsequent(FTaskBase &Subsequent)
Definition TaskPrivate.h:363
bool AddPrerequisites(FTaskBase &Prerequisite)
Definition TaskPrivate.h:223
uint32 GetRefCount(std::memory_order MemoryOrder=std::memory_order_relaxed) const
Definition TaskPrivate.h:147
void AddRef()
Definition TaskPrivate.h:131
bool TryExecuteTask()
Definition TaskPrivate.h:492
TaskTrace::FId GetTraceId() const
Definition TaskPrivate.h:479
bool IsAwaitable() const
Definition TaskPrivate.h:200
FPipe * GetPipe() const
Definition TaskPrivate.h:383
void UnlockPrerequisites()
Definition TaskPrivate.h:825
bool TryLaunch(uint64 TaskSize)
Definition TaskPrivate.h:409
void Init(const TCHAR *InDebugName, ETaskPriority InPriority, EExtendedTaskPriority InExtendedPriority, ETaskFlags Flags)
Definition TaskPrivate.h:166
void ReleaseInternalReference()
Definition TaskPrivate.h:438
FTaskBase(uint32 InitRefCount, bool bUnlockPrerequisites=true)
Definition TaskPrivate.h:157
bool IsCompleted() const
Definition TaskPrivate.h:424
void AddPrerequisites(const PrerequisiteCollectionType &InPrerequisites)
Definition TaskPrivate.h:356
ETaskPriority GetPriority() const
Definition TaskPrivate.h:210
Definition TaskPrivate.h:964
static FTaskEventBase * Create(const TCHAR *DebugName)
Definition TaskPrivate.h:966
TExecutableTaskBase(const TCHAR *InDebugName, TaskBodyType &&TaskBody, ETaskPriority InPriority, EExtendedTaskPriority InExtendedPriority, ETaskFlags Flags)
Definition TaskPrivate.h:905
virtual void ExecuteTask() override final
Definition TaskPrivate.h:896
Definition TaskPrivate.h:863
virtual void ExecuteTask() override final
Definition TaskPrivate.h:867
TExecutableTaskBase(const TCHAR *InDebugName, TaskBodyType &&TaskBody, ETaskPriority InPriority, EExtendedTaskPriority InExtendedPriority, ETaskFlags Flags)
Definition TaskPrivate.h:876
Definition TaskPrivate.h:925
static TExecutableTask * Create(const TCHAR *InDebugName, TaskBodyType &&TaskBody, ETaskPriority InPriority, EExtendedTaskPriority InExtendedPriority, ETaskFlags Flags)
Definition TaskPrivate.h:933
TExecutableTask(const TCHAR *InDebugName, TaskBodyType &&TaskBody, ETaskPriority InPriority, EExtendedTaskPriority InExtendedPriority, ETaskFlags Flags)
Definition TaskPrivate.h:927
Definition TaskPrivate.h:835
ResultType & GetResult()
Definition TaskPrivate.h:849
virtual ~TTaskWithResult() override
Definition TaskPrivate.h:843
TTypeCompatibleBytes< ResultType > ResultStorage
Definition TaskPrivate.h:856
TTaskWithResult(const TCHAR *InDebugName, ETaskPriority InPriority, EExtendedTaskPriority InExtendedPriority, uint32 InitRefCount, ETaskFlags Flags)
Definition TaskPrivate.h:837
Type
Definition TaskGraphInterfaces.h:57
ETaskPriority
Definition Task.h:18
bool ToTaskPriority(const TCHAR *PriorityStr, ETaskPriority &OutPriority)
Definition Task.h:48
ETaskFlags
Definition Task.h:93
const TCHAR * ToString(ETaskPriority Priority)
Definition Task.h:30
UE::FRecursiveMutex Mutex
Definition MeshPaintVirtualTexture.cpp:164
Definition OverriddenPropertySet.cpp:45
void TASK_CORE_API Launched(FId TaskId, const TCHAR *DebugName, bool bTracked, ENamedThreads::Type ThreadToExecuteOn, uint64 TaskSize)
Definition TaskTrace.h:77
const FId InvalidId
Definition TaskTrace.h:39
void TASK_CORE_API Destroyed(FId TaskId)
Definition TaskTrace.h:83
FId TASK_CORE_API GenerateTaskId()
Definition TaskTrace.h:74
void TASK_CORE_API SubsequentAdded(FId TaskId, FId SubsequentId)
Definition TaskTrace.h:79
void TASK_CORE_API Created(FId TaskId, uint64 TaskSize)
Definition TaskTrace.h:76
uint64 FId
Definition TaskTrace.h:37
void TASK_CORE_API Completed(FId TaskId)
Definition TaskTrace.h:82
FTaskEventBaseAllocator TaskEventBaseAllocator
Definition TaskPrivate.cpp:25
ENamedThreads::Type TranslatePriority(EExtendedTaskPriority Priority)
Definition TaskPrivate.cpp:502
constexpr int32 SmallTaskSize
Definition TaskPrivate.h:918
bool IsThreadRetractingTask()
Definition TaskPrivate.cpp:49
FTaskBase * ExchangeCurrentTask(FTaskBase *Task)
Definition TaskPrivate.cpp:293
bool TryRetractAndExecute(const TaskCollectionType &Tasks, FTimeout Timeout)
Definition TaskPrivate.h:1007
FExecutableTaskAllocator SmallTaskAllocator
Definition TaskPrivate.cpp:24
FTaskBase * GetCurrentTask()
Definition TaskPrivate.cpp:288
bool IsCompleted(const HigherLevelTaskType &Prerequisite)
Definition Task.h:351
Definition AnalyticsProviderLog.h:8
TStaticArray< Private::FTaskBase *, sizeof...(TaskTypes)> Prerequisites(TaskTypes &... Tasks)
Definition Task.h:365
ETaskFlags
Definition TaskPrivate.h:89
EExtendedTaskPriority
Definition TaskPrivate.h:60
@ RenderThreadNormalPriLocalQueue
@ RenderThreadHiPriLocalQueue
@ RHIThreadHiPriLocalQueue
@ GameThreadHiPriLocalQueue
@ GameThreadNormalPriLocalQueue
@ RHIThreadNormalPriLocalQueue
bool ToExtendedTaskPriority(const TCHAR *ExtendedPriorityStr, EExtendedTaskPriority &OutExtendedPriority)
Definition TaskPrivate.cpp:358
bool Wait(const TaskCollectionType &Tasks, FTimespan InTimeout=FTimespan::MaxValue())
Definition Task.h:381
Definition AdvancedWidgetsModule.cpp:13
TEventCount< uint32 > FEventCount
Definition EventCount.h:214
constexpr struct UE::FAcquireLock AcquireLock
static uint32 GetCurrentThreadId(void)
Definition AndroidPlatformTLS.h:20
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition NumericLimits.h:41
Definition TypeCompatibleBytes.h:24
ElementType * GetTypedPtr()
Definition TypeCompatibleBytes.h:38
Definition TaskTrace.h:63