104 int32 PoolBucketIndex = 0;
105 int32 PoolBucketSize = 0;
107 template <
typename DynamicDataType>
121#if COUNTERSTRACE_ENABLED
126template <
typename DynamicDataType>
137#if COUNTERSTRACE_ENABLED
140 NumFreeBytes.fetch_sub(DynamicData->PoolBucketSize, std::memory_order_relaxed);
145 DynamicData->PoolBucketIndex = PoolBucketIndex;
156#if COUNTERSTRACE_ENABLED
159 GetBucket(DynamicData->PoolBucketIndex).Push(DynamicData);
165 int32 PoolBucketIndex = 0;
167 while (NumFreeBytes.load(std::memory_order_relaxed) >
GetPoolBudget())
187#if COUNTERSTRACE_ENABLED
201 return Buckets[BucketIndex];
204 std::atomic<int64> NumFreeBytes = 0;
207template <
typename DynamicDataType>
236template <
typename DynamicDataType>
314 virtual void TrimPool() = 0;
325template <
typename InMeshObjectType,
typename InMeshDynamicDataType>
358 : Channel(RHS.Channel)
366 Channel = RHS.Channel;
368 RHS.Channel =
nullptr;
375 checkf(!Channel,
TEXT(
"Call Release prior to destructing this handle"));
380 return Channel !=
nullptr;
383 template <
typename SkeletalMeshDynamicDataType>
408 template <
typename SkeletalMeshObjectType>
416 check(!bInAsyncPushCommandsRegion);
417 bInAsyncPushCommandsRegion =
true;
423 check(bInAsyncPushCommandsRegion);
424 bInAsyncPushCommandsRegion =
false;
425 PushCommandsTask.
Wait();
426 PushCommandsTask = {};
460 bool bSubmitting =
false;
461 bool bInAsyncPushCommandsRegion =
false;
467#define REGISTER_SKELETAL_MESH_UPDATE_BACKEND(SkeletalMeshUpdatePacketType) \
469 struct FSkeletalMeshUpdateChannel::TLookupPacket<typename SkeletalMeshUpdatePacketType::MeshObjectType> \
471 using Type = SkeletalMeshUpdatePacketType; \
474 struct FSkeletalMeshUpdateChannel::TLookupPacket<typename SkeletalMeshUpdatePacketType::MeshDynamicDataType> \
476 using Type = SkeletalMeshUpdatePacketType; \
478 FSkeletalMeshUpdateChannel::TBackend<SkeletalMeshUpdatePacketType> GSkeletalMeshUpdateChannelBackend_##SkeletalMeshUpdatePacketType;
486 struct FIndexAllocator
490 int32 NumAllocated()
const {
return Max - FreeList.Num(); }
499 enum class EType :
uint8
525 struct FDynamicDataList
532 template <
typename LambdaType>
539 std::atomic_int32_t NumAdds = 0;
540 std::atomic_int32_t NumUpdates = 0;
541 std::atomic_int32_t NumRemoves = 0;
542 std::atomic_int32_t
Num = 0;
549 int32 NumRemoves = 0;
550 int32 NumUpdates = 0;
557 FDynamicDataList UpdateList;
586 template <
typename T>
589 static_assert(std::is_same<T, void>::value,
"TLookupPacket: No specialization available for the given type!");
593 template <
typename SkeletalMeshUpdatePacketType>
599 checkf(!Instance,
TEXT(
"Multiple skeletal mesh update backends of the same type were instantiated. Only one is allowed at a time."));
606 static int32 GetGlobalListIndex()
608 checkf(Instance,
TEXT(
"Skeletal mesh backend instance was not instantiated."));
609 return Instance->GlobalListIndex;
630 template <
typename T>
636 template <
typename T>
653 checkf(Backend,
TEXT(
"Backend was released but the channel is still being used."));
654 return Backend->CreatePacket();
659 checkf(Backend,
TEXT(
"Backend was released but the channel is still being used."));
660 Backend->Replay(RHICmdList, *
this, Packet);
669 template <
typename SkeletalMeshUpdatePacketType>
677 , .NumRemoves = OpStream.NumRemoves
678 , .NumUpdates = OpStream.NumUpdates
682 FIndexAllocator IndexAllocator;
685 FSlotRegistry SlotRegistry;
686 FBackend* Backend =
nullptr;
692template <
typename SkeletalMeshUpdatePacketType>
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
@ INDEX_NONE
Definition CoreMiscDefines.h:150
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
ERHIPipeline
Definition RHIPipeline.h:13
ESkeletalMeshUpdateStage
Definition SkeletalMeshUpdater.h:242
CORE_API bool IsInGameThread()
Definition ThreadingBase.cpp:185
uint32 Size
Definition VulkanMemory.cpp:4034
Definition IDelegateInstance.h:14
Definition GPUSkinCache.h:126
Definition RenderGraphBuilder.h:49
Definition RHICommandList.h:3819
Definition RenderingThread.h:831
Definition SceneInterface.h:106
Definition SkeletalMeshUpdater.h:112
int32 GetBucketIndex(int32 NumTransforms) const
Definition SkeletalMeshUpdater.cpp:37
static int64 GetPoolBudget()
Definition SkeletalMeshUpdater.cpp:30
static constexpr int32 NumPoolBuckets
Definition SkeletalMeshUpdater.h:117
Definition SkeletalMeshUpdater.h:96
virtual ~FSkeletalMeshDynamicData()=default
Definition SkeletalRenderPublic.h:85
Definition SkeletalMeshUpdater.h:595
TBackend()
Definition SkeletalMeshUpdater.h:597
Definition SkeletalMeshUpdater.h:485
static TArray< FSkeletalMeshUpdateChannel > GetChannels()
Definition SkeletalMeshUpdater.cpp:169
static int32 GetChannelIndex()
Definition SkeletalMeshUpdater.h:631
ENGINE_API ~FSkeletalMeshUpdateChannel()
Definition SkeletalMeshUpdater.cpp:196
bool IsChannelFor() const
Definition SkeletalMeshUpdater.h:637
Definition SkeletalMeshUpdater.h:353
~FSkeletalMeshUpdateHandle()
Definition SkeletalMeshUpdater.h:373
bool Update(SkeletalMeshDynamicDataType *MeshDynamicData)
void Release()
Definition SkeletalMeshUpdater.inl:16
bool IsValid() const
Definition SkeletalMeshUpdater.h:378
FSkeletalMeshUpdateHandle(FSkeletalMeshUpdateHandle &&RHS)
Definition SkeletalMeshUpdater.h:357
FSkeletalMeshUpdateHandle()=default
FSkeletalMeshUpdateHandle & operator=(FSkeletalMeshUpdateHandle &&RHS)
Definition SkeletalMeshUpdater.h:364
Definition SkeletalMeshUpdater.h:257
FSceneInterface * Scene
Definition SkeletalMeshUpdater.h:306
virtual ~FSkeletalMeshUpdatePacket()=default
ERHIPipeline GPUSkinCachePipeline
Definition SkeletalMeshUpdater.h:308
virtual void ProcessStage_Inline(FRHICommandList &, UE::Tasks::FTaskEvent &TaskEvent)
Definition SkeletalMeshUpdater.h:282
void InvalidatePathTracedOutput()
Definition SkeletalMeshUpdater.h:289
virtual void ProcessStage_SkinCache(FRHICommandList &, UE::Tasks::FTaskEvent &TaskEvent)
Definition SkeletalMeshUpdater.h:279
FGPUSkinCache * GPUSkinCache
Definition SkeletalMeshUpdater.h:307
virtual void ProcessStage_MeshDeformer(FRHICommandList &, UE::Tasks::FTaskEvent &TaskEvent)
Definition SkeletalMeshUpdater.h:276
virtual void Init(const FInitializer &Initializer)
Definition SkeletalMeshUpdater.h:273
virtual void ProcessStage_Upload(FRHICommandList &)
Definition SkeletalMeshUpdater.h:285
bool IsSkinCacheForRayTracingSupported() const
Definition SkeletalMeshUpdater.h:296
Definition SkeletalMeshUpdater.h:398
ENGINE_API FSubmitTasks Submit(FRDGBuilder &GraphBuilder, ERHIPipeline GPUSkinCachePipeline)
Definition SkeletalMeshUpdater.cpp:501
ENGINE_API void Shutdown()
Definition SkeletalMeshUpdater.cpp:347
static bool IsEnabled()
Definition SkeletalMeshUpdater.cpp:25
ENGINE_API UE::Tasks::FTask AddPushCommandsTask(const UE::Tasks::FTask &PrerequisiteTask)
Definition SkeletalMeshUpdater.cpp:357
void EndAsyncPushCommands()
Definition SkeletalMeshUpdater.h:420
void BeginAsyncPushCommands()
Definition SkeletalMeshUpdater.h:413
static ENGINE_API void WaitForStage(FRDGBuilder &GraphBuilder, ESkeletalMeshUpdateStage Stage)
Definition SkeletalMeshUpdater.cpp:561
Definition ClosableMpscQueue.h:17
Definition ConcurrentLinearAllocator.h:571
Definition IntrusiveDoubleLinkedList.h:25
Definition IntrusiveDoubleLinkedList.h:175
Definition LockFreeList.h:910
Definition SkeletalMeshUpdater.h:128
void Release(DynamicDataType *DynamicData)
Definition SkeletalMeshUpdater.h:149
void Trim()
Definition SkeletalMeshUpdater.h:163
DynamicDataType * Acquire(int32 NumTransforms)
Definition SkeletalMeshUpdater.h:130
Definition SkeletalMeshUpdater.h:209
TSkeletalMeshDynamicData()=default
static void TrimPool()
Definition SkeletalMeshUpdater.h:216
static DynamicDataType * Acquire(int32 LODIndex)
Definition SkeletalMeshUpdater.h:221
static void Release(DynamicDataType *DynamicData)
Definition SkeletalMeshUpdater.h:226
void Reset()
Definition SkeletalMeshUpdater.h:233
Definition SkeletalMeshUpdater.h:327
InMeshObjectType MeshObjectType
Definition SkeletalMeshUpdater.h:329
InMeshDynamicDataType MeshDynamicDataType
Definition SkeletalMeshUpdater.h:330
void UpdateImmediate(FRHICommandList &RHICmdList, MeshObjectType *MeshObject, MeshDynamicDataType *MeshDynamicData)
Definition SkeletalMeshUpdater.h:339
void TrimPool() override
Definition SkeletalMeshUpdater.h:343
void Add(MeshObjectType *MeshObject, MeshDynamicDataType *MeshDynamicData)
Definition SkeletalMeshUpdater.h:336
Definition StaticArray.h:26
Definition UniquePtr.h:107
bool Wait(FTimespan Timeout) const
Definition Task.h:76
U16 Index
Definition radfft.cpp:71
Definition SkeletalMeshUpdater.h:569
int32 Num
Definition SkeletalMeshUpdater.h:571
TIntrusiveDoubleLinkedList< FBackend > List
Definition SkeletalMeshUpdater.h:570
Definition SkeletalMeshUpdater.h:260
int32 NumAdds
Definition SkeletalMeshUpdater.h:261
ERHIPipeline SkinCachePipeline
Definition SkeletalMeshUpdater.h:264
int32 NumRemoves
Definition SkeletalMeshUpdater.h:262
int32 NumUpdates
Definition SkeletalMeshUpdater.h:263
Definition SkeletalMeshUpdater.h:436
UE::Tasks::FTask Inline
Definition SkeletalMeshUpdater.h:439
UE::Tasks::FTask Filter
Definition SkeletalMeshUpdater.h:438
UE::Tasks::FTask SkinCache
Definition SkeletalMeshUpdater.h:441
UE::Tasks::FTask MeshDeformer
Definition SkeletalMeshUpdater.h:440
Definition SkeletalMeshUpdater.cpp:396