# Allocators Allocator helpers are used in the command buffer objects as a means to allocate memory for the latter. Regardless of the inner workings of the allocation method they use, they use the same interface in the ANGLE code. ## Allocator types There are currently two types of allocators defined in ANGLE: * Pool allocators; and * Ring buffer allocators. **ANGLE uses pool allocators by default.** To switch to ring buffer allocators, the flag `angle_enable_vulkan_shared_ring_buffer_cmd_alloc` should be enabled in GN args. This flag appears as `ANGLE_ENABLE_VULKAN_SHARED_RING_BUFFER_CMD_ALLOC` in the code, which is used to select the allocator type. ### Common interface In `SecondaryCommandBuffer.h`, the helper classes related to the selected allocator type are aliased as the following: * `SecondaryCommandMemoryAllocator` * This is the main allocator object used in the allocator helper classes. It is used as a type for some of the allocator helpers' public functions. * `SecondaryCommandBlockPool` * This allocator is used in `SecondaryCommandBuffer`. * `SecondaryCommandBlockAllocator` * This allocator is defined in `CommandBufferHelperCommon`, and by extension, is used in its derived helper classes for render pass and outside render pass command buffer helpers. ### Pool allocator helpers _Files: `AllocatorHelperPool.cpp` and `AllocatorHelperPool.h`_ - `SecondaryCommandMemoryAllocator` -> `DedicatedCommandMemoryAllocator` -> `angle::PoolAllocator` - `SecondaryCommandBlockPool` -> `DedicatedCommandBlockPool` - `SecondaryCommandBlockAllocator` -> `DedicatedCommandBlockAllocator` #### Notes * `attachAllocator()` and `detachAllocator()` functions are no-ops for the pool allocators. * Regarding `SecondaryCommandBlockAllocator` in pool allocators: * `init()` works only with pool allocators. * `hasAllocatorLinks()` always returns `false`. * `terminateLastCommandBlock()` is no-op. ### Ring buffer allocator helpers _Files: `AllocatorHelperRing.cpp` and `AllocatorHelperRing.h`_ - `SecondaryCommandMemoryAllocator` -> `SharedCommandMemoryAllocator` -> `angle::SharedRingBufferAllocator` - `SecondaryCommandBlockPool` -> `SharedCommandBlockPool` - `SecondaryCommandBlockAllocator` -> `SharedCommandBlockAllocator` #### Notes * It can be seen that in the context's initialization and destruction, and flushing the command processor's commands, there are calls to attach and detach an allocator (via `attachAllocator()` and `detachAllocator()`). Please note that **these functions are only defined for ring buffer allocators**. * Regarding `SecondaryCommandBlockAllocator` in ring buffer allocators: * `init()` is no-op. * `hasAllocatorLinks()` checks the allocator and the shared checkpoint. * `terminateLastCommandBlock()` is only used in ring buffer allocators.