blob: 92ea50b93a59c82875be6e213bc7a8c5a1dfb6b4 [file] [log] [blame] [view]
# 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.