Vulkan® Memory Allocator

The industry-leading, open source, memory allocation library for the Vulkan API.

The Vulkan® Memory Allocator (VMA) library provides a simple and easy to integrate API to help you allocate memory for Vulkan® buffer and image storage.

Download the latest version - v3.0.0

*We recommend using the code from the master branch.

This release adds the following features:

  • Added new API for selecting preferred memory type
  • Added new defragmentation API and algorithm, replacing the old one.
  • Redesigned API for statistics, replacing the old one.
  • Added “Virtual allocator” feature – possibility to use core allocation algorithms for allocation of custom memory, not necessarily Vulkan device memory.
  • VmaAllocation now keeps both void* pUserData and char* pName . Added function vmaSetAllocationName and member VmaAllocationInfo::pName .
  • Clarified and cleaned up various ways of importing Vulkan functions. Added members VmaVulkanFunctions::vkGetInstanceProcAddr , and vkGetDeviceProcAddr , which are now required when using VMA_DYNAMIC_VULKAN_FUNCTIONS .

Benefits

The library is battle-ready, and integrated into the majority of Vulkan® game titles on PC, as well as the Google Filament rendering engine, the official Khronos® Group Vulkan® Samples, and many other open source projects for Android™, Linux, MacOS, and Windows®.

This library can help game developers to manage memory allocations and resource creation by offering some higher-level functions:

  1. Functions that help to choose correct and optimal memory type based on intended usage of the memory.
    • Required or preferred traits of the memory are expressed using higher-level description comparing to Vulkan flags.
  2. Functions that allocate memory blocks, reserve and return parts of them (VkDeviceMemory + offset + size) to the user.
    • Library keeps track of allocated memory blocks, used and unused ranges inside them, finds best matching unused ranges for new allocations, respects all the rules of alignment and buffer/image granularity.
  3. Functions that can create an image/buffer, allocate memory for it and bind them together – all in one call.

Additional features

Version history

  • New, more powerful defragmentation:
    • Added structure VmaDefragmentationInfo2, functions vmaDefragmentationBeginvmaDefragmentationEnd.
    • Added support for defragmentation of GPU memory.
    • Defragmentation of CPU memory now uses memmove, so it can move data to overlapping regions.
    • Defragmentation of CPU memory is now available for memory types that are HOST_VISIBLE but not HOST_COHERENT.
    • Added structure member VmaVulkanFunctions::vkCmdCopyBuffer.
    • Major internal changes in defragmentation algorithm.
    • VmaReplay: added parameters: --DefragmentAfterLine--DefragmentationFlags.
    • Old interface (structure VmaDefragmentationInfo, function vmaDefragment) is now deprecated.
  • Added buddy algorithm, available for custom pools – flag VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT.
  • Added convenience functions for multiple allocations and deallocations at once, intended for sparse binding resources – functions vmaAllocateMemoryPagesvmaFreeMemoryPages.
  • Added function that tries to resize existing allocation in place: vmaResizeAllocation.
  • Added flags for allocation strategy: VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BITVMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT
    VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT, and their aliases: VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT
    VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BITVMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT.
  • Added linear allocation algorithm, accessible for custom pools, that can be used as free-at-once, stack, double stack, or ring buffer. See “Linear allocation algorithm” documentation chapter.
    • Added VMA_POOL_CREATE_LINEAR_ALGORITHM_BITVMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT.
  • Added feature to record sequence of calls to the library to a file and replay it using dedicated application. See documentation chapter “Record and replay”.
    • Recording: added VmaAllocatorCreateInfo::pRecordSettings.
    • Replaying: added VmaReplay project.
    • Recording file format: added document “docs/Recording file format.md”.
  • Improved support for non-coherent memory.
    • Added functions: vmaFlushAllocationvmaInvalidateAllocation.
    • nonCoherentAtomSize is now respected automatically.
    • Added VmaVulkanFunctions::vkFlushMappedMemoryRangesvkInvalidateMappedMemoryRanges.
  • Improved debug features related to detecting incorrect mapped memory usage. See documentation chapter “Debugging incorrect memory usage”.
    • Added debug macro VMA_DEBUG_DETECT_CORRUPTION, functions vmaCheckCorruptionvmaCheckPoolCorruption.
    • Added debug macro VMA_DEBUG_INITIALIZE_ALLOCATIONS to initialize contents of allocations with a bit pattern.
    • Changed behavior of VMA_DEBUG_MARGIN macro – it now adds margin also before first and after last allocation in a block.
  • Changed format of JSON dump returned by vmaBuildStatsString (not backward compatible!).
    • Custom pools and memory blocks now have IDs that don’t change after sorting.
    • Added properties: “CreationFrameIndex”, “LastUseFrameIndex”, “Usage”.
    • Changed VmaDumpVis tool to use these new properties for better coloring.
    • Changed behavior of vmaGetAllocationInfo and vmaTouchAllocation to update allocation.lastUseFrameIndex even if allocation cannot become lost.
  • Introduction of VmaAllocation handle that you must retrieve from allocation functions and pass to deallocation functions next to normal VkBuffer and VkImage.
  • Introduction of VmaAllocationInfo structure that you can retrieve from VmaAllocation handle to access parameters of the allocation (like VkDeviceMemory and offset) instead of retrieving them directly from allocation functions.
  • Support for reference-counted mapping and persistently mapped allocations – see vmaMapMemoryVMA_ALLOCATION_CREATE_MAPPED_BIT.
  • Support for custom memory pools – see VmaPool handle, VmaPoolCreateInfo structure, vmaCreatePool function.
  • Support for defragmentation (compaction) of allocations – see function vmaDefragment and related structures.
  • Support for “lost allocations” – see appropriate chapter on documentation Main Page.
  • Initial release.

Related to Vulkan® Memory Allocator

Vulkan Memory Allocator 2.3.0

The latest Vulkan Memory Allocator v2.3.0 adds support for Vulkan 1.1, support for query for memory budget, and support for VK_KHR_bind_memory2 extension.

AMD GPUOpen Direct3D12 Memory Allocator (D3D12MA)

D3D12 Memory Allocator

The D3D12 Memory Allocator (D3D12MA) is a C++ library that provides a simple and easy-to-integrate API to help you allocate memory for DirectX®12 buffers and textures.

Our other SDKs

AMD Capsaicin Framework

Capsaicin is a Direct3D12 framework for real-time graphics research which implements the GI-1.0 technique and a reference path-tracer.

AMD Render Pipeline Shaders (RPS) SDK

The Render Pipeline Shaders (RPS) SDK provides a framework for graphics engines to use Render Graphs with explicit APIs.

AMD Device Library eXtra

ADLX is a modern library designed to access features and functionality of AMD systems such as Display, 3D graphics, Performance Monitoring, GPU Tuning, and more.

AMD Brotli-G SDK

Brotli-G is an open-source compression/decompression standard for digital assets (based on Brotli) that is compatible with GPU hardware.

AMD HIP Ray Tracing

HIP RT is a ray tracing library for HIP, making it easy to write ray tracing applications in HIP.

AMD Orochi

Orochi is a library which loads HIP and CUDA® APIs dynamically, allowing the user to switch APIs at runtime.

AMD Radeon ProRender Developer Suite

AMD Radeon™ ProRender is our fast, easy, and incredible physically-based rendering engine built on industry standards that enables accelerated rendering on virtually any GPU, any CPU, and any OS in over a dozen leading digital content creation and CAD applications.

AMD Radeon ML

Radeon™ Machine Learning (Radeon™ ML or RML) is an AMD SDK for high-performance deep learning inference on GPUs.

AMD Radeon Image Filter

Harness the power of machine learning to enhance images with denoising, enabling your application to produce high quality images in a fraction of the time traditional denoising filters take.

AMD Advanced Media Framework

The Advanced Media Framework SDK provides developers with optimal access to AMD GPUs for multimedia processing.

AMD GPUOpen Direct3D12 Memory Allocator (D3D12MA)

The D3D12 Memory Allocator (D3D12MA) is a C++ library that provides a simple and easy-to-integrate API to help you allocate memory for DirectX®12 buffers and textures.

ADL

The AMD Display Library (ADL) SDK is designed to access display driver functionality for AMD Radeon™ and AMD FirePro™ graphics cards.