14#include "CoreMinimal.h"
15#include "UObject/StrongObjectPtr.h"
16#include "Async/TaskGraphInterfaces.h"
17#include "Async/Async.h"
20#include "RHICommandList.h"
21#include "RenderingThread.h"
33 MCRO_API
bool IsInThread(ENamedThreads::Type threadName);
39 template <CFunctionLike When>
40 requires (TFunction_ArgCount<When> == 0)
42 ENamedThreads::Type threadName,
43 TUniqueFunction<
void()>&& func, When&& when
46 else AsyncTask(threadName, [when = MoveTemp(when), func = MoveTemp(func)]
48 if (
auto keep = when()) func();
52 template <CFunctionLike When>
53 requires (TFunction_ArgCount<When> == 0)
56 if (IsInRenderingThread()) func(GetImmediateCommandList_ForRenderCommand());
59 ENQUEUE_RENDER_COMMAND(FMcroThreading)([when = MoveTemp(when), func = MoveTemp(func)](FRHICommandListImmediate& cmdList)
61 if (
auto keep = when()) func(cmdList);
66 template <CFunctorObject Function,
typename Result = TFunction_Return<Function>, CFunctionLike When>
68 TFunction_ArgCount<Function> == 0
69 && TFunction_ArgCount<When> == 0
72 ENamedThreads::Type threadName,
77 return MakeFulfilledPromise<Result>(func()).GetFuture();
79 TPromise<Result> promise;
80 auto future = promise.GetFuture();
82 AsyncTask(threadName, [when = MoveTemp(when), func = MoveTemp(func), promise = MoveTemp(promise)]()
mutable
84 if (
auto keep = when()) promise.SetValue(func());
85 else promise.SetValue({});
90 template <CFunctorObject Function,
typename Result = TFunction_Return<Function>, CFunctionLike When>
92 TFunction_ArgCount<Function> == 1
93 && CSameAs<FRHICommandListImmediate&, TFunction_Arg<Function, 0>>
94 && TFunction_ArgCount<When> == 0
97 ENamedThreads::Type threadName,
101 if (IsInRenderingThread())
102 return MakeFulfilledPromise<Result>(func(GetImmediateCommandList_ForRenderCommand())).GetFuture();
104 TPromise<Result> promise;
105 auto future = promise.GetFuture();
107 ENQUEUE_RENDER_COMMAND(FMcroThreading)([when = MoveTemp(when), func = MoveTemp(func), promise = MoveTemp(promise)](FRHICommandListImmediate& cmdList)
mutable
109 if (
auto keep = when())
110 promise.SetValue(func(cmdList));
111 else promise.SetValue({});
122 MCRO_API
void RunInThread(ENamedThreads::Type threadName, TUniqueFunction<
void()>&& func);
129 MCRO_API
void RunInThread(ENamedThreads::Type threadName,
const UObject* boundToObject, TUniqueFunction<
void()>&& func);
136 MCRO_API
void RunInThread(ENamedThreads::Type threadName,
const FWeakObjectPtr& boundToObject, TUniqueFunction<
void()>&& func);
149 MCRO_API
void RunInGameThread(
const UObject* boundToObject, TUniqueFunction<
void()>&& func);
156 MCRO_API
void RunInGameThread(
const FWeakObjectPtr& boundToObject, TUniqueFunction<
void()>&& func);
169 MCRO_API
void EnqueueRenderCommand(
const UObject* boundToObject, TUniqueFunction<
void(FRHICommandListImmediate&)>&& func);
176 MCRO_API
void EnqueueRenderCommand(
const FWeakObjectPtr& boundToObject, TUniqueFunction<
void(FRHICommandListImmediate&)>&& func);
183 template <CSharedOrWeak Object>
184 void RunInThread(ENamedThreads::Type threadName,
const Object& boundToObject, TUniqueFunction<
void()>&& func)
189 return weakObject.Pin();
198 template <CSharedOrWeak Object>
209 template <CSharedOrWeak Object>
210 void EnqueueRenderCommand(
const Object& boundToObject, TUniqueFunction<
void(FRHICommandListImmediate&)>&& func)
215 return weakObject.Pin();
225 CFunctorObject Function,
240 CSharedOrWeak Object,
241 CFunctorObject Function,
245 TFuture<Result>
PromiseInThread(ENamedThreads::Type threadName,
const Object& boundToObject, Function&& func)
250 return weakObject.Pin();
261 CFunctorObject Function,
265 TFuture<Result>
PromiseInThread(ENamedThreads::Type threadName,
const Object* boundToObject, Function&& func)
269 return IsValid(boundToObject) ? TStrongObjectPtr(boundToObject) :
nullptr;
279 CFunctorObject Function,
294 CSharedOrWeak Object,
295 CFunctorObject Function,
304 return weakObject.Pin();
315 CFunctorObject Function,
323 return IsValid(boundToObject) ? TStrongObjectPtr(boundToObject) :
nullptr;
333 CFunctorObject Function,
338 && CSameAs<FRHICommandListImmediate&, TFunction_Arg<Function, 0>>
351 CSharedOrWeak Object,
352 CFunctorObject Function,
357 && CSameAs<FRHICommandListImmediate&, TFunction_Arg<Function, 0>>
364 return weakObject.Pin();
375 CFunctorObject Function,
380 && CSameAs<FRHICommandListImmediate&, TFunction_Arg<Function, 0>>
386 return IsValid(boundToObject) ? TStrongObjectPtr(boundToObject) :
nullptr;
typename TFunctionTraits< std::decay_t< T > >::Return TFunction_Return
Shorthand for getting a function return type.
constexpr size_t TFunction_ArgCount
Shorthand for getting a function argument count.
Utilities for TSharedPtr/Ref and related.
TWeakPtr< typename T::ElementType, T::Mode > TWeakPtrFrom
Copy thread-safety from other shared object type.
void RunInThreadBoilerplate(ENamedThreads::Type threadName, TUniqueFunction< void()> &&func, When &&when)
TFuture< Result > EnqueueRenderPromiseBoilerplate(ENamedThreads::Type threadName, Function &&func, When &&when)
void EnqueueRenderCommandBoilerplate(TUniqueFunction< void(FRHICommandListImmediate &)> &&func, When &&when)
TFuture< Result > PromiseInThreadBoilerplate(ENamedThreads::Type threadName, Function &&func, When &&when)
MCRO_API auto GetThreadCheck(ENamedThreads::Type threadName) -> bool(*)()
MCRO_API void RunInGameThread(TUniqueFunction< void()> &&func)
Simply run a lambda function on the game thread but only use AsyncTask if it's not on the game thread...
MCRO_API bool IsInThread(ENamedThreads::Type threadName)
Returns true when called in the thread which is associated with the given ENamedThreads....
MCRO_API void EnqueueRenderCommand(TUniqueFunction< void(FRHICommandListImmediate &)> &&func)
Simply run a lambda function on the render thread but only use AsyncTask if it's not on the render th...
TFuture< Result > EnqueueRenderPromise(Function &&func)
Simply run a lambda function on the render thread but only use AsyncTask if it's not on the render th...
TFuture< Result > PromiseInGameThread(Function &&func)
Simply run a lambda function on the game thread but only use AsyncTask if it's not on the game thread...
TFuture< Result > PromiseInThread(ENamedThreads::Type threadName, Function &&func)
Simply run a lambda function on the selected thread but only use AsyncTask if it's not on the selecte...
MCRO_API void RunInThread(ENamedThreads::Type threadName, TUniqueFunction< void()> &&func)
Simply run a lambda function on the selected thread but only use AsyncTask if it's not on the selecte...