UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
GPUSkinCache.cpp File Reference

Classes

class  FSkinCacheExecHelper
 
struct  FGPUSkinCache::FSkinCacheRWBuffer
 
struct  FGPUSkinCache::FRWBuffersAllocationInitializer
 
struct  FGPUSkinCache::FRWBuffersAllocation
 
struct  FGPUSkinCache::FRWBufferTracker
 
class  FGPUSkinCacheEntry
 
struct  FGPUSkinCacheEntry::FRecomputeTangentSection
 
struct  FGPUSkinCacheEntry::FSectionDispatchData
 
class  FGPUSkinCacheCS
 
class  FInitDynamicMeshBoundsCS
 
class  FDynamicMeshBoundsBuffer
 
struct  FDynamicMeshBoundsBlackboardStruct
 
class  FRecomputeTangentsPerTriangleCS
 
class  FRecomputeTangentsPerVertexCS
 
struct  FGPUSkinCache::FTaskData
 

Enumerations

enum class  EGPUSkinCacheDispatchFlags : uint8 { None = 0 , Position = 1 << 0 , PositionPrevious = 1 << 1 , RecomputeTangents = 1 << 2 }
 
enum class  EGPUSkinCacheBufferBits : uint8 { None = 0 , IntermediateTangents = 1 << 1 , PositionPrevious = 1 << 2 }
 
enum class  EGPUSkinBoneInfluenceType : uint8 { Default , Extra , Unlimited }
 
enum class  EGPUSkinDeformationType : uint8 { Default , Morph , Cloth }
 

Functions

 DECLARE_DWORD_COUNTER_STAT (TEXT("Num Dispatches"), STAT_GPUSkinCache_NumDispatches, STATGROUP_GPUSkinCache)
 
 DECLARE_DWORD_COUNTER_STAT (TEXT("Num Buffers"), STAT_GPUSkinCache_NumBuffers, STATGROUP_GPUSkinCache)
 
 DECLARE_DWORD_COUNTER_STAT (TEXT("Num RayTracing Dispatches"), STAT_GPUSkinCache_NumRayTracingDispatches, STATGROUP_GPUSkinCache)
 
 DECLARE_DWORD_COUNTER_STAT (TEXT("Num RayTracing Buffers"), STAT_GPUSkinCache_NumRayTracingBuffers, STATGROUP_GPUSkinCache)
 
 DEFINE_STAT (STAT_GPUSkinCache_TotalNumChunks)
 
 DEFINE_STAT (STAT_GPUSkinCache_TotalNumVertices)
 
 DEFINE_STAT (STAT_GPUSkinCache_TotalMemUsed)
 
 DEFINE_STAT (STAT_GPUSkinCache_TangentsIntermediateMemUsed)
 
 DEFINE_STAT (STAT_GPUSkinCache_NumTrianglesForRecomputeTangents)
 
 DEFINE_STAT (STAT_GPUSkinCache_NumSectionsProcessed)
 
 DEFINE_LOG_CATEGORY_STATIC (LogSkinCache, Log, All)
 
bool ShouldWeCompileGPUSkinVFShaders (EShaderPlatform Platform, ERHIFeatureLevel::Type FeatureLevel)
 
ESkinCacheDefaultBehavior GetSkinCacheDefaultBehavior ()
 
ENGINE_API bool GPUSkinCacheNeedsDuplicatedVertices ()
 
ENGINE_API bool GPUSkinCacheStoreDuplicatedVertices ()
 
 RDG_REGISTER_BLACKBOARD_STRUCT (FGPUSkinCache::FTaskData)
 
 ENUM_CLASS_FLAGS (EGPUSkinCacheDispatchFlags)
 
 ENUM_CLASS_FLAGS (EGPUSkinCacheBufferBits)
 
 IMPLEMENT_GLOBAL_SHADER (FGPUSkinCacheCS, "/Engine/Private/GpuSkinCacheComputeShader.usf", "SkinCacheUpdateBatchCS", SF_Compute)
 
 IMPLEMENT_GLOBAL_SHADER (FInitDynamicMeshBoundsCS, "/Engine/Private/DynamicMeshBounds.usf", "InitDynamicMeshBoundsCS", SF_Compute)
 
 RDG_REGISTER_BLACKBOARD_STRUCT (FDynamicMeshBoundsBlackboardStruct)
 
FDynamicMeshBoundsShaderParameters GetDynamicMeshBoundsShaderParameters (FRDGBuilder &GraphBuilder)
 
void DynamicMeshBoundsModifyCompilationEnvironment (const FGlobalShaderPermutationParameters &Parameters, FShaderCompilerEnvironment &OutEnvironment)
 
 IMPLEMENT_GLOBAL_SHADER (FRecomputeTangentsPerTriangleCS, "/Engine/Private/RecomputeTangentsPerTrianglePass.usf", "MainCS", SF_Compute)
 
 IMPLEMENT_GLOBAL_SHADER (FRecomputeTangentsPerVertexCS, "/Engine/Private/RecomputeTangentsPerVertexPass.usf", "MainCS", SF_Compute)
 
 DECLARE_GPU_STAT (GPUSkinCache)
 

Variables

int32 GEnableGPUSkinCache = 1
 
int32 GSkinCacheRecomputeTangents = 2
 
TAutoConsoleVariable< int32CVarGPUSkinCacheRecomputeTangents (TEXT("r.SkinCache.RecomputeTangents"), 2, TEXT(" 2: on, only recompute tangents on skinned objects who ticked the Recompute Tangents checkbox(default)\n"), ECVF_RenderThreadSafe)
 
FAutoConsoleVariableRef CVarGPUSkinCacheStoreDuplicatedVerticesForRecomputeTangents (TEXT("r.SkinCache.StoreDuplicatedVerticesForRecomputeTangents"), GStoreDuplicatedVerticesForRecomputeTangents, TEXT("1: Store duplicated vertices for all skeletal mesh render sections.\n"), ECVF_ReadOnly)
 
FAutoConsoleVariableRef CVarGPUSkinCacheAllowDupedVertesForRecomputeTangents (TEXT("r.SkinCache.UseDuplicatedVerticesForRecomputeTangents"), GUseDuplicatedVerticesForRecomputeTangents, TEXT("1: Use stored duplicated vertices if they are available (default).\n"), ECVF_RenderThreadSafe)
 
int32 GRecomputeTangentsParallelDispatch = 0
 
FAutoConsoleVariableRef CVarRecomputeTangentsParallelDispatch (TEXT("r.SkinCache.RecomputeTangentsParallelDispatch"), GRecomputeTangentsParallelDispatch, TEXT(" 1: on, batch triangle passes together, resource barrier, followed by vertex passes together, cost more memory. \n"), ECVF_RenderThreadSafe)
 
FAutoConsoleVariableRef CVarGPUSkinCachePrintMemorySummary (TEXT("r.SkinCache.PrintMemorySummary"), GSkinCachePrintMemorySummary, TEXT(" 1: print for N frames"), ECVF_RenderThreadSafe)
 
bool GSkinCacheAsyncCompute = false
 
FAutoConsoleVariableRef CVarSkinCacheAsyncCompute (TEXT("r.SkinCache.AsyncCompute"), GSkinCacheAsyncCompute, TEXT(" 1: on\n"), ECVF_RenderThreadSafe)
 
int32 GNumDispatchesToCapture = 0
 
const float MBSize = 1048576.f
 

Enumeration Type Documentation

◆ EGPUSkinBoneInfluenceType

Enumerator
Default 
Extra 
Unlimited 

◆ EGPUSkinCacheBufferBits

Enumerator
None 
IntermediateTangents 
PositionPrevious 

◆ EGPUSkinCacheDispatchFlags

Enumerator
None 
Position 
PositionPrevious 
RecomputeTangents 

◆ EGPUSkinDeformationType

Enumerator
Default 
Morph 
Cloth 

Function Documentation

◆ DECLARE_DWORD_COUNTER_STAT() [1/4]

DECLARE_DWORD_COUNTER_STAT ( TEXT("Num Buffers" ,
STAT_GPUSkinCache_NumBuffers  ,
STATGROUP_GPUSkinCache   
)

◆ DECLARE_DWORD_COUNTER_STAT() [2/4]

DECLARE_DWORD_COUNTER_STAT ( TEXT("Num Dispatches" ,
STAT_GPUSkinCache_NumDispatches  ,
STATGROUP_GPUSkinCache   
)

◆ DECLARE_DWORD_COUNTER_STAT() [3/4]

DECLARE_DWORD_COUNTER_STAT ( TEXT("Num RayTracing Buffers" ,
STAT_GPUSkinCache_NumRayTracingBuffers  ,
STATGROUP_GPUSkinCache   
)

◆ DECLARE_DWORD_COUNTER_STAT() [4/4]

DECLARE_DWORD_COUNTER_STAT ( TEXT("Num RayTracing Dispatches" ,
STAT_GPUSkinCache_NumRayTracingDispatches  ,
STATGROUP_GPUSkinCache   
)

◆ DECLARE_GPU_STAT()

DECLARE_GPU_STAT ( GPUSkinCache  )

◆ DEFINE_LOG_CATEGORY_STATIC()

DEFINE_LOG_CATEGORY_STATIC ( LogSkinCache  ,
Log  ,
All   
)

◆ DEFINE_STAT() [1/6]

◆ DEFINE_STAT() [2/6]

◆ DEFINE_STAT() [3/6]

◆ DEFINE_STAT() [4/6]

DEFINE_STAT ( STAT_GPUSkinCache_TotalMemUsed  )

◆ DEFINE_STAT() [5/6]

◆ DEFINE_STAT() [6/6]

◆ DynamicMeshBoundsModifyCompilationEnvironment()

void DynamicMeshBoundsModifyCompilationEnvironment ( const FGlobalShaderPermutationParameters Parameters,
FShaderCompilerEnvironment OutEnvironment 
)

◆ ENUM_CLASS_FLAGS() [1/2]

ENUM_CLASS_FLAGS ( EGPUSkinCacheBufferBits  )

◆ ENUM_CLASS_FLAGS() [2/2]

ENUM_CLASS_FLAGS ( EGPUSkinCacheDispatchFlags  )

◆ GetDynamicMeshBoundsShaderParameters()

FDynamicMeshBoundsShaderParameters GetDynamicMeshBoundsShaderParameters ( FRDGBuilder GraphBuilder)

◆ GetSkinCacheDefaultBehavior()

ESkinCacheDefaultBehavior GetSkinCacheDefaultBehavior ( )

◆ GPUSkinCacheNeedsDuplicatedVertices()

ENGINE_API bool GPUSkinCacheNeedsDuplicatedVertices ( )

◆ GPUSkinCacheStoreDuplicatedVertices()

ENGINE_API bool GPUSkinCacheStoreDuplicatedVertices ( )

◆ IMPLEMENT_GLOBAL_SHADER() [1/4]

IMPLEMENT_GLOBAL_SHADER ( FGPUSkinCacheCS  ,
"/Engine/Private/GpuSkinCacheComputeShader.usf"  ,
"SkinCacheUpdateBatchCS"  ,
SF_Compute   
)

◆ IMPLEMENT_GLOBAL_SHADER() [2/4]

IMPLEMENT_GLOBAL_SHADER ( FInitDynamicMeshBoundsCS  ,
"/Engine/Private/DynamicMeshBounds.usf"  ,
"InitDynamicMeshBoundsCS"  ,
SF_Compute   
)

◆ IMPLEMENT_GLOBAL_SHADER() [3/4]

IMPLEMENT_GLOBAL_SHADER ( FRecomputeTangentsPerTriangleCS  ,
"/Engine/Private/RecomputeTangentsPerTrianglePass.usf"  ,
"MainCS"  ,
SF_Compute   
)

◆ IMPLEMENT_GLOBAL_SHADER() [4/4]

IMPLEMENT_GLOBAL_SHADER ( FRecomputeTangentsPerVertexCS  ,
"/Engine/Private/RecomputeTangentsPerVertexPass.usf"  ,
"MainCS"  ,
SF_Compute   
)

◆ RDG_REGISTER_BLACKBOARD_STRUCT() [1/2]

RDG_REGISTER_BLACKBOARD_STRUCT ( FDynamicMeshBoundsBlackboardStruct  )

◆ RDG_REGISTER_BLACKBOARD_STRUCT() [2/2]

RDG_REGISTER_BLACKBOARD_STRUCT ( FGPUSkinCache::FTaskData  )

◆ ShouldWeCompileGPUSkinVFShaders()

bool ShouldWeCompileGPUSkinVFShaders ( EShaderPlatform  Platform,
ERHIFeatureLevel::Type  FeatureLevel 
)

Variable Documentation

◆ CVarGPUSkinCacheAllowDupedVertesForRecomputeTangents

FAutoConsoleVariableRef CVarGPUSkinCacheAllowDupedVertesForRecomputeTangents(TEXT("r.SkinCache.UseDuplicatedVerticesForRecomputeTangents"), GUseDuplicatedVerticesForRecomputeTangents, TEXT("1: Use stored duplicated vertices if they are available (default).\n"), ECVF_RenderThreadSafe) ( TEXT("r.SkinCache.UseDuplicatedVerticesForRecomputeTangents")  ,
GUseDuplicatedVerticesForRecomputeTangents  ,
TEXT("1: Use stored duplicated vertices if they are available (default).\n" ,
ECVF_RenderThreadSafe   
)

◆ CVarGPUSkinCachePrintMemorySummary

FAutoConsoleVariableRef CVarGPUSkinCachePrintMemorySummary(TEXT("r.SkinCache.PrintMemorySummary"), GSkinCachePrintMemorySummary, TEXT(" 1: print for N frames"), ECVF_RenderThreadSafe) ( TEXT("r.SkinCache.PrintMemorySummary")  ,
GSkinCachePrintMemorySummary  ,
TEXT(" 1: print for N frames" ,
ECVF_RenderThreadSafe   
)

◆ CVarGPUSkinCacheRecomputeTangents

TAutoConsoleVariable< int32 > CVarGPUSkinCacheRecomputeTangents(TEXT("r.SkinCache.RecomputeTangents"), 2, TEXT(" 2: on, only recompute tangents on skinned objects who ticked the Recompute Tangents checkbox(default)\n"), ECVF_RenderThreadSafe) ( TEXT("r.SkinCache.RecomputeTangents")  ,
,
TEXT(" 2: on, only recompute tangents on skinned objects who ticked the Recompute Tangents checkbox(default)\n" ,
ECVF_RenderThreadSafe   
)

◆ CVarGPUSkinCacheStoreDuplicatedVerticesForRecomputeTangents

FAutoConsoleVariableRef CVarGPUSkinCacheStoreDuplicatedVerticesForRecomputeTangents(TEXT("r.SkinCache.StoreDuplicatedVerticesForRecomputeTangents"), GStoreDuplicatedVerticesForRecomputeTangents, TEXT("1: Store duplicated vertices for all skeletal mesh render sections.\n"), ECVF_ReadOnly) ( TEXT("r.SkinCache.StoreDuplicatedVerticesForRecomputeTangents")  ,
GStoreDuplicatedVerticesForRecomputeTangents  ,
TEXT("1: Store duplicated vertices for all skeletal mesh render sections.\n" ,
ECVF_ReadOnly   
)

◆ CVarRecomputeTangentsParallelDispatch

FAutoConsoleVariableRef CVarRecomputeTangentsParallelDispatch(TEXT("r.SkinCache.RecomputeTangentsParallelDispatch"), GRecomputeTangentsParallelDispatch, TEXT(" 1: on, batch triangle passes together, resource barrier, followed by vertex passes together, cost more memory. \n"), ECVF_RenderThreadSafe) ( TEXT("r.SkinCache.RecomputeTangentsParallelDispatch")  ,
GRecomputeTangentsParallelDispatch  ,
TEXT(" 1: on, batch triangle passes together, resource barrier, followed by vertex passes together, cost more memory. \n" ,
ECVF_RenderThreadSafe   
)

◆ CVarSkinCacheAsyncCompute

FAutoConsoleVariableRef CVarSkinCacheAsyncCompute(TEXT("r.SkinCache.AsyncCompute"), GSkinCacheAsyncCompute, TEXT(" 1: on\n"), ECVF_RenderThreadSafe) ( TEXT("r.SkinCache.AsyncCompute")  ,
GSkinCacheAsyncCompute  ,
TEXT(" 1: on\n")  ,
ECVF_RenderThreadSafe   
)

◆ GEnableGPUSkinCache

int32 GEnableGPUSkinCache = 1

◆ GNumDispatchesToCapture

int32 GNumDispatchesToCapture = 0

◆ GRecomputeTangentsParallelDispatch

int32 GRecomputeTangentsParallelDispatch = 0

◆ GSkinCacheAsyncCompute

bool GSkinCacheAsyncCompute = false

◆ GSkinCacheRecomputeTangents

int32 GSkinCacheRecomputeTangents = 2

◆ MBSize

const float MBSize = 1048576.f