11#ifndef PLATFORM_SUPPORTS_LLM
12 #define PLATFORM_SUPPORTS_LLM 1
15#define LLM_ENABLED_ON_PLATFORM UE_DEPRECATED_MACRO(5.7, "Use PLATFORM_SUPPORTS_LLM instead") (PLATFORM_SUPPORTS_LLM)
17#ifdef ENABLE_LOW_LEVEL_MEM_TRACKER
18 #error ENABLE_LOW_LEVEL_MEM_TRACKER is now a derived define that should not be defined separately. Define LLM_ENABLED_IN_CONFIG (build environment only) or PLATFORM_SUPPORTS_LLM (build environment or c++ header) instead.
20#define ENABLE_LOW_LEVEL_MEM_TRACKER (LLM_ENABLED_IN_CONFIG && PLATFORM_SUPPORTS_LLM)
22#if ENABLE_LOW_LEVEL_MEM_TRACKER
32#ifndef LLM_ALLOW_ASSETS_TAGS
33 #define LLM_ALLOW_ASSETS_TAGS 0
38#ifndef LLM_ALLOW_UOBJECTCLASSES_TAGS
39 #define LLM_ALLOW_UOBJECTCLASSES_TAGS !LLM_ALLOW_ASSETS_TAGS
46#ifndef LLM_ALLOW_STATS
47 #define LLM_ALLOW_STATS 0
51#define LLM_ENABLED_STAT_TAGS (LLM_ALLOW_STATS || LLM_ALLOW_ASSETS_TAGS)
53#include "Containers/Array.h"
76template <
typename Type>
79 static bool bValue =
true;
87#if !USING_CODE_ANALYSIS
88 #define LLMTrueOnFirstCallOnly UE::LLMPrivate::TrueOnFirstCallOnly([]{})
90 #define LLMTrueOnFirstCallOnly false
93#define LLMCheckMessage(expr) TEXT("LLM check failed: %s [File:%s] [Line: %d]\r\n"), TEXT(#expr), TEXT(__FILE__), __LINE__
94#define LLMCheckfMessage(expr, format) TEXT("LLM check failed: %s [File:%s] [Line: %d]\r\n") format TEXT("\r\n"), TEXT(#expr), TEXT(__FILE__), __LINE__
95#define LLMEnsureMessage(expr) TEXT("LLM ensure failed: %s [File:%s] [Line: %d]\r\n"), TEXT(#expr), TEXT(__FILE__), __LINE__
97#define LLMCheck(expr) do { if (UNLIKELY(!(expr))) { UE::LLMPrivate::HandleAssert(true, LLMCheckMessage(expr)); FPlatformMisc::RaiseException(1); } } while(false)
98#define LLMCheckf(expr,format,...) do { if (UNLIKELY(!(expr))) { UE::LLMPrivate::HandleAssert(true, LLMCheckfMessage(expr, format), ##__VA_ARGS__); FPlatformMisc::RaiseException(1); } } while(false)
99#define LLMEnsure(expr) (LIKELY(!!(expr)) || UE::LLMPrivate::HandleAssert(LLMTrueOnFirstCallOnly, LLMEnsureMessage(expr)))
103#define LLMCheck(expr)
104#define LLMCheckf(expr,...)
105#define LLMEnsure(expr) (!!(expr))
109#define LLM_TAG_TYPE uint8
114#define LLM_MEMORY_OVERHEAD (600LL*1024*1024)
159#define LLM_ENUM_GENERIC_TAGS(macro) \
160 macro(Untagged, "Untagged", NAME_None, NAME_None, -1)\
161 macro(Paused, "Paused", NAME_None, NAME_None, -1)\
162 macro(Total, "Total", GET_STATFNAME(STAT_TotalLLM), GET_STATFNAME(STAT_TrackedTotalSummaryLLM), -1)\
163 macro(Untracked, "Untracked", GET_STATFNAME(STAT_UntrackedLLM), GET_STATFNAME(STAT_TrackedTotalSummaryLLM), -1)\
164 macro(PlatformTotal, "Total", GET_STATFNAME(STAT_PlatformTotalLLM), NAME_None, -1)\
165 macro(TrackedTotal, "TrackedTotal", GET_STATFNAME(STAT_TrackedTotalLLM), GET_STATFNAME(STAT_TrackedTotalSummaryLLM), -1)\
166 macro(UntaggedTotal, "Untagged", GET_STATFNAME(STAT_UntaggedTotalLLM), NAME_None, -1)\
167 macro(WorkingSetSize, "WorkingSetSize", GET_STATFNAME(STAT_WorkingSetSizeLLM), GET_STATFNAME(STAT_TrackedTotalSummaryLLM), -1)\
168 macro(PagefileUsed, "PagefileUsed", GET_STATFNAME(STAT_PagefileUsedLLM), GET_STATFNAME(STAT_TrackedTotalSummaryLLM), -1)\
169 macro(PlatformTrackedTotal, "TrackedTotal", GET_STATFNAME(STAT_PlatformTrackedTotalLLM), NAME_None, -1)\
170 macro(PlatformUntaggedTotal, "Untagged", GET_STATFNAME(STAT_PlatformUntaggedTotalLLM), NAME_None, -1)\
171 macro(PlatformUntracked, "Untracked", GET_STATFNAME(STAT_PlatformUntrackedLLM), NAME_None, -1)\
172 macro(PlatformOverhead, "LLMOverhead", GET_STATFNAME(STAT_PlatformOverheadLLM), NAME_None, -1)\
173 macro(PlatformOSAvailable, "OSAvailable", GET_STATFNAME(STAT_PlatformOSAvailableLLM), NAME_None, -1)\
175 macro(FMalloc, "FMalloc", GET_STATFNAME(STAT_FMallocLLM), NAME_None, -1)\
176 macro(FMallocUnused, "FMallocUnused", GET_STATFNAME(STAT_FMallocUnusedLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
177 macro(RHIUnused, "RHIUnused", GET_STATFNAME(STAT_RHIUnusedLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
178 macro(ThreadStack, "ThreadStack", GET_STATFNAME(STAT_ThreadStackLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
179 macro(ThreadStackPlatform, "ThreadStack", GET_STATFNAME(STAT_ThreadStackPlatformLLM), NAME_None, -1)\
180 macro(ProgramSizePlatform, "ProgramSize", GET_STATFNAME(STAT_ProgramSizePlatformLLM), NAME_None, -1)\
181 macro(ProgramSize, "ProgramSize", GET_STATFNAME(STAT_ProgramSizeLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
182 macro(BackupOOMMemoryPoolPlatform, "OOMBackupPool", GET_STATFNAME(STAT_OOMBackupPoolPlatformLLM), NAME_None, -1)\
183 macro(BackupOOMMemoryPool, "OOMBackupPool", GET_STATFNAME(STAT_OOMBackupPoolLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
184 macro(GenericPlatformMallocCrash, "GenericPlatformMallocCrash", GET_STATFNAME(STAT_GenericPlatformMallocCrashLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
185 macro(GenericPlatformMallocCrashPlatform, "GenericPlatformMallocCrash", GET_STATFNAME(STAT_GenericPlatformMallocCrashPlatformLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
187 macro(EngineMisc, "EngineMisc", GET_STATFNAME(STAT_EngineMiscLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
189 macro(TaskGraphTasksMisc, "TaskGraphMiscTasks", GET_STATFNAME(STAT_TaskGraphTasksMiscLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
190 macro(LinearAllocator, "LinearAllocator", GET_STATFNAME(STAT_LinearAllocatorLLM), NAME_None, -1)\
191 macro(Audio, "Audio", GET_STATFNAME(STAT_AudioLLM), GET_STATFNAME(STAT_AudioSummaryLLM), -1)\
192 macro(AudioMisc, "AudioMisc", GET_STATFNAME(STAT_AudioMiscLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
193 macro(AudioSoundWaves, "AudioSoundWaves", GET_STATFNAME(STAT_AudioSoundWavesLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
194 macro(AudioSoundWaveProxies, "AudioSoundWaveProxies", GET_STATFNAME(STAT_AudioSoundWaveProxiesLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
195 macro(AudioMixer, "AudioMixer", GET_STATFNAME(STAT_AudioMixerLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
196 macro(AudioMixerPlugins, "AudioMixerPlugins", GET_STATFNAME(STAT_AudioMixerPluginsLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
197 macro(AudioPrecache, "AudioPrecache", GET_STATFNAME(STAT_AudioPrecacheLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
198 macro(AudioDecompress, "AudioDecompress", GET_STATFNAME(STAT_AudioDecompressLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
199 macro(AudioRealtimePrecache, "AudioRealtimePrecache", GET_STATFNAME(STAT_AudioRealtimePrecacheLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
200 macro(AudioFullDecompress, "AudioFullDecompress", GET_STATFNAME(STAT_AudioFullDecompressLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
201 macro(AudioStreamCache, "AudioStreamCache", GET_STATFNAME(STAT_AudioStreamCacheLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
202 macro(AudioStreamCacheCompressedData, "AudioStreamCacheCompressedData",GET_STATFNAME(STAT_AudioStreamCacheCompressedDataLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
203 macro(AudioSynthesis, "AudioSynthesis", GET_STATFNAME(STAT_AudioSynthesisLLM), GET_STATFNAME(STAT_AudioSummaryLLM), ELLMTag::Audio)\
204 macro(RealTimeCommunications, "RealTimeCommunications", GET_STATFNAME(STAT_RealTimeCommunicationsLLM), NAME_None, -1)\
205 macro(FName, "FName", GET_STATFNAME(STAT_FNameLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
206 macro(Networking, "Networking", GET_STATFNAME(STAT_NetworkingLLM), GET_STATFNAME(STAT_NetworkingSummaryLLM), -1)\
207 macro(Meshes, "Meshes", GET_STATFNAME(STAT_MeshesLLM), GET_STATFNAME(STAT_MeshesSummaryLLM), -1)\
208 macro(Stats, "Stats", GET_STATFNAME(STAT_StatsLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
209 macro(Shaders, "Shaders", GET_STATFNAME(STAT_ShadersLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
210 macro(PSO, "PSO", GET_STATFNAME(STAT_PSOLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
211 macro(Textures, "Textures", GET_STATFNAME(STAT_TexturesLLM), GET_STATFNAME(STAT_TexturesSummaryLLM), -1)\
212 macro(TextureMetaData, "TextureMetaData", GET_STATFNAME(STAT_TextureMetaDataLLM), GET_STATFNAME(STAT_TexturesSummaryLLM), -1)\
213 macro(VirtualTextureSystem, "VirtualTextureSystem", GET_STATFNAME(STAT_VirtualTextureSystemLLM), GET_STATFNAME(STAT_TexturesSummaryLLM), -1)\
214 macro(RenderTargets, "RenderTargets", GET_STATFNAME(STAT_RenderTargetsLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
215 macro(SceneRender, "SceneRender", GET_STATFNAME(STAT_SceneRenderLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
216 macro(RHIMisc, "RHIMisc", GET_STATFNAME(STAT_RHIMiscLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
217 macro(AsyncLoading, "AsyncLoading", GET_STATFNAME(STAT_AsyncLoadingLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
222 macro(UObject, "UObject", GET_STATFNAME(STAT_UObjectLLM), GET_STATFNAME(STAT_UObjectSummaryLLM), -1)\
223 macro(Animation, "Animation", GET_STATFNAME(STAT_AnimationLLM), GET_STATFNAME(STAT_AnimationSummaryLLM), -1)\
225 macro(StaticMesh, "StaticMesh", GET_STATFNAME(STAT_StaticMeshLLM), GET_STATFNAME(STAT_StaticMeshSummaryLLM), ELLMTag::Meshes)\
226 macro(Materials, "Materials", GET_STATFNAME(STAT_MaterialsLLM), GET_STATFNAME(STAT_MaterialsSummaryLLM), -1)\
227 macro(Particles, "Particles", GET_STATFNAME(STAT_ParticlesLLM), GET_STATFNAME(STAT_ParticlesSummaryLLM), -1)\
228 macro(Niagara, "Niagara", GET_STATFNAME(STAT_NiagaraLLM), GET_STATFNAME(STAT_NiagaraSummaryLLM), -1)\
229 macro(GPUSort, "GPUSort", GET_STATFNAME(STAT_GPUSortLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
230 macro(GC, "GC", GET_STATFNAME(STAT_GCLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
231 macro(UI, "UI", GET_STATFNAME(STAT_UILLM), GET_STATFNAME(STAT_UISummaryLLM), -1)\
232 macro(NavigationRecast, "NavigationRecast", GET_STATFNAME(STAT_NavigationRecastLLM), GET_STATFNAME(STAT_NavigationSummaryLLM), -1)\
233 macro(Physics, "Physics", GET_STATFNAME(STAT_PhysicsLLM), GET_STATFNAME(STAT_PhysicsSummaryLLM), -1)\
234 macro(PhysX, "PhysX", GET_STATFNAME(STAT_PhysXLLM), GET_STATFNAME(STAT_PhysXSummaryLLM), ELLMTag::Physics)\
235 macro(PhysXGeometry, "PhysXGeometry", GET_STATFNAME(STAT_PhysXGeometryLLM), GET_STATFNAME(STAT_PhysXSummaryLLM), ELLMTag::Physics)\
236 macro(PhysXTrimesh, "PhysXTrimesh", GET_STATFNAME(STAT_PhysXTrimeshLLM), GET_STATFNAME(STAT_PhysXSummaryLLM), ELLMTag::Physics)\
237 macro(PhysXConvex, "PhysXConvex", GET_STATFNAME(STAT_PhysXConvexLLM), GET_STATFNAME(STAT_PhysXSummaryLLM), ELLMTag::Physics)\
238 macro(PhysXAllocator, "PhysXAllocator", GET_STATFNAME(STAT_PhysXAllocatorLLM), GET_STATFNAME(STAT_PhysXSummaryLLM), ELLMTag::Physics)\
239 macro(PhysXLandscape, "PhysXLandscape", GET_STATFNAME(STAT_PhysXLandscapeLLM), GET_STATFNAME(STAT_PhysXSummaryLLM), ELLMTag::Physics)\
240 macro(Chaos, "Chaos", GET_STATFNAME(STAT_ChaosLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
241 macro(ChaosGeometry, "ChaosGeometry", GET_STATFNAME(STAT_ChaosGeometryLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
242 macro(ChaosAcceleration, "ChaosAcceleration", GET_STATFNAME(STAT_ChaosAccelerationLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
243 macro(ChaosParticles, "ChaosParticles", GET_STATFNAME(STAT_ChaosParticlesLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
244 macro(ChaosLandscape, "ChaosLandscape", GET_STATFNAME(STAT_ChaosLandscapeLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
245 macro(ChaosTrimesh, "ChaosTrimesh", GET_STATFNAME(STAT_ChaosTrimeshLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
246 macro(ChaosConvex, "ChaosConvex", GET_STATFNAME(STAT_ChaosConvexLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
247 macro(ChaosScene, "ChaosScene", GET_STATFNAME(STAT_ChaosSceneLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
248 macro(ChaosUpdate, "ChaosUpdate", GET_STATFNAME(STAT_ChaosUpdateLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
249 macro(ChaosActor, "ChaosActor", GET_STATFNAME(STAT_ChaosActorLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
250 macro(ChaosBody, "ChaosBody", GET_STATFNAME(STAT_ChaosBodyLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
251 macro(ChaosConstraint, "ChaosConstraint", GET_STATFNAME(STAT_ChaosConstraintLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
252 macro(ChaosMaterial, "ChaosMaterial", GET_STATFNAME(STAT_ChaosMaterialLLM), GET_STATFNAME(STAT_ChaosSummaryLLM), ELLMTag::Physics)\
253 macro(EnginePreInitMemory, "EnginePreInit", GET_STATFNAME(STAT_EnginePreInitLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
254 macro(EngineInitMemory, "EngineInit", GET_STATFNAME(STAT_EngineInitLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
255 macro(RenderingThreadMemory, "RenderingThread", GET_STATFNAME(STAT_RenderingThreadLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
256 macro(LoadMapMisc, "LoadMapMisc", GET_STATFNAME(STAT_LoadMapMiscLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
257 macro(StreamingManager, "StreamingManager", GET_STATFNAME(STAT_StreamingManagerLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
258 macro(GraphicsPlatform, "Graphics", GET_STATFNAME(STAT_GraphicsPlatformLLM), NAME_None, -1)\
259 macro(FileSystem, "FileSystem", GET_STATFNAME(STAT_FileSystemLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
260 macro(Localization, "Localization", GET_STATFNAME(STAT_LocalizationLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
261 macro(AssetRegistry, "AssetRegistry", GET_STATFNAME(STAT_AssetRegistryLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
262 macro(ConfigSystem, "ConfigSystem", GET_STATFNAME(STAT_ConfigSystemLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
263 macro(InitUObject, "InitUObject", GET_STATFNAME(STAT_InitUObjectLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
264 macro(VideoRecording, "VideoRecording", GET_STATFNAME(STAT_VideoRecordingLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
265 macro(Replays, "Replays", GET_STATFNAME(STAT_ReplaysLLM), GET_STATFNAME(STAT_NetworkingSummaryLLM), ELLMTag::Networking)\
266 macro(MaterialInstance, "MaterialInstance", GET_STATFNAME(STAT_MaterialInstanceLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
267 macro(SkeletalMesh, "SkeletalMesh", GET_STATFNAME(STAT_SkeletalMeshLLM), GET_STATFNAME(STAT_EngineSummaryLLM), ELLMTag::Meshes)\
268 macro(InstancedMesh, "InstancedMesh", GET_STATFNAME(STAT_InstancedMeshLLM), GET_STATFNAME(STAT_EngineSummaryLLM), ELLMTag::Meshes)\
269 macro(Landscape, "Landscape", GET_STATFNAME(STAT_LandscapeLLM), GET_STATFNAME(STAT_EngineSummaryLLM), ELLMTag::Meshes)\
270 macro(CsvProfiler, "CsvProfiler", GET_STATFNAME(STAT_CsvProfilerLLM), GET_STATFNAME(STAT_EngineSummaryLLM), -1)\
271 macro(MediaStreaming, "MediaStreaming", GET_STATFNAME(STAT_MediaStreamingLLM), GET_STATFNAME(STAT_MediaStreamingSummaryLLM), -1)\
272 macro(ElectraPlayer, "ElectraPlayer", GET_STATFNAME(STAT_ElectraPlayerLLM), GET_STATFNAME(STAT_MediaStreamingSummaryLLM), ELLMTag::MediaStreaming)\
273 macro(WMFPlayer, "WMFPlayer", GET_STATFNAME(STAT_WMFPlayerLLM), GET_STATFNAME(STAT_MediaStreamingSummaryLLM), ELLMTag::MediaStreaming)\
274 macro(PlatformMMIO, "MMIO", GET_STATFNAME(STAT_PlatformMMIOLLM), NAME_None, -1)\
275 macro(PlatformVM, "Virtual Memory", GET_STATFNAME(STAT_PlatformVMLLM), NAME_None, -1)\
276 macro(CustomName, "CustomName", GET_STATFNAME(STAT_CustomName), NAME_None, -1)\
283#define LLM_ENUM(Enum,Str,Stat,Group,Parent) Enum,
301static_assert( ELLMTag::GenericTagCount <= ELLMTag::PlatformTagStart,
302 "too many LLM tags defined -- Instead of adding a new tag and updating the limits, please use the LLM_DECLARE_TAG macros below");
329#define LLM_IF_ENABLED(x) if (FLowLevelMemTracker::IsEnabled()) { x; }
330#define LLM_IS_ENABLED() FLowLevelMemTracker::IsEnabled()
331#define SCOPE_NAME PREPROCESSOR_JOIN(LLMScope,__LINE__)
340#define LLM_SCOPE(Tag) FLLMScope SCOPE_NAME(Tag, false , ELLMTagSet::None, ELLMTracker::Default);\
342#define LLM_SCOPE_DYNAMIC(UniqueName, Tracker, TagSet, Constructor) \
343 FLLMScopeDynamic SCOPE_NAME(Tracker, TagSet); \
344 UE_MEMSCOPE_UNINITIALIZED(__LINE__); \
347 if (SCOPE_NAME.IsEnabled()) \
349 FName UniqueNameEvaluated(UniqueName); \
350 if (!UniqueNameEvaluated.IsNone()) \
352 if (SCOPE_NAME.TryFindTag(UniqueNameEvaluated)) \
354 SCOPE_NAME.Activate(); \
358 SCOPE_NAME.TryAddTagAndActivate(UniqueNameEvaluated, Constructor); \
360 constexpr int DefaultTracker = (int)ELLMTracker::Default; \
361 if (TagSet == ELLMTagSet::None && (int)Tracker == DefaultTracker) \
363 UE_MEMSCOPE_ACTIVATE(__LINE__, UniqueNameEvaluated); \
369#define LLM_TAGSET_SCOPE(Tag, TagSet) FLLMScope SCOPE_NAME(Tag, false , TagSet, ELLMTracker::Default);
370#define LLM_SCOPE_BYNAME(Tag) static FName PREPROCESSOR_JOIN(LLMScope_Name,__LINE__)(Tag);\
371 FLLMScope SCOPE_NAME(PREPROCESSOR_JOIN(LLMScope_Name,__LINE__), false , ELLMTagSet::None, ELLMTracker::Default);\
372 UE_MEMSCOPE(PREPROCESSOR_JOIN(LLMScope_Name,__LINE__));
373#define LLM_SCOPE_BYTAG(TagDeclName) FLLMScope SCOPE_NAME(PREPROCESSOR_JOIN(LLMTagDeclaration_, TagDeclName).GetUniqueName(), false , ELLMTagSet::None, ELLMTracker::Default);\
374 UE_MEMSCOPE(PREPROCESSOR_JOIN(LLMTagDeclaration_,TagDeclName).GetUniqueName());
375#define LLM_SCOPE_RENDER_RESOURCE(Tag) static const FString PREPROCESSOR_JOIN(LLMScope_NamePrefix,__LINE__)(TEXT("RenderResources.")); \
376 FName PREPROCESSOR_JOIN(LLMScope_Name,__LINE__)(PREPROCESSOR_JOIN(LLMScope_NamePrefix, __LINE__) + (Tag ? Tag : TEXT("Unknown"))); \
377 FLLMScope SCOPE_NAME(PREPROCESSOR_JOIN(LLMScope_Name,__LINE__), false , ELLMTagSet::Assets, ELLMTracker::Default, false );
378#define LLM_PLATFORM_SCOPE(Tag) FLLMScope SCOPE_NAME(Tag, false , ELLMTagSet::None, ELLMTracker::Platform);
379#define LLM_PLATFORM_SCOPE_BYNAME(Tag) static FName PREPROCESSOR_JOIN(LLMScope_Name,__LINE__)(Tag);\
380 FLLMScope SCOPE_NAME(PREPROCESSOR_JOIN(LLMScope_Name,__LINE__), false , ELLMTagSet::None, ELLMTracker::Platform);
381#define LLM_PLATFORM_SCOPE_BYTAG(TagDeclName) FLLMScope SCOPE_NAME(PREPROCESSOR_JOIN(LLMTagDeclaration_, TagDeclName).GetUniqueName(), false , ELLMTagSet::None, ELLMTracker::Platform);
382#define LLM_SCOPE_CLEAR() FLLMClearScope SCOPE_NAME(ELLMTagSet::None, ELLMTracker::Default);\
384#define LLM_TAGSET_SCOPE_CLEAR(TagSet) FLLMClearScope SCOPE_NAME(TagSet, ELLMTracker::Default);
389#define LLM_SCOPED_PAUSE_TRACKING(AllocType) FLLMPauseScope SCOPE_NAME(ELLMTag::Untagged, false , 0, ELLMTracker::Max, AllocType);
390#define LLM_SCOPED_PAUSE_TRACKING_FOR_TRACKER(Tracker, AllocType) FLLMPauseScope SCOPE_NAME(ELLMTag::Untagged, false , 0, Tracker, AllocType);
391#define LLM_SCOPED_PAUSE_TRACKING_WITH_ENUM_AND_AMOUNT(Tag, Amount, Tracker, AllocType) FLLMPauseScope SCOPE_NAME(Tag, false , Amount, Tracker, AllocType);
392#define LLM_SCOPED_PAUSE_TRACKING_WITH_ENUM_AND_AMOUNT_BYTAG(TagDeclName, Amount, Tracker, AllocType) FLLMPauseScope SCOPE_NAME(PREPROCESSOR_JOIN(LLMTagDeclaration_, TagDeclName).GetUniqueName(), false , Amount, Tracker, AllocType);
397#define LLM_REALLOC_SCOPE(Ptr) FLLMScopeFromPtr SCOPE_NAME(Ptr, ELLMTracker::Default);
398#define LLM_REALLOC_PLATFORM_SCOPE(Ptr) FLLMScopeFromPtr SCOPE_NAME(Ptr, ELLMTracker::Platform);
403#define LLM_DUMP_TAG() FLowLevelMemTracker::Get().DumpTag(ELLMTracker::Default,__FILE__,__LINE__)
404#define LLM_DUMP_PLATFORM_TAG() FLowLevelMemTracker::Get().DumpTag(ELLMTracker::Platform,__FILE__,__LINE__)
419#define LLM_DEFINE_TAG(UniqueNameWithUnderscores, ...) FLLMTagDeclaration PREPROCESSOR_JOIN(LLMTagDeclaration_, UniqueNameWithUnderscores)(TEXT(#UniqueNameWithUnderscores), ##__VA_ARGS__)
434#define LLM_DEFINE_STATIC_TAG(UniqueNameWithUnderscores, ...) static FLLMTagDeclaration PREPROCESSOR_JOIN(LLMTagDeclaration_, UniqueNameWithUnderscores)(TEXT(#UniqueNameWithUnderscores), ##__VA_ARGS__)
444#define LLM_DECLARE_TAG(UniqueNameWithUnderscores) extern FLLMTagDeclaration PREPROCESSOR_JOIN(LLMTagDeclaration_, UniqueNameWithUnderscores)
445#define LLM_DECLARE_TAG_API(UniqueNameWithUnderscores, ModuleAPI) extern ModuleAPI FLLMTagDeclaration PREPROCESSOR_JOIN(LLMTagDeclaration_, UniqueNameWithUnderscores)
448#define LLM_TAG_NAME(UniqueNameWithUnderscores) (PREPROCESSOR_JOIN(LLMTagDeclaration_, UniqueNameWithUnderscores).GetUniqueName())
455#define LLM_DEFINE_BOOTSTRAP_TAG(UniqueNameWithUnderscores, ...) \
456 FLLMTagDeclaration& PREPROCESSOR_JOIN(GetLLMTagDeclaration_, UniqueNameWithUnderscores)() \
458 static FLLMTagDeclaration PREPROCESSOR_JOIN(LLMTagDeclaration_, UniqueNameWithUnderscores)(TEXT(#UniqueNameWithUnderscores), ##__VA_ARGS__); \
459 return PREPROCESSOR_JOIN(LLMTagDeclaration_, UniqueNameWithUnderscores); \
461#define LLM_SCOPE_BY_BOOTSTRAP_TAG(TagDeclName) FLLMScope SCOPE_NAME(PREPROCESSOR_JOIN(GetLLMTagDeclaration_, TagDeclName)().GetUniqueName(), false , ELLMTagSet::None, ELLMTracker::Default);\
462 UE_MEMSCOPE(PREPROCESSOR_JOIN(GetLLMTagDeclaration_,TagDeclName)().GetUniqueName());
463#define LLM_DECLARE_BOOTSTRAP_TAG(UniqueNameWithUnderscores) extern FLLMTagDeclaration& PREPROCESSOR_JOIN(GetLLMTagDeclaration_, UniqueNameWithUnderscores)();
464#define LLM_DECLARE_BOOTSTRAP_TAG_API(UniqueNameWithUnderscores, ModuleAPI) extern ModuleAPI FLLMTagDeclaration& PREPROCESSOR_JOIN(GetLLMTagDeclaration_, UniqueNameWithUnderscores)();
466typedef void*(*LLMAllocFunction)(
size_t);
505 void* Malloc(
size_t Size);
507 void* Realloc(
void* Ptr,
size_t OldSize,
size_t NewSize);
510 template <
typename T,
typename...
ArgsType>
513 T* Ptr =
reinterpret_cast<T*
>(
Alloc(
sizeof(T)));
518 template <
typename T>
524 Free(Ptr,
sizeof(T));
545 AllocatorPrivate::FBin* Bins;
550 friend struct UE::LLMPrivate::AllocatorPrivate::FPage;
551 friend struct UE::LLMPrivate::AllocatorPrivate::FBin;
580 friend class ::FTagTrace;
585struct UE_DEPRECATED(4.27,
"FLLMCustomTag was an implementation detail that has been modified, switch to FLLMTagInfo or to your own local struct")
FLLMCustomTag
599 int32 ParentTag = -1;
863 friend class UE::LLMPrivate::FLLMCsvWriter;
864 friend class UE::LLMPrivate::FLLMTracker;
865 friend class UE::LLMPrivate::FLLMThreadState;
866 friend class UE::LLMPrivate::FLLMTraceWriter;
867 friend class UE::LLMPrivate::FLLMCsvProfilerWriter;
873 UE::LLMPrivate::FTagDataArray*
TagDatas;
879 UE::LLMPrivate::FLLMTracker*
Trackers[
static_cast<int32>(ELLMTracker::Max)];
926 bool bEnabled =
false;
953 virtual FString
GetStatName()
const override {
return StatName; }
968 if (FLowLevelMemTracker::IsEnabled())
973 bool IsEnabled()
const {
return bEnabled; }
991 const UE::LLMPrivate::FTagData*
TagData;
993 bool bEnabled =
false;
1027 bool bEnabled[
static_cast<int32>(ELLMTagSet::Max)];
1077inline bool FLowLevelMemTracker::IsEnabled()
1079 return EnabledState != EEnabled::Disabled;
1084#ifndef LLM_ALLOW_ASSETS_TAGS
1085 #define LLM_ALLOW_ASSETS_TAGS 0
1088#ifndef LLM_ALLOW_UOBJECTCLASSES_TAGS
1089 #define LLM_ALLOW_UOBJECTCLASSES_TAGS 0
1093#define LLM_IF_ENABLED(...)
1094#define LLM_IS_ENABLED() false
1095#define LLM_SCOPE(...)
1096#define LLM_SCOPE_DYNAMIC(...)
1097#define LLM_TAGSET_SCOPE(...)
1098#define LLM_SCOPE_BYNAME(...)
1099#define LLM_SCOPE_BYTAG(...)
1100#define LLM_SCOPE_RENDER_RESOURCE(...)
1101#define LLM_PLATFORM_SCOPE(...)
1102#define LLM_PLATFORM_SCOPE_BYNAME(...)
1103#define LLM_PLATFORM_SCOPE_BYTAG(...)
1104#define LLM_SCOPE_CLEAR()
1105#define LLM_TAGSET_SCOPE_CLEAR(...)
1106#define LLM_REALLOC_SCOPE(...)
1107#define LLM_REALLOC_PLATFORM_SCOPE(...)
1108#define LLM_SCOPED_PAUSE_TRACKING(...)
1109#define LLM_SCOPED_PAUSE_TRACKING_FOR_TRACKER(...)
1110#define LLM_SCOPED_PAUSE_TRACKING_WITH_ENUM_AND_AMOUNT(...)
1111#define LLM_SCOPED_PAUSE_TRACKING_WITH_ENUM_AND_AMOUNT_BYTAG(...)
1112#define LLM_DUMP_TAG()
1113#define LLM_DUMP_PLATFORM_TAG()
1114#define LLM_DEFINE_TAG(...)
1115#define LLM_DEFINE_STATIC_TAG(...)
1116#define LLM_DECLARE_TAG(...)
1117#define LLM_DECLARE_TAG_API(...)
1118#define LLM_DEFINE_BOOTSTRAP_TAG(...)
1119#define LLM_SCOPE_BY_BOOTSTRAP_TAG(...)
1120#define LLM_DECLARE_BOOTSTRAP_TAG(...)
1121#define LLM_DECLARE_BOOTSTRAP_TAG_API(...)
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
bool ProcessCommandLine()
Definition LaunchWindows.cpp:147
void Init()
Definition LockFreeList.h:4
#define LLM(...)
Definition LowLevelMemTracker.h:1092
T * New(FMemStackBase &Mem, int32 Count=1, int32 Align=DEFAULT_ALIGNMENT)
Definition MemStack.h:259
void Construct(const FArguments &InArgs)
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
uint32 Size
Definition VulkanMemory.cpp:4034
Definition MemoryBase.h:99
Definition NameTypes.h:617
Definition OutputDevice.h:133
Definition RHI.Build.cs:8
Definition ArrayView.h:139
Definition UnrealString.h.inl:34
bool IsEnabled()
Definition IAudioLinkFactory.cpp:13
const FStructTracker ** GetTracker(const uint32 SerializationHash)
Definition StructTypeBitSet.cpp:29
void Initialise(bool wait_for_connect=false)
UE::FRecursiveMutex Mutex
Definition MeshPaintVirtualTexture.cpp:164
FORCEINLINE T * Get(const FObjectPtr &ObjectPtr)
Definition ObjectPtr.h:426
void Destruct(void *Dest)
Definition Class.h:1265
Definition ParallelFor.h:40
Definition AdvancedWidgetsModule.cpp:13
FPThreadsRecursiveMutex FPlatformRecursiveMutex
Definition AndroidPlatformMutex.h:12
FPThreadsSharedMutex FPlatformSharedMutex
Definition AndroidPlatformMutex.h:13
@ Exec
This function is executable from the command line.
Definition ObjectMacros.h:962
@ DisplayName
[ClassMetadata] [PropertyMetadata] [FunctionMetadata] The name to display for this class,...
Definition ObjectMacros.h:1240
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131