UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RHIPoolAllocator.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "Containers/Array.h"
6#include "RHIFwd.h"
7#include "RHIPipeline.h"
8
11
12// Pre declares
14
19{
20};
21
22
27{
28 Buffers = 0x1,
29 RTDSTextures = 0x2,
30 NonRTDSTextures = 0x4,
32};
33
34
39{
40public:
41
42 // Reset to unknown state
43 RHICORE_API void Reset();
44
45 // Initialize options
50
51 // Free block operation (TODO: make internal)
53
54 // Alias operations (NOTE: currently not accessed when pool lock is taken, needs to be fixed)
57 FRHIPoolAllocationData* GetFirstAlias() const { return AliasAllocation; }
58
59 // Type getters
60 bool IsHead() const { return GetAllocationType() == EAllocationType::Head; }
61 bool IsFree() const { return GetAllocationType() == EAllocationType::Free; }
62 bool IsAllocated() const { return GetAllocationType() == EAllocationType::Allocated; }
63
64 // Allocation data getters
65 uint32 GetSize() const { return Size; }
66 uint32 GetAlignment() const { return Alignment; }
67 uint32 GetOffset() const { return Offset; }
68 int16 GetPoolIndex() const { return PoolIndex; }
69
70 // Linked list getters
71 FRHIPoolAllocationData* GetNext() const { return NextAllocation; }
72 FRHIPoolAllocationData* GetPrev() const { return PreviousAllocation; }
73
74 // Owner getter/setter - opaque data
75 void SetOwner(FRHIPoolResource* InOwner) { check(Owner == nullptr); Owner = InOwner; }
76 FRHIPoolResource* GetOwner() const { return Owner; }
77
78 // Unlock can be public - no lock required
79 bool IsLocked() const { return (Locked == 1); }
80 void Unlock() { check(Locked == 1); Locked = 0; }
81
82private:
83
84 // Unlock data block again - actual lock on owned allocator should be taken then
85 friend class FRHIMemoryPool;
86 friend class FRHIPoolAllocator;
87 void Lock() { check(Locked == 0); Locked = 1; }
88
90
91 // Linked list operation
92 RHICORE_API void RemoveFromLinkedList();
95
96 enum class EAllocationType : uint8
97 {
98 Unknown,
99 Free,
100 Allocated,
101 Head,
102 };
103 EAllocationType GetAllocationType() const { return (EAllocationType) Type; }
104 void SetAllocationType(EAllocationType InType) { Type = (uint32)InType; }
105
106 uint32 Size;
107 uint32 Alignment;
109 uint32 PoolIndex : 16;
110 uint32 Type : 4;
111 // Allocation data is locked after creation until initial data is filled in to make sure it's not being
112 // defragmented then. If a block is locked for read/write from CPU side then it also needs be locked.
113 // While it's defragmented then the block is also locked so make sure to wait for the GPU before destroying it
114 uint32 Locked : 1;
115 uint32 Unused : 11;
116
117 // TODO: Link list data could be stored as index into a fixed array managed by the memory pool. Then only a uin16 or uint32 is needed here to get the next and previous index
118 FRHIPoolAllocationData* PreviousAllocation;
119 FRHIPoolAllocationData* NextAllocation;
120 FRHIPoolAllocationData* AliasAllocation; // Linked list of aliases
121
123};
124
125
127// FRHIMemoryPool
129
135{
136public:
137
138 enum class EFreeListOrder
139 {
142 };
143
144 // Constructor
147
148 // Setup/Shutdown
149 RHICORE_API virtual void Init();
150 RHICORE_API virtual void Destroy();
151
152 // AllocationData functions: allocate, free, move, ...
154 RHICORE_API void Deallocate(FRHIPoolAllocationData& AllocationData);
155
156 // Bookkeeping and clearing
158
159 // Getters
160 int16 GetPoolIndex() const { return PoolIndex; }
161 uint64 GetPoolSize() const { return PoolSize; }
162 uint64 GetFreeSize() const { return FreeSize; }
163 uint64 GetUsedSize() const { return (PoolSize - FreeSize); }
168 bool IsEmpty() const { return GetUsedSize() == 0; }
169 bool IsFull() const { return FreeSize == 0; }
170
171 // Static public helper functions
174
175protected:
176
177 // Free block management helper function
181
182 // Get/Release allocation data blocks
185
186 // Validate the linked list data - slow
187 RHICORE_API void Validate();
188
189 // Const creation members
195
196 // Stats
200
201 // Special start block to mark the beginning and the end of the linked list
203
204 // Actual Free blocks
206
207 // Allocation data pool used to reduce allocation overhead
209};
210
211
213// FRHIPoolAllocator
215
220{
221public:
222
223 // Constructor
226
227 // Setup/Shutdown
228 RHICORE_API void Initialize();
229 RHICORE_API void Destroy();
230
231 // Defrag & cleanup operation
233
234 // Stats
236
237protected:
238
239 // Supported allocator operations
242
243 RHICORE_API void SortPools();
244
245 // Helper function to create a new platform specific pool
247
248 // Handle a rhi specific defrag op
249 friend class FRHIMemoryPool;
251
252 // Const creation members - used to create new pools
257 const bool bDefragEnabled;
258
259 // Critical section to lock access to the pools
261
262 // Actual pools managing each a linked list of allocations
264
265 // Last defrag pool index - defrag is time slices to reduce CPU overhead
267
268 // Allocation order of the pools when performing new allocations
269 // Can' sort the pools directly because pool index is stored in the allocation info
271
272 // Stats
274};
275
276
277#if UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_4
278#include "RHI.h"
279#include "RHIResources.h"
280#endif
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
ERHIPoolResourceTypes
Resource type supported by the pools (can be any or all)
Definition RHIPoolAllocator.h:27
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint32 Offset
Definition VulkanMemory.cpp:4033
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 RHICommandList.h:455
Definition RHIResources.h:5541
Pool which stores for each allocation the previous and next allocation. Each block is either free or ...
Definition RHIPoolAllocator.h:135
uint32 GetAllocatedBlocks() const
Definition RHIPoolAllocator.h:165
RHICORE_API void RemoveFromFreeBlocks(FRHIPoolAllocationData *InFreeBlock)
Definition RHIPoolAllocator.cpp:507
uint32 GetAlignmentWaste() const
Definition RHIPoolAllocator.h:164
ERHIPoolResourceTypes GetSupportedResourceTypes() const
Definition RHIPoolAllocator.h:166
static RHICORE_API uint32 GetAlignedSize(uint32 InSizeInBytes, uint32 InPoolAlignment, uint32 InAllocationAlignment)
Definition RHIPoolAllocator.cpp:251
uint32 AllocatedBlocks
Definition RHIPoolAllocator.h:199
int16 PoolIndex
Definition RHIPoolAllocator.h:190
TArray< FRHIPoolAllocationData * > AllocationDataPool
Definition RHIPoolAllocator.h:208
RHICORE_API int32 FindFreeBlock(uint32 InSizeInBytes, uint32 InAllocationAlignment) const
Definition RHIPoolAllocator.cpp:464
virtual RHICORE_API void Init()
Definition RHIPoolAllocator.cpp:310
int16 GetPoolIndex() const
Definition RHIPoolAllocator.h:160
static RHICORE_API uint32 GetAlignedOffset(uint32 InOffset, uint32 InPoolAlignment, uint32 InAllocationAlignment)
Definition RHIPoolAllocator.cpp:261
RHICORE_API void Validate()
Definition RHIPoolAllocator.cpp:591
virtual RHICORE_API void Destroy()
Definition RHIPoolAllocator.cpp:334
const uint64 PoolSize
Definition RHIPoolAllocator.h:191
bool IsResourceTypeSupported(ERHIPoolResourceTypes InType) const
Definition RHIPoolAllocator.h:167
uint64 GetPoolSize() const
Definition RHIPoolAllocator.h:161
uint64 AligmnentWaste
Definition RHIPoolAllocator.h:198
RHICORE_API bool TryAllocate(uint32 InSizeInBytes, uint32 InAllocationAlignment, ERHIPoolResourceTypes InAllocationResourceType, FRHIPoolAllocationData &AllocationData)
Definition RHIPoolAllocator.cpp:352
RHICORE_API void ReleaseAllocationData(FRHIPoolAllocationData *InData)
Definition RHIPoolAllocator.cpp:577
EFreeListOrder
Definition RHIPoolAllocator.h:139
bool IsEmpty() const
Definition RHIPoolAllocator.h:168
virtual RHICORE_API ~FRHIMemoryPool()
Definition RHIPoolAllocator.cpp:294
RHICORE_API void TryClear(FRHIContextArray const &Contexts, FRHIPoolAllocator *InAllocator, uint32 InMaxCopySize, uint32 &CopySize, const TArray< FRHIMemoryPool * > &InTargetPools)
Definition RHIPoolAllocator.cpp:424
bool IsFull() const
Definition RHIPoolAllocator.h:169
const EFreeListOrder FreeListOrder
Definition RHIPoolAllocator.h:194
FRHIPoolAllocationData HeadBlock
Definition RHIPoolAllocator.h:202
RHICORE_API FRHIPoolAllocationData * GetNewAllocationData()
Definition RHIPoolAllocator.cpp:571
RHICORE_API void Deallocate(FRHIPoolAllocationData &AllocationData)
Definition RHIPoolAllocator.cpp:399
uint64 FreeSize
Definition RHIPoolAllocator.h:197
uint64 GetUsedSize() const
Definition RHIPoolAllocator.h:163
RHICORE_API FRHIPoolAllocationData * AddToFreeBlocks(FRHIPoolAllocationData *InFreeBlock)
Definition RHIPoolAllocator.cpp:520
uint64 GetFreeSize() const
Definition RHIPoolAllocator.h:162
const uint32 PoolAlignment
Definition RHIPoolAllocator.h:192
const ERHIPoolResourceTypes SupportedResourceTypes
Definition RHIPoolAllocator.h:193
TArray< FRHIPoolAllocationData * > FreeBlocks
Definition RHIPoolAllocator.h:205
Manages an array of FRHIMemoryPool and supports defragmentation between multiple pools.
Definition RHIPoolAllocator.h:220
int32 LastDefragPoolIndex
Definition RHIPoolAllocator.h:266
const uint64 DefaultPoolSize
Definition RHIPoolAllocator.h:253
RHICORE_API bool TryAllocateInternal(uint32 InSizeInBytes, uint32 InAllocationAlignment, ERHIPoolResourceTypes InAllocationResourceType, FRHIPoolAllocationData &AllocationData)
Definition RHIPoolAllocator.cpp:691
RHICORE_API void UpdateMemoryStats(uint32 &IOMemoryAllocated, uint32 &IOMemoryUsed, uint32 &IOMemoryFree, uint32 &IOMemoryEndFree, uint32 &IOAlignmentWaste, uint32 &IOAllocatedPageCount, uint32 &IOFullPageCount)
Definition RHIPoolAllocator.cpp:888
TArray< FRHIMemoryPool * > Pools
Definition RHIPoolAllocator.h:263
FCriticalSection CS
Definition RHIPoolAllocator.h:260
virtual bool HandleDefragRequest(FRHIContextArray const &Contexts, FRHIPoolAllocationData *InSourceBlock, FRHIPoolAllocationData &InTmpTargetBlock)=0
RHICORE_API void Initialize()
Definition RHIPoolAllocator.cpp:670
const uint32 PoolAlignment
Definition RHIPoolAllocator.h:254
const uint64 MaxAllocationSize
Definition RHIPoolAllocator.h:255
TArray< uint32 > PoolAllocationOrder
Definition RHIPoolAllocator.h:270
virtual FRHIMemoryPool * CreateNewPool(int16 InPoolIndex, uint32 InMinimumAllocationSize, ERHIPoolResourceTypes InAllocationResourceType)=0
RHICORE_API void DeallocateInternal(FRHIPoolAllocationData &AllocationData)
Definition RHIPoolAllocator.cpp:734
RHICORE_API void SortPools()
Definition RHIPoolAllocator.cpp:744
RHICORE_API void Defrag(FRHIContextArray const &Contexts, uint32 InMaxCopySize, uint32 &CurrentCopySize)
Definition RHIPoolAllocator.cpp:773
const bool bDefragEnabled
Definition RHIPoolAllocator.h:257
const FRHIMemoryPool::EFreeListOrder FreeListOrder
Definition RHIPoolAllocator.h:256
RHICORE_API void Destroy()
Definition RHIPoolAllocator.cpp:675
virtual RHICORE_API ~FRHIPoolAllocator()
Definition RHIPoolAllocator.cpp:664
uint32 TotalAllocatedBlocks
Definition RHIPoolAllocator.h:273
Owner of the pool allocation data which needs to handle memory move operations.
Definition RHIPoolAllocator.h:19
Definition Array.h:670
Pool allocator internal data.
Definition RHIPoolAllocator.h:39
FRHIPoolAllocationData * GetNext() const
Definition RHIPoolAllocator.h:71
FRHIPoolResource * GetOwner() const
Definition RHIPoolAllocator.h:76
RHICORE_API void RemoveAlias()
Definition RHIPoolAllocator.cpp:202
RHICORE_API void MoveFrom(FRHIPoolAllocationData &InAllocated, bool InLocked)
Definition RHIPoolAllocator.cpp:88
RHICORE_API void InitAsAllocated(uint32 InSize, uint32 InPoolAlignment, uint32 InAllocationAlignment, FRHIPoolAllocationData *InFree)
Definition RHIPoolAllocator.cpp:68
bool IsLocked() const
Definition RHIPoolAllocator.h:79
RHICORE_API void AddAlias(FRHIPoolAllocationData *InOther)
Definition RHIPoolAllocator.cpp:188
int16 GetPoolIndex() const
Definition RHIPoolAllocator.h:68
RHICORE_API void InitAsFree(int16 InPoolIndex, uint32 InSize, uint32 InAlignment, uint32 InOffset)
Definition RHIPoolAllocator.cpp:56
FRHIPoolAllocationData * GetPrev() const
Definition RHIPoolAllocator.h:72
uint32 GetSize() const
Definition RHIPoolAllocator.h:65
bool IsAllocated() const
Definition RHIPoolAllocator.h:62
bool IsFree() const
Definition RHIPoolAllocator.h:61
void SetOwner(FRHIPoolResource *InOwner)
Definition RHIPoolAllocator.h:75
uint32 GetOffset() const
Definition RHIPoolAllocator.h:67
RHICORE_API void MarkFree(uint32 InPoolAlignment, uint32 InAllocationAlignment)
Definition RHIPoolAllocator.cpp:133
void Unlock()
Definition RHIPoolAllocator.h:80
RHICORE_API void Reset()
Definition RHIPoolAllocator.cpp:31
RHICORE_API void InitAsHead(int16 InPoolIndex)
Definition RHIPoolAllocator.cpp:46
FRHIPoolAllocationData * GetFirstAlias() const
Definition RHIPoolAllocator.h:57
bool IsHead() const
Definition RHIPoolAllocator.h:60
uint32 GetAlignment() const
Definition RHIPoolAllocator.h:66
Definition ContainerAllocationPolicies.h:242