UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SkeletalRenderGPUSkin.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 SkeletalRenderGPUSkin.h: GPU skinned mesh object and resource definitions
5=============================================================================*/
6
7#pragma once
8
9#include "CoreMinimal.h"
11#include "RenderResource.h"
12#include "RayTracingGeometry.h"
13#include "ShaderParameters.h"
16#include "GlobalShader.h"
18#include "SkeletalMeshUpdater.h"
26#include "Animation/AnimBank.h"
27
28enum class EGPUSkinCacheEntryMode;
29class FGPUSkinCache;
34
36{
37 // Skinning is performed inline when the mesh is rendered in the mesh pass.
38 Inline,
39
40 // Skinning is performed by the GPU skin cache but falls back to the inline mode on a per-section basis if the skin cache is full.
42
43 // Skinning is performed by the mesh deformer graph.
45};
46
51class FDynamicSkelMeshObjectDataGPUSkin final : public TSkeletalMeshDynamicData<FDynamicSkelMeshObjectDataGPUSkin>
52{
54
56 {
57 Reset();
58 }
59
60 int32 Reset();
61
62public:
73 const FPrimitiveSceneProxy* SceneProxy,
82
86
90
94
96
97#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
100#endif
101
106
109#if RHI_RAYTRACING
110 int32 RayTracingLODIndex;
111#endif
121
127
130
133
136
139
142
150
155
158 {
159 CumulativeResourceSize.AddDedicatedSystemMemoryBytes(sizeof(*this));
160
161 CumulativeResourceSize.AddUnknownMemoryBytes(ReferenceToLocal.GetAllocatedSize());
162 CumulativeResourceSize.AddUnknownMemoryBytes(ActiveMorphTargets.GetAllocatedSize());
163 }
164
166
169
170#if RHI_RAYTRACING
171 uint8 bAnySegmentUsesWorldPositionOffset : 1;
172#endif
173
175};
176
179{
180 // Changes to this struct must be reflected in MorphTargets.usf!
183
185
192};
193
198{
199public:
207 , LODIdx(-1)
208 , SkelMeshRenderData(nullptr)
209 {
210 }
211
220 , LODIdx(InLODIdx)
221 , FeatureLevel(InFeatureLevel)
222 , SkelMeshRenderData(InSkelMeshRenderData)
223 {
224 check(SkelMeshRenderData);
225 check(SkelMeshRenderData->LODRenderData.IsValidIndex(LODIdx));
226 bUsesComputeShader = false;
227 }
231 virtual void InitRHI(FRHICommandListBase& RHICmdList) override;
232
236 virtual void ReleaseRHI() override;
237
239 {
241 {
242 UpdateRHI(RHICmdList);
243 }
244 }
245
249 FString GetFriendlyName() const { return TEXT("Morph target mesh vertices"); }
250
255 {
256 SIZE_T ResourceSize = sizeof(*this);
257
258 if (VertexBufferRHI)
259 {
260 // LOD of the skel mesh is used to find number of vertices in buffer
261 FSkeletalMeshLODRenderData& LodData = SkelMeshRenderData->LODRenderData[LODIdx];
262
263 // Create the buffer rendering resource
264 ResourceSize += LodData.GetNumVertices() * sizeof(FMorphGPUSkinVertex);
265 }
266
267 return ResourceSize;
268 }
269
271 {
272 // LOD of the skel mesh is used to find number of vertices in buffer
273 FSkeletalMeshLODRenderData& LodData = SkelMeshRenderData->LODRenderData[LODIdx];
274 // Create the buffer rendering resource
275 return LodData.GetNumVertices();
276 }
277
280
283
284 // @param guaranteed only to be valid if the vertex buffer is valid
286 {
287 return SRVValue;
288 }
289
290 // @param guaranteed only to be valid if the vertex buffer is valid
292 {
293 return UAVValue;
294 }
295
296 FSkeletalMeshLODRenderData* GetLODRenderData() const { return &SkelMeshRenderData->LODRenderData[LODIdx]; }
297
298 // section ids that are using this Morph buffer
300protected:
301 // guaranteed only to be valid if the vertex buffer is valid
303
304 // guaranteed only to be valid if the vertex buffer is valid
306
308
309private:
311 int32 LODIdx;
312
313 ERHIFeatureLevel::Type FeatureLevel;
314
315 // parent mesh containing the source data, never 0
316 FSkeletalMeshRenderData* SkelMeshRenderData;
317
319};
320
325{
326public:
332
334 {
335 // Note that destruction of this class must occur on the render thread if InitResources has been called!
336 // This is normally pointed to by FSkeletalMeshObjectGPUSkin, which is defer deleted on the render thread.
337 if (bInitializedResources)
338 {
340 }
341 }
342
343 void InitResources(FName OwnerName);
344 void ReleaseResources();
345 SIZE_T GetResourceSize() const;
346 void EnableDoubleBuffer(FRHICommandListBase& RHICmdList);
347 bool IsInitialized() const { return bInitializedResources; }
348 bool IsDoubleBuffered() const { return bDoubleBuffer; }
349 void SetUpdatedFrameNumber(uint32 FrameNumber) { UpdatedFrameNumber = FrameNumber; }
350 uint32 GetUpdatedFrameNumber() const { return UpdatedFrameNumber; }
351 void SetCurrentRevisionNumber(uint32 RevisionNumber);
352 const FMorphVertexBuffer& GetMorphVertexBufferForReading(bool bPrevious) const;
354
355private:
357 FMorphVertexBuffer MorphVertexBuffers[2];
359 bool bInitializedResources = false;
361 bool bDoubleBuffer = false;
362
363 // 0 / 1 to index into MorphVertexBuffer
364 uint32 CurrentBuffer = 0;
365 // RevisionNumber Tracker
366 uint32 PreviousRevisionNumber = 0;
367 uint32 CurrentRevisionNumber = 0;
368 // Frame number of the morph vertex buffer that is last updated
369 uint32 UpdatedFrameNumber = 0;
370};
371
376{
377public:
382
383 //~ Begin FSkeletalMeshObject Interface
384 virtual void InitResources(const FSkinnedMeshSceneProxyDesc& InMeshDesc) override;
385 virtual void ReleaseResources() override;
388 virtual const FVertexFactory* GetSkinVertexFactory(const FSceneView* View, int32 LODIndex,int32 ChunkIdx, ESkinVertexFactoryMode VFMode = ESkinVertexFactoryMode::Default) const override;
389 virtual const FVertexFactory* GetStaticSkinVertexFactory(int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override;
390 virtual TArray<FTransform>* GetComponentSpaceTransforms() const override;
393 virtual bool GetCachedGeometry(FRDGBuilder& GraphBuilder, FCachedGeometry& OutCachedGeometry) const override;
394
396
397 virtual bool IsGPUSkinMesh() const override { return true; }
398
399 virtual int32 GetDynamicBoundsStartOffset(int32 LODIndex) const override;
400
401#if RHI_RAYTRACING
403 FRayTracingGeometry RayTracingGeometry;
404 FRWBuffer RayTracingDynamicVertexBuffer;
405
406 // GetRayTracingGeometry()->IsInitialized() is checked as a workaround for UE-92634. FSkeletalMeshSceneProxy's resources may have already been released, but proxy has not removed yet)
407 FRayTracingGeometry* GetRayTracingGeometry() { return RayTracingGeometry.HasValidInitializer() && RayTracingGeometry.IsInitialized() ? & RayTracingGeometry : nullptr; }
408 const FRayTracingGeometry* GetRayTracingGeometry() const { return RayTracingGeometry.HasValidInitializer() && RayTracingGeometry.IsInitialized() ? & RayTracingGeometry : nullptr; }
409
411 FRWBuffer* GetRayTracingDynamicVertexBuffer() { return RayTracingDynamicVertexBuffer.NumBytes > 0 ? &RayTracingDynamicVertexBuffer : nullptr; }
412
413 virtual int32 GetRayTracingLOD() const override
414 {
415 if (DynamicData)
416 {
417 return DynamicData->RayTracingLODIndex;
418 }
419 else
420 {
421 return 0;
422 }
423 }
424
431 virtual void UpdateRayTracingGeometry(FRHICommandListBase& RHICmdList, FSkeletalMeshLODRenderData& LODModel, uint32 LODIndex, TArray<FBufferRHIRef>& VertexBuffers) override;
432
433#endif // RHI_RAYTRACING
434
435 virtual int32 GetLOD() const override
436 {
437 if(DynamicData)
438 {
439 return DynamicData->LODIndex;
440 }
441 else
442 {
443 return 0;
444 }
445 }
446
447 virtual bool HaveValidDynamicData() const override
448 {
449 return ( DynamicData!=NULL );
450 }
451
453 {
454 CumulativeResourceSize.AddDedicatedSystemMemoryBytes(sizeof(*this));
455
456 if(DynamicData)
457 {
459 }
460
461 CumulativeResourceSize.AddUnknownMemoryBytes(LODs.GetAllocatedSize());
462
463 // include extra data from LOD
464 for (int32 I=0; I<LODs.Num(); ++I)
465 {
466 LODs[I].GetResourceSizeEx(CumulativeResourceSize);
467 }
468 }
469 //~ End FSkeletalMeshObject Interface
470
473
475
480 FGPUBaseSkinVertexFactory const* GetBaseSkinVertexFactory(int32 LODIndex, int32 ChunkIdx) const;
481
495
496 FMatrix GetTransform() const;
497 virtual void SetTransform(const FMatrix& InNewLocalToWorld, uint32 FrameNumber) override;
498 virtual void RefreshClothingTransforms(const FMatrix& InNewLocalToWorld, uint32 FrameNumber) override;
500
502
504 {
505 return LODs[LODIndex].GPUSkinTechnique;
506 }
507
508private:
510
512 static void CreateVertexFactory(
513 FRHICommandList& RHICmdList,
515 TUniquePtr<FGPUSkinPassthroughVertexFactory>* PassthroughVertexFactory,
519 uint32 NumBones,
520 uint32 BoneOffset,
521 uint32 BaseVertexIndex,
522 bool bUsedForPassthroughVertexFactory);
523
524 static void UpdateRayTracingGeometry_Internal(
526 FRayTracingGeometry& RayTracingGeometry, bool bAnySegmentUsesWorldPositionOffset, FSkeletalMeshObject* MeshObject);
527
531 class FVertexFactoryData
532 {
533 public:
534 FVertexFactoryData() {}
535
538
540 TUniquePtr<FGPUSkinPassthroughVertexFactory> PassthroughVertexFactory;
541
542 uint32 NumVertices;
543
551 void InitVertexFactories(
552 FRHICommandList& RHICmdList,
553 const FVertexFactoryBuffers& VertexBuffers,
554 const TArray<FSkelMeshRenderSection>& Sections,
557 ESkeletalMeshGPUSkinTechnique GPUSkinTechnique);
558
559 void ReleaseVertexFactories();
560
562 void UpdateVertexFactoryData(const FVertexFactoryBuffers& VertexBuffers);
563
564 uint64 GetResourceSize() const
565 {
566 return VertexFactories.GetAllocatedSize();
567 }
568
569 private:
570 FVertexFactoryData(const FVertexFactoryData&);
571 FVertexFactoryData& operator=(const FVertexFactoryData&);
572 };
573
575 struct FSkeletalMeshObjectLOD
576 {
578 : SkelMeshRenderData(InSkelMeshRenderData)
579 , LODIndex(InLOD)
580 , FeatureLevel(InFeatureLevel)
581 , MeshObjectWeightBuffer(nullptr)
582 , MeshObjectWeightBuffer_RenderThread(nullptr)
583 , MeshObjectColorBuffer(nullptr)
584 , GPUSkinTechnique(InSkinTechnique)
585 {
587 {
588 MorphVertexBufferPool = InRecreateBufferPool;
589 }
590 else
591 {
592 MorphVertexBufferPool = new FMorphVertexBufferPool(InSkelMeshRenderData, LODIndex, FeatureLevel);
593 }
594 }
595
601 void InitResources(
602 FGPUSkinCache* GPUSkinCache,
603 const FSkelMeshObjectLODInfo& MeshLODInfo,
605 ERHIFeatureLevel::Type FeatureLevel,
607
611 void ReleaseResources(FGPUSkinCache* GPUSkinCache);
612
618 void InitMorphResources(const FSkelMeshObjectLODInfo& MeshLODInfo, ERHIFeatureLevel::Type FeatureLevel);
619
623 void GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize)
624 {
625 CumulativeResourceSize.AddUnknownMemoryBytes(MorphVertexBufferPool->GetResourceSize());
626 CumulativeResourceSize.AddUnknownMemoryBytes(GPUSkinVertexFactories.GetResourceSize());
627 }
628
629 FSkeletalMeshRenderData* SkelMeshRenderData;
630 // index into FSkeletalMeshRenderData::LODRenderData[]
631 int32 LODIndex;
632
633 ERHIFeatureLevel::Type FeatureLevel;
634
636 TRefCountPtr<FMorphVertexBufferPool> MorphVertexBufferPool;
637
639 FVertexFactoryData GPUSkinVertexFactories;
640
642 const FSkinWeightVertexBuffer* MeshObjectWeightBuffer;
643 const FSkinWeightVertexBuffer* MeshObjectWeightBuffer_RenderThread;
644
646 FColorVertexBuffer* MeshObjectColorBuffer;
647
649 FMeshDeformerGeometry DeformerGeometry;
650
652 ESkeletalMeshGPUSkinTechnique GPUSkinTechnique;
653
655 int32 DynamicBoundsStartOffset = INDEX_NONE;
656 int32 DynamicBoundsNumSections = 0;
657
664 void UpdateMorphVertexBufferCPU(FRHICommandList& RHICmdList, const FMorphTargetWeightMap& InActiveMorphTargets, const TArray<float>& MorphTargetWeights, const TArray<int32>& SectionIdsUseByActiveMorphTargets,
665 bool bGPUSkinCacheEnabled, FMorphVertexBuffer& MorphVertexBuffer);
666
667 void UpdateMorphVertexBufferGPU(FRHICommandList& RHICmdList, const TArray<float>& MorphTargetWeights, const FMorphTargetVertexInfoBuffers& MorphTargetVertexInfoBuffers,
668 const TArray<int32>& SectionIdsUseByActiveMorphTargets, const FName& OwnerName, EGPUSkinCacheEntryMode Mode, FMorphVertexBuffer& MorphVertexBuffer,
670
671 void UpdateSkinWeights(const FSkelMeshComponentLODInfo* CompLODInfo);
672
678 void GetVertexBuffers(FVertexFactoryBuffers& OutVertexBuffers, FSkeletalMeshLODRenderData& LODData);
679
680 // Temporary arrays used on UpdateMorphVertexBuffer(); these grow to the max and are not thread safe.
681 static TArray<float> MorphAccumulatedWeightArray;
682 };
683
686
688 FDynamicSkelMeshObjectDataGPUSkin* DynamicData = nullptr;
689
692
693 void InitMorphResources();
694
695 void UpdateBufferData(FRHICommandList& RHICmdList, EGPUSkinCacheEntryMode Mode);
696 void ProcessUpdatedDynamicData(FRHICommandList& RHICmdList, EGPUSkinCacheEntryMode Mode);
697 void UpdateMorphVertexBuffer(FRHICommandList& RHICmdList);
698
699 bool IsRayTracingSkinCacheUpdateNeeded() const
700 {
701#if RHI_RAYTRACING
702 return DynamicData->RayTracingLODIndex != -1
706#else
707 return false;
708#endif
709 }
710
711 bool IsSkinCacheEnabled(EGPUSkinCacheEntryMode Mode) const;
712
713 FSkeletalMeshUpdateHandle UpdateHandle;
714
715 FGPUSkinCache* GPUSkinCache = nullptr;
716 FMorphVertexBuffer* MorphVertexBuffer = nullptr;
717 uint32 LastRayTracingBoneTransformUpdate = INDEX_NONE;
718 bool bMorphResourcesInitialized = false;
719 bool bMorphNeedsUpdate = false;
720
723};
724
726
728{
729public:
734
736
737 virtual void InitResources(const FSkinnedMeshSceneProxyDesc& InMeshDesc) override;
738 virtual void ReleaseResources() override;
739
740 virtual void Update(
741 int32 LODIndex,
746 const TArray<float>& MorphTargetWeights,
747 EPreviousBoneTransformUpdateMode PreviousBoneTransformUpdateMode,
749 {}
750
752
753 virtual const FVertexFactory* GetSkinVertexFactory(const FSceneView* View, int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override;
754
755 virtual const FVertexFactory* GetStaticSkinVertexFactory(int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override;
756
757 virtual TArray<FTransform>* GetComponentSpaceTransforms() const override { return nullptr; }
758
759 virtual TConstArrayView<FMatrix44f> GetReferenceToLocalMatrices() const override { return {}; }
760
761 virtual TConstArrayView<FMatrix44f> GetPrevReferenceToLocalMatrices() const override { return {}; }
762
763 virtual int32 GetLOD() const override { return 0; }
764
765 virtual bool HaveValidDynamicData() const override { return false; }
766
768
770
771 virtual bool IsGPUSkinMesh() const override { return true; }
772
773#if RHI_RAYTRACING
774 // TODO: Support skinning in ray tracing (currently representing with static geometry)
775 virtual const FRayTracingGeometry* GetStaticRayTracingGeometry() const override;
776#endif
777
778private:
779 struct FSkeletalMeshObjectLOD
780 {
782 FLocalVertexFactory LocalVertexFactory;
784 int32 LODIndex;
785 ERHIFeatureLevel::Type FeatureLevel;
786 bool bInitialized = false;
787 bool bStaticRayTracingGeometryInitialized = false;
788
790
791 void InitResources(const FSkelMeshComponentLODInfo* InLODInfo);
792 void ReleaseResources();
793 };
794
795 TObjectPtr<UTransformProviderData> TransformProvider;
797};
798
800{
801public:
803
806
808
809 void SetParameters(
811 const FVector4& LocalScale,
812 const FMorphTargetVertexInfoBuffers& MorphTargetVertexInfoBuffers,
813 FMorphVertexBuffer& MorphVertexBuffer,
814 uint32 NumGroups,
817 float Weights[MorphTargetDispatchBatchSize]);
818
819 void Dispatch(FRHICommandList& RHICmdList, uint32 Size);
821
823
824protected:
826
834
836};
837
#define NULL
Definition oodle2base.h:134
#define check(expr)
Definition AssertionMacros.h:314
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
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
return true
Definition ExternalRpcRegistry.cpp:601
EGPUSkinCacheEntryMode
Definition GPUSkinCache.h:104
ESkinVertexFactoryMode
Definition SkeletalMeshTypes.h:51
ESkeletalMeshGPUSkinTechnique
Definition SkeletalRenderGPUSkin.h:36
EPreviousBoneTransformUpdateMode
Definition SkeletalRenderPublic.h:62
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ColorVertexBuffer.h:16
Definition SkeletalRenderGPUSkin.h:52
FMatrix ClothObjectLocalToWorld
Definition SkeletalRenderGPUSkin.h:135
TConstArrayView< FMatrix44f > GetReferenceToLocal(EGPUSkinCacheEntryMode Mode) const
Definition SkeletalRenderGPUSkin.cpp:864
FExternalMorphSets ExternalMorphSets
Definition SkeletalRenderGPUSkin.h:129
void BuildBoneTransforms(FDynamicSkelMeshObjectDataGPUSkin *PreviousDynamicData)
Definition SkeletalRenderGPUSkin.cpp:3092
FMorphTargetWeightMap ActiveMorphTargets
Definition SkeletalRenderGPUSkin.h:113
int32 GetLODIndex(EGPUSkinCacheEntryMode Mode) const
Definition SkeletalRenderGPUSkin.cpp:875
int32 NumWeightedActiveMorphTargets
Definition SkeletalRenderGPUSkin.h:120
TArray< FTransform > MeshComponentSpaceTransforms
Definition SkeletalRenderGPUSkin.h:99
TMap< int32, FClothSimulData > ClothingSimData
Definition SkeletalRenderGPUSkin.h:132
static bool IsMorphUpdateNeeded(const FDynamicSkelMeshObjectDataGPUSkin *Previous, const FDynamicSkelMeshObjectDataGPUSkin *Current)
Definition SkeletalRenderGPUSkin.cpp:798
TConstArrayView< FMatrix44f > GetPreviousReferenceToLocal(EGPUSkinCacheEntryMode Mode) const
Definition SkeletalRenderGPUSkin.cpp:853
bool ActiveMorphTargetsEqual(const FMorphTargetWeightMap &InCompareActiveMorphTargets, const TArray< float > &CompareMorphTargetWeights) const
Definition SkeletalRenderGPUSkin.cpp:3111
TArray< FMatrix44f > PreviousReferenceToLocalForRayTracing
Definition SkeletalRenderGPUSkin.h:89
bool IsRequiredUpdate() const
Definition SkeletalRenderGPUSkin.h:151
float ClothBlendWeight
Definition SkeletalRenderGPUSkin.h:141
FExternalMorphWeightData ExternalMorphWeightData
Definition SkeletalRenderGPUSkin.h:126
ESkeletalMeshGPUSkinTechnique GPUSkinTechnique
Definition SkeletalRenderGPUSkin.h:168
EPreviousBoneTransformUpdateMode PreviousBoneTransformUpdateMode
Definition SkeletalRenderGPUSkin.h:105
TArray< FMatrix44f > ReferenceToLocalForRayTracing
Definition SkeletalRenderGPUSkin.h:85
TArray< int32 > SectionIdsUseByActiveMorphTargets
Definition SkeletalRenderGPUSkin.h:117
void InitDynamicSkelMeshObjectDataGPUSkin(const FSkinnedMeshSceneProxyDynamicData &InDynamicData, const FPrimitiveSceneProxy *SceneProxy, const USkinnedAsset *InSkinnedAsset, FSkeletalMeshRenderData *InSkeletalMeshRenderData, FSkeletalMeshObjectGPUSkin *InMeshObject, int32 InLODIndex, const FMorphTargetWeightMap &InActiveMorphTargets, const TArray< float > &InMorphTargetWeights, EPreviousBoneTransformUpdateMode PreviousBoneTransformUpdateMode, const FExternalMorphWeightData &InExternalMorphWeightData)
Definition SkeletalRenderGPUSkin.cpp:2914
TArray< int32 > SectionIdsUseByActiveMorphTargetsForRayTracing
Definition SkeletalRenderGPUSkin.h:118
FMatrix LocalToWorld
Definition SkeletalRenderGPUSkin.h:138
TArray< float > MorphTargetWeights
Definition SkeletalRenderGPUSkin.h:115
void GetResourceSizeEx(FResourceSizeEx &CumulativeResourceSize)
Definition SkeletalRenderGPUSkin.h:157
int32 LODIndex
Definition SkeletalRenderGPUSkin.h:108
TArray< FMatrix44f > PreviousReferenceToLocal
Definition SkeletalRenderGPUSkin.h:88
TArray< FMatrix44f > ReferenceToLocal
Definition SkeletalRenderGPUSkin.h:84
uint8 bRecreating
Definition SkeletalRenderGPUSkin.h:174
uint32 RevisionNumber
Definition SkeletalRenderGPUSkin.h:103
uint32 PreviousRevisionNumber
Definition SkeletalRenderGPUSkin.h:104
uint32 BoneTransformFrameNumber
Definition SkeletalRenderGPUSkin.h:102
Definition GPUSkinVertexFactory.h:202
Definition SkeletalRenderGPUSkin.h:839
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters &Parameters)
Definition SkeletalRenderGPUSkin.cpp:1572
void UnsetParameters(FRHIBatchedShaderUnbinds &BatchedUnbinds)
Definition SkeletalRenderGPUSkin.cpp:1590
void Dispatch(FRHICommandList &RHICmdList, uint32 NumVertices)
Definition SkeletalRenderGPUSkin.cpp:1584
LAYOUT_FIELD(FShaderParameter, NumVerticesParameter)
DECLARE_SHADER_TYPE(FGPUMorphNormalizeCS, Global)
LAYOUT_FIELD(FShaderParameter, PositionScaleParameter)
LAYOUT_FIELD(FShaderResourceParameter, MorphVertexBufferParameter)
void SetParameters(FRHIBatchedShaderParameters &BatchedParameters, const FVector4 &LocalScale, const FMorphTargetVertexInfoBuffers &MorphTargetVertexInfoBuffers, FMorphVertexBuffer &MorphVertexBuffer, uint32 NumVertices)
Definition SkeletalRenderGPUSkin.cpp:1577
Definition SkeletalRenderGPUSkin.h:800
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters &Parameters)
Definition SkeletalRenderGPUSkin.cpp:1555
LAYOUT_FIELD(FShaderResourceParameter, MorphVertexBufferParameter)
LAYOUT_FIELD(FShaderParameter, MorphTargetWeightsParameter)
LAYOUT_FIELD(FShaderParameter, PrecisionParameter)
LAYOUT_FIELD(FShaderResourceParameter, MorphDataBufferParameter)
void Dispatch(FRHICommandList &RHICmdList, uint32 Size)
Definition SkeletalRenderGPUSkin.cpp:1544
LAYOUT_FIELD(FShaderParameter, NumGroupsParameter)
LAYOUT_FIELD(FShaderParameter, MorphTargetGroupOffsetsParameter)
void UnsetParameters(FRHIBatchedShaderUnbinds &BatchedUnbinds)
Definition SkeletalRenderGPUSkin.cpp:1550
static const uint32 MorphTargetDispatchBatchSize
Definition SkeletalRenderGPUSkin.h:807
DECLARE_SHADER_TYPE(FGPUMorphUpdateCS, Global)
LAYOUT_FIELD(FShaderParameter, OffsetAndSizeParameter)
LAYOUT_FIELD(FShaderParameter, PositionScaleParameter)
void SetParameters(FRHIBatchedShaderParameters &BatchedParameters, const FVector4 &LocalScale, const FMorphTargetVertexInfoBuffers &MorphTargetVertexInfoBuffers, FMorphVertexBuffer &MorphVertexBuffer, uint32 NumGroups, uint32 BatchOffsets[MorphTargetDispatchBatchSize], uint32 GroupOffsets[MorphTargetDispatchBatchSize], float Weights[MorphTargetDispatchBatchSize])
Definition SkeletalRenderGPUSkin.cpp:1520
LAYOUT_FIELD(FShaderParameter, MorphTargetBatchOffsetsParameter)
Definition GPUSkinCache.h:126
EVertexAttributeFlags
Definition GPUSkinVertexFactory.h:808
Definition GlobalShader.h:269
Definition SkeletalRenderGPUSkin.h:728
virtual TConstArrayView< FMatrix44f > GetReferenceToLocalMatrices() const override
Definition SkeletalRenderGPUSkin.h:759
virtual int32 GetLOD() const override
Definition SkeletalRenderGPUSkin.h:763
virtual void ReleaseResources() override
Definition SkeletalRenderGPUSkin.cpp:2693
virtual bool HaveValidDynamicData() const override
Definition SkeletalRenderGPUSkin.h:765
virtual TArray< FTransform > * GetComponentSpaceTransforms() const override
Definition SkeletalRenderGPUSkin.h:757
FInstancedSkeletalMeshObjectGPUSkin(USkinnedMeshComponent *InComponent, FSkeletalMeshRenderData *InRenderData, ERHIFeatureLevel::Type InFeatureLevel)
virtual bool IsGPUSkinMesh() const override
Definition SkeletalRenderGPUSkin.h:771
virtual FSkinningSceneExtensionProxy * CreateSceneExtensionProxy(const USkinnedAsset *InSkinnedAsset, bool bAllowScaling) override
Definition SkeletalRenderGPUSkin.cpp:2865
virtual const FVertexFactory * GetStaticSkinVertexFactory(int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override
Definition SkeletalRenderGPUSkin.cpp:2729
virtual void UpdateSkinWeightBuffer(const TArrayView< const FSkelMeshComponentLODInfo > InLODInfo) override
Definition SkeletalRenderGPUSkin.h:769
virtual void Update(int32 LODIndex, const FSkinnedMeshSceneProxyDynamicData &InDynamicData, const FPrimitiveSceneProxy *InSceneProxy, const USkinnedAsset *InSkinnedAsset, const FMorphTargetWeightMap &InActiveMorphTargets, const TArray< float > &MorphTargetWeights, EPreviousBoneTransformUpdateMode PreviousBoneTransformUpdateMode, const FExternalMorphWeightData &InExternalMorphWeightData) override
Definition SkeletalRenderGPUSkin.h:740
virtual void InitResources(const FSkinnedMeshSceneProxyDesc &InMeshDesc) override
Definition SkeletalRenderGPUSkin.cpp:2673
virtual void GetResourceSizeEx(FResourceSizeEx &CumulativeResourceSize) override
Definition SkeletalRenderGPUSkin.cpp:2709
virtual const FVertexFactory * GetSkinVertexFactory(const FSceneView *View, int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override
Definition SkeletalRenderGPUSkin.cpp:2715
virtual TConstArrayView< FMatrix44f > GetPrevReferenceToLocalMatrices() const override
Definition SkeletalRenderGPUSkin.h:761
Definition LocalVertexFactory.h:51
Definition MeshDeformerGeometry.h:12
Definition MorphTargetVertexInfoBuffers.h:14
Definition SkeletalRenderGPUSkin.h:325
void InitResources(FName OwnerName)
Definition SkeletalRenderGPUSkin.cpp:227
FMorphVertexBuffer & GetMorphVertexBufferForWriting()
Definition SkeletalRenderGPUSkin.cpp:310
void EnableDoubleBuffer(FRHICommandListBase &RHICmdList)
Definition SkeletalRenderGPUSkin.cpp:260
bool IsInitialized() const
Definition SkeletalRenderGPUSkin.h:347
const FMorphVertexBuffer & GetMorphVertexBufferForReading(bool bPrevious) const
Definition SkeletalRenderGPUSkin.cpp:283
bool IsDoubleBuffered() const
Definition SkeletalRenderGPUSkin.h:348
void ReleaseResources()
Definition SkeletalRenderGPUSkin.cpp:244
uint32 GetUpdatedFrameNumber() const
Definition SkeletalRenderGPUSkin.h:350
void SetUpdatedFrameNumber(uint32 FrameNumber)
Definition SkeletalRenderGPUSkin.h:349
~FMorphVertexBufferPool()
Definition SkeletalRenderGPUSkin.h:333
void SetCurrentRevisionNumber(uint32 RevisionNumber)
Definition SkeletalRenderGPUSkin.cpp:269
FMorphVertexBufferPool(FSkeletalMeshRenderData *InSkelMeshRenderData, int32 InLOD, ERHIFeatureLevel::Type InFeatureLevel)
Definition SkeletalRenderGPUSkin.h:327
SIZE_T GetResourceSize() const
Definition SkeletalRenderGPUSkin.cpp:252
Definition SkeletalRenderGPUSkin.h:198
bool bNeedsInitialClear
Definition SkeletalRenderGPUSkin.h:282
FUnorderedAccessViewRHIRef UAVValue
Definition SkeletalRenderGPUSkin.h:305
FMorphVertexBuffer()
Definition SkeletalRenderGPUSkin.h:203
FString GetFriendlyName() const
Definition SkeletalRenderGPUSkin.h:249
FRHIShaderResourceView * GetSRV() const
Definition SkeletalRenderGPUSkin.h:285
FSkeletalMeshLODRenderData * GetLODRenderData() const
Definition SkeletalRenderGPUSkin.h:296
void RecreateResourcesIfRequired(FRHICommandListBase &RHICmdList, bool bInUsesComputeShader)
Definition SkeletalRenderGPUSkin.h:238
SIZE_T GetNumVerticies() const
Definition SkeletalRenderGPUSkin.h:270
bool bUsesComputeShader
Definition SkeletalRenderGPUSkin.h:307
virtual void ReleaseRHI() override
Definition SkeletalRenderGPUSkin.cpp:217
bool bHasBeenUpdated
Definition SkeletalRenderGPUSkin.h:279
FMorphVertexBuffer(FSkeletalMeshRenderData *InSkelMeshRenderData, int32 InLODIdx, ERHIFeatureLevel::Type InFeatureLevel)
Definition SkeletalRenderGPUSkin.h:217
FRHIUnorderedAccessView * GetUAV() const
Definition SkeletalRenderGPUSkin.h:291
SIZE_T GetResourceSize() const
Definition SkeletalRenderGPUSkin.h:254
virtual void InitRHI(FRHICommandListBase &RHICmdList) override
Definition SkeletalRenderGPUSkin.cpp:175
FShaderResourceViewRHIRef SRVValue
Definition SkeletalRenderGPUSkin.h:302
TArray< int32 > SectionIds
Definition SkeletalRenderGPUSkin.h:299
Definition NameTypes.h:617
Definition PrimitiveSceneProxy.h:296
Definition RenderGraphBuilder.h:49
Definition RHICommandList.h:455
Definition RHICommandList.h:3819
Definition RHIResources.h:3304
Definition RHIResources.h:3294
Definition RayTracingGeometry.h:31
bool IsInitialized() const
Definition RenderResource.h:114
RENDERCORE_API void UpdateRHI(FRHICommandListBase &RHICmdList)
Definition RenderResource.cpp:225
Definition SceneView.h:1425
Definition ShaderParameters.h:56
Definition ShaderParameters.h:87
Definition SkeletalMeshDeformerHelpers.h:15
Definition SkeletalMeshLODRenderData.h:128
uint32 GetNumVertices() const
Definition SkeletalMeshLODRenderData.h:263
Definition SkeletalRenderGPUSkin.h:376
bool IsExternalMorphSetActive(int32 MorphSetID, const FExternalMorphSet &MorphSet) const
Definition SkeletalRenderGPUSkin.cpp:1306
virtual TConstArrayView< FMatrix44f > GetReferenceToLocalMatrices() const override
Definition SkeletalRenderGPUSkin.cpp:2536
virtual const FVertexFactory * GetStaticSkinVertexFactory(int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode) const override
Definition SkeletalRenderGPUSkin.cpp:1925
const FSkinWeightVertexBuffer * GetSkinWeightVertexBuffer(int32 LODIndex) const
Definition SkeletalRenderGPUSkin.cpp:1948
virtual int32 GetDynamicBoundsStartOffset(int32 LODIndex) const override
Definition SkeletalRenderGPUSkin.cpp:2649
virtual void UpdateSkinWeightBuffer(const TArrayView< const FSkelMeshComponentLODInfo > InLODInfo) override
Definition SkeletalRenderGPUSkin.cpp:768
virtual bool IsGPUSkinMesh() const override
Definition SkeletalRenderGPUSkin.h:397
FMatrix GetTransform() const
Definition SkeletalRenderGPUSkin.cpp:1954
FMeshDeformerGeometry & GetDeformerGeometry(int32 LODIndex)
Definition SkeletalRenderGPUSkin.cpp:2554
ESkeletalMeshGPUSkinTechnique GetGPUSkinTechnique(int32 LODIndex)
Definition SkeletalRenderGPUSkin.h:503
virtual ~FSkeletalMeshObjectGPUSkin()
Definition SkeletalRenderGPUSkin.cpp:598
virtual TArray< FTransform > * GetComponentSpaceTransforms() const override
Definition SkeletalRenderGPUSkin.cpp:2522
void UpdateDynamicData_RenderThread(FRHICommandList &RHICmdList, FDynamicSkelMeshObjectDataGPUSkin *InDynamicData)
Definition SkeletalRenderGPUSkin.cpp:813
FGPUBaseSkinVertexFactory const * GetBaseSkinVertexFactory(int32 LODIndex, int32 ChunkIdx) const
Definition SkeletalRenderGPUSkin.cpp:1943
virtual void ReleaseResources() override
Definition SkeletalRenderGPUSkin.cpp:667
virtual void InitResources(const FSkinnedMeshSceneProxyDesc &InMeshDesc) override
Definition SkeletalRenderGPUSkin.cpp:607
static void GetUsedVertexFactoryData(FSkeletalMeshRenderData *SkelMeshRenderData, int32 InLOD, USkinnedMeshComponent *SkinnedMeshComponent, FSkelMeshRenderSection &RenderSection, ERHIFeatureLevel::Type InFeatureLevel, FPSOPrecacheVertexFactoryDataList &VertexFactoryDataList)
Definition SkeletalRenderGPUSkin.cpp:2299
virtual bool HaveValidDynamicData() const override
Definition SkeletalRenderGPUSkin.h:447
virtual const FVertexFactory * GetSkinVertexFactory(const FSceneView *View, int32 LODIndex, int32 ChunkIdx, ESkinVertexFactoryMode VFMode=ESkinVertexFactoryMode::Default) const override
Definition SkeletalRenderGPUSkin.cpp:1879
virtual void GetResourceSizeEx(FResourceSizeEx &CumulativeResourceSize) override
Definition SkeletalRenderGPUSkin.h:452
virtual void SetTransform(const FMatrix &InNewLocalToWorld, uint32 FrameNumber) override
Definition SkeletalRenderGPUSkin.cpp:1963
virtual int32 GetLOD() const override
Definition SkeletalRenderGPUSkin.h:435
virtual bool GetCachedGeometry(FRDGBuilder &GraphBuilder, FCachedGeometry &OutCachedGeometry) const override
Definition SkeletalRenderGPUSkin.cpp:2559
virtual TConstArrayView< FMatrix44f > GetPrevReferenceToLocalMatrices() const override
Definition SkeletalRenderGPUSkin.cpp:2541
virtual void RefreshClothingTransforms(const FMatrix &InNewLocalToWorld, uint32 FrameNumber) override
Definition SkeletalRenderGPUSkin.cpp:1971
Definition SkeletalRenderNanite.h:105
Definition SkeletalRenderPublic.h:85
ERHIFeatureLevel::Type FeatureLevel
Definition SkeletalRenderPublic.h:449
FSkeletalMeshRenderData & GetSkeletalMeshRenderData() const
Definition SkeletalRenderPublic.h:289
Definition SkeletalMeshRenderData.h:17
TIndirectArray< FSkeletalMeshLODRenderData > LODRenderData
Definition SkeletalMeshRenderData.h:20
bool bSupportRayTracing
Definition SkeletalMeshRenderData.h:44
Definition SkeletalMeshUpdater.h:353
Definition SkeletalRenderGPUSkin.cpp:318
Definition SkeletalMeshUpdater.h:398
Definition SkeletalMeshVertexClothBuffer.h:15
Definition SkinWeightVertexBuffer.h:364
Definition SkinningSceneExtensionProxy.h:17
Definition RefCounting.h:283
Definition RenderResource.h:474
FBufferRHIRef VertexBufferRHI
Definition RenderResource.h:489
Definition VertexFactory.h:661
Definition ArrayView.h:139
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T GetAllocatedSize(void) const
Definition Array.h:1059
UE_FORCEINLINE_HINT bool IsValidIndex(int32 Index) const
Definition IndirectArray.h:408
Definition SkeletalMeshUpdater.h:128
Definition SkeletalMeshUpdater.h:209
Definition UniquePtr.h:107
Definition SkinnedAsset.h:47
Definition SkinnedMeshComponent.h:258
Type
Definition RHIFeatureLevel.h:20
@ false
Definition radaudio_common.h:23
Definition CachedGeometry.h:16
Definition ExternalMorphSet.h:10
Definition ExternalMorphSet.h:42
Definition GlobalShader.h:73
Definition InstancedSkinnedMeshSceneProxyDesc.h:11
Definition SkeletalRenderGPUSkin.h:179
FMorphGPUSkinVertex(const FVector3f &InDeltaPosition, const FVector3f &InDeltaTangentZ)
Definition SkeletalRenderGPUSkin.h:187
FVector3f DeltaPosition
Definition SkeletalRenderGPUSkin.h:181
FMorphGPUSkinVertex()
Definition SkeletalRenderGPUSkin.h:184
FVector3f DeltaTangentZ
Definition SkeletalRenderGPUSkin.h:182
Definition RHIShaderParameters.h:241
Definition RHIShaderParameters.h:374
Definition RHIUtilities.h:181
uint32 NumBytes
Definition RHIUtilities.h:185
Definition ResourceSize.h:31
Definition Shader.h:1610
Definition SkinnedMeshComponent.h:175
Definition SkeletalMeshLODRenderData.h:28
Definition SkeletalRenderGPUSkin.h:486
FMorphVertexBufferPool * MorphVertexBufferPool
Definition SkeletalRenderGPUSkin.h:490
FSkeletalMeshVertexClothBuffer * APEXClothVertexBuffer
Definition SkeletalRenderGPUSkin.h:491
uint32 NumVertices
Definition SkeletalRenderGPUSkin.h:493
FStaticMeshVertexBuffers * StaticVertexBuffers
Definition SkeletalRenderGPUSkin.h:487
FColorVertexBuffer * ColorVertexBuffer
Definition SkeletalRenderGPUSkin.h:489
FVertexOffsetBuffers * VertexOffsetVertexBuffers
Definition SkeletalRenderGPUSkin.h:492
const FSkinWeightVertexBuffer * SkinWeightVertexBuffer
Definition SkeletalRenderGPUSkin.h:488
Definition SkinnedMeshSceneProxyDesc.h:21
Definition SkinnedMeshSceneProxyDesc.h:117
Definition StaticMeshResources.h:320
Definition ObjectPtr.h:488