Loading...
Searching...
No Matches
Library initialization

API elements related to the initialization and management of the entire library, especially VmaAllocator object. More...

## Classes

struct | VmaDeviceMemoryCallbacks
| Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory. More...
struct | VmaVulkanFunctions
| Pointers to some Vulkan functions - a subset used by the library. More...
struct | VmaAllocatorCreateInfo
| Description of a Allocator to be created. More...
struct | VmaAllocatorInfo
| Information about existing VmaAllocator object. More...
struct | VmaAllocator
| Represents main object of this library initialized. More...

## Typedefs

typedef enum VmaAllocatorCreateFlagBits | VmaAllocatorCreateFlagBits
| Flags for created VmaAllocator.
typedef VkFlags | VmaAllocatorCreateFlags
| See VmaAllocatorCreateFlagBits.
typedef void(VKAPI_PTR * | PFN_vmaAllocateDeviceMemoryFunction) (VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size, void *pUserData)
| Callback function called after successful vkAllocateMemory.
typedef void(VKAPI_PTR * | PFN_vmaFreeDeviceMemoryFunction) (VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size, void *pUserData)
| Callback function called before vkFreeMemory.
typedef struct VmaDeviceMemoryCallbacks | VmaDeviceMemoryCallbacks
| Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory.
typedef struct VmaVulkanFunctions | VmaVulkanFunctions
| Pointers to some Vulkan functions - a subset used by the library.
typedef struct VmaAllocatorCreateInfo | VmaAllocatorCreateInfo
| Description of a Allocator to be created.
typedef struct VmaAllocatorInfo | VmaAllocatorInfo
| Information about existing VmaAllocator object.

## Enumerations

enum

VmaAllocatorCreateFlagBits {
VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT = 0x00000001 , VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT = 0x00000002 , VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT = 0x00000004 , VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT = 0x00000008 ,
VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT = 0x00000010 , VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT = 0x00000020 , VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT = 0x00000040 , VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE4_BIT = 0x00000080 ,
VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT = 0x00000100 , VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT = 0x00000200 , VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
}

| Flags for created VmaAllocator. More...

## Functions

VkResult | vmaImportVulkanFunctionsFromVolk (const VmaAllocatorCreateInfo *pAllocatorCreateInfo, VmaVulkanFunctions *pDstVulkanFunctions)
| Fully initializes pDstVulkanFunctions structure with Vulkan functions needed by VMA using volk library.
VkResult | vmaCreateAllocator (const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)
| Creates VmaAllocator object.
void | vmaDestroyAllocator (VmaAllocator allocator)
| Destroys allocator object.
void | vmaGetAllocatorInfo (VmaAllocator allocator, VmaAllocatorInfo *pAllocatorInfo)
| Returns information about existing VmaAllocator object - handle to Vulkan device etc.
void | vmaGetPhysicalDeviceProperties (VmaAllocator allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)
void | vmaGetMemoryProperties (VmaAllocator allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)
void | vmaGetMemoryTypeProperties (VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)
| Given Memory Type Index, returns Property Flags of this memory type.
void | vmaSetCurrentFrameIndex (VmaAllocator allocator, uint32_t frameIndex)
| Sets index of the current frame.

## Detailed Description

API elements related to the initialization and management of the entire library, especially VmaAllocator object.

## Typedef Documentation

## PFN_vmaAllocateDeviceMemoryFunction

typedef void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction) (VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size, void *pUserData)

Callback function called after successful vkAllocateMemory.

## PFN_vmaFreeDeviceMemoryFunction

typedef void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction) (VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size, void *pUserData)

Callback function called before vkFreeMemory.

## VmaAllocatorCreateFlagBits

typedef enum VmaAllocatorCreateFlagBits VmaAllocatorCreateFlagBits

Flags for created VmaAllocator.

## VmaAllocatorCreateFlags

typedef VkFlags VmaAllocatorCreateFlags

See VmaAllocatorCreateFlagBits.

## VmaAllocatorCreateInfo

typedef struct VmaAllocatorCreateInfo VmaAllocatorCreateInfo

Description of a Allocator to be created.

## VmaAllocatorInfo

typedef struct VmaAllocatorInfo VmaAllocatorInfo

Information about existing VmaAllocator object.

## VmaDeviceMemoryCallbacks

typedef struct VmaDeviceMemoryCallbacks VmaDeviceMemoryCallbacks

Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory.

Provided for informative purpose, e.g. to gather statistics about number of allocations or total amount of memory allocated in Vulkan.

Used in VmaAllocatorCreateInfo::pDeviceMemoryCallbacks.

## VmaVulkanFunctions

typedef struct VmaVulkanFunctions VmaVulkanFunctions

Pointers to some Vulkan functions - a subset used by the library.

Used in VmaAllocatorCreateInfo::pVulkanFunctions.

## Enumeration Type Documentation

## VmaAllocatorCreateFlagBits

enum VmaAllocatorCreateFlagBits

Flags for created VmaAllocator.

Enumerator
VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT | Allocator and all objects created from it will not be synchronized internally, so you must guarantee they are used from only one thread at a time or synchronized externally by you. Using this flag may increase performance because internal mutexes are not used.

VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT

Enables usage of VK_KHR_dedicated_allocation extension.

The flag works only if VmaAllocatorCreateInfo::vulkanApiVersion == VK_API_VERSION_1_0. When it is VK_API_VERSION_1_1, the flag is ignored because the extension has been promoted to Vulkan 1.1.

Using this extension will automatically allocate dedicated blocks of memory for some buffers and images instead of suballocating place for them out of bigger memory blocks (as if you explicitly used VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT flag) when it is recommended by the driver. It may improve performance on some GPUs.

You may set this flag only if you found out that following device extensions are supported, you enabled them while creating Vulkan device passed as VmaAllocatorCreateInfo::device, and you want them to be used internally by this library:

- VK_KHR_get_memory_requirements2 (device extension)
- VK_KHR_dedicated_allocation (device extension)

When this flag is set, you can experience following warnings reported by Vulkan validation layer. You can ignore them.

> vkBindBufferMemory(): Binding memory to buffer 0x2d but vkGetBufferMemoryRequirements() has not been called on that buffer.

VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT

Enables usage of VK_KHR_bind_memory2 extension.

The flag works only if VmaAllocatorCreateInfo::vulkanApiVersion == VK_API_VERSION_1_0. When it is VK_API_VERSION_1_1, the flag is ignored because the extension has been promoted to Vulkan 1.1.

You may set this flag only if you found out that this device extension is supported, you enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device, and you want it to be used internally by this library.

The extension provides functions vkBindBufferMemory2KHR and vkBindImageMemory2KHR, which allow to pass a chain of pNext structures while binding. This flag is required if you use pNext parameter in vmaBindBufferMemory2() or vmaBindImageMemory2().

VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT

Enables usage of VK_EXT_memory_budget extension.

You may set this flag only if you found out that this device extension is supported, you enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device, and you want it to be used internally by this library, along with another instance extension VK_KHR_get_physical_device_properties2, which is required by it (or Vulkan 1.1, where this extension is promoted).

The extension provides query for current memory usage and budget, which will probably be more accurate than an estimation used by the library otherwise.

VMA_ALLOCATOR_CREATE_AMD_DEVICE_COHERENT_MEMORY_BIT

Enables usage of VK_AMD_device_coherent_memory extension.

You may set this flag only if you:

- found out that this device extension is supported and enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device,
- checked that VkPhysicalDeviceCoherentMemoryFeaturesAMD::deviceCoherentMemory is true and set it while creating the Vulkan device,
- want it to be used internally by this library.

The extension and accompanying device feature provide access to memory types with VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD and VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD flags. They are useful mostly for writing breadcrumb markers - a common method for debugging GPU crash/hang/TDR.

When the extension is not enabled, such memory types are still enumerated, but their usage is illegal. To protect from this error, if you don't create the allocator with this flag, it will refuse to allocate any memory or create a custom pool in such memory type, returning VK_ERROR_FEATURE_NOT_PRESENT.

VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT

Enables usage of "buffer device address" feature, which allows you to use function vkGetBufferDeviceAddress* to get raw GPU pointer to a buffer and pass it for usage inside a shader.

You may set this flag only if you:

1. (For Vulkan version < 1.2) Found as available and enabled device extension VK_KHR_buffer_device_address. This extension is promoted to core Vulkan 1.2.
2. Found as available and enabled device feature VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress.

When this flag is set, you can create buffers with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT using VMA. The library automatically adds VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT to allocated memory blocks wherever it might be needed.

For more information, see documentation chapter Enabling buffer device address.

VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT

Enables usage of VK_EXT_memory_priority extension in the library.

You may set this flag only if you found available and enabled this device extension, along with VkPhysicalDeviceMemoryPriorityFeaturesEXT::memoryPriority == VK_TRUE, while creating Vulkan device passed as VmaAllocatorCreateInfo::device.

When this flag is used, VmaAllocationCreateInfo::priority and VmaPoolCreateInfo::priority are used to set priorities of allocated Vulkan memory. Without it, these variables are ignored.

A priority must be a floating-point value between 0 and 1, indicating the priority of the allocation relative to other memory allocations. Larger values are higher priority. The granularity of the priorities is implementation-dependent. It is automatically passed to every call to vkAllocateMemory done by the library using structure VkMemoryPriorityAllocateInfoEXT. The value to be used for default priority is 0.5. For more details, see the documentation of the VK_EXT_memory_priority extension.

VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE4_BIT | Enables usage of VK_KHR_maintenance4 extension in the library. You may set this flag only if you found available and enabled this device extension, while creating Vulkan device passed as VmaAllocatorCreateInfo::device.
VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT | Enables usage of VK_KHR_maintenance5 extension in the library. You should set this flag if you found available and enabled this device extension, while creating Vulkan device passed as VmaAllocatorCreateInfo::device.
VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT | Enables usage of VK_KHR_external_memory_win32 extension in the library. You should set this flag if you found available and enabled this device extension, while creating Vulkan device passed as VmaAllocatorCreateInfo::device. For more information, see Interop with other graphics APIs.
VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM |

## Function Documentation

## vmaCreateAllocator()

VkResult vmaCreateAllocator | ( | const VmaAllocatorCreateInfo * | pCreateInfo,
|  | VmaAllocator * | pAllocator )

Creates VmaAllocator object.

## vmaDestroyAllocator()

void vmaDestroyAllocator | ( | VmaAllocator | allocator | ) |

Destroys allocator object.

## vmaGetAllocatorInfo()

void vmaGetAllocatorInfo | ( | VmaAllocator | allocator,
|  | VmaAllocatorInfo * | pAllocatorInfo )

Returns information about existing VmaAllocator object - handle to Vulkan device etc.

It might be useful if you want to keep just the VmaAllocator handle and fetch other required handles to VkPhysicalDevice, VkDevice etc. every time using this function.

## vmaGetMemoryProperties()

void vmaGetMemoryProperties | ( | VmaAllocator | allocator,
|  | const VkPhysicalDeviceMemoryProperties ** | ppPhysicalDeviceMemoryProperties )

PhysicalDeviceMemoryProperties are fetched from physicalDevice by the allocator. You can access it here, without fetching it again on your own.

## vmaGetMemoryTypeProperties()

void vmaGetMemoryTypeProperties | ( | VmaAllocator | allocator,
|  | uint32_t | memoryTypeIndex,
|  | VkMemoryPropertyFlags * | pFlags )

Given Memory Type Index, returns Property Flags of this memory type.

This is just a convenience function. Same information can be obtained using vmaGetMemoryProperties().

## vmaGetPhysicalDeviceProperties()

void vmaGetPhysicalDeviceProperties | ( | VmaAllocator | allocator,
|  | const VkPhysicalDeviceProperties ** | ppPhysicalDeviceProperties )

PhysicalDeviceProperties are fetched from physicalDevice by the allocator. You can access it here, without fetching it again on your own.

## vmaImportVulkanFunctionsFromVolk()

VkResult vmaImportVulkanFunctionsFromVolk | ( | const VmaAllocatorCreateInfo * | pAllocatorCreateInfo,
|  | VmaVulkanFunctions * | pDstVulkanFunctions )

Fully initializes pDstVulkanFunctions structure with Vulkan functions needed by VMA using volk library.

This function is defined in VMA header only if "volk.h" was included before it.

To use this function properly:

1. Initialize volk and Vulkan:
   1. Call volkInitialize()
   2. Create VkInstance object
   3. Call volkLoadInstance()
   4. Create VkDevice object
   5. Call volkLoadDevice()
2. Fill in structure VmaAllocatorCreateInfo, especially members:
   - VmaAllocatorCreateInfo::device
   - VmaAllocatorCreateInfo::vulkanApiVersion
   - VmaAllocatorCreateInfo::flags - set appropriate flags for the Vulkan extensions you enabled
3. Create an instance of the VmaVulkanFunctions structure.
4. Call vmaImportVulkanFunctionsFromVolk(). Parameter pAllocatorCreateInfo is read to find out which functions should be fetched for appropriate Vulkan version and extensions. Parameter pDstVulkanFunctions is filled with those function pointers, or null if not applicable.
5. Attach the VmaVulkanFunctions structure to VmaAllocatorCreateInfo::pVulkanFunctions.
6. Call vmaCreateAllocator() to create the VmaAllocator object.

Example:

VmaAllocatorCreateInfo allocatorCreateInfo = {};
allocatorCreateInfo.physicalDevice = myPhysicalDevice;
allocatorCreateInfo.device = myDevice;
allocatorCreateInfo.instance = myInstance;
allocatorCreateInfo.vulkanApiVersion = VK_API_VERSION_1_3;
allocatorCreateInfo.flags = VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT |
VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT |
VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT;
VmaVulkanFunctions vulkanFunctions;
VkResult res = vmaImportVulkanFunctionsFromVolk(&allocatorCreateInfo, &vulkanFunctions);
// Check res...
allocatorCreateInfo.pVulkanFunctions = &vulkanFunctions;
VmaAllocator allocator;
res = vmaCreateAllocator(&allocatorCreateInfo, &allocator);
// Check res...
vmaCreateAllocator
VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)
Creates VmaAllocator object.
vmaImportVulkanFunctionsFromVolk
VkResult vmaImportVulkanFunctionsFromVolk(const VmaAllocatorCreateInfo *pAllocatorCreateInfo, VmaVulkanFunctions *pDstVulkanFunctions)
Fully initializes pDstVulkanFunctions structure with Vulkan functions needed by VMA using volk librar...
VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT
@ VMA_ALLOCATOR_CREATE_KHR_EXTERNAL_MEMORY_WIN32_BIT
Definition vk_mem_alloc.h:496
VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT
@ VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT
Definition vk_mem_alloc.h:420
VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT
@ VMA_ALLOCATOR_CREATE_EXT_MEMORY_PRIORITY_BIT
Definition vk_mem_alloc.h:473
VmaAllocatorCreateInfo
Description of a Allocator to be created.
Definition vk_mem_alloc.h:1085
VmaAllocatorCreateInfo::physicalDevice
VkPhysicalDevice physicalDevice
Vulkan physical device.
Definition vk_mem_alloc.h:1090
VmaAllocatorCreateInfo::flags
VmaAllocatorCreateFlags flags
Flags for created allocator. Use VmaAllocatorCreateFlagBits enum.
Definition vk_mem_alloc.h:1087
VmaAllocatorCreateInfo::pVulkanFunctions
const VmaVulkanFunctions * pVulkanFunctions
Pointers to Vulkan functions. Can be null.
Definition vk_mem_alloc.h:1133
VmaAllocatorCreateInfo::instance
VkInstance instance
Handle to Vulkan instance object.
Definition vk_mem_alloc.h:1138
VmaAllocatorCreateInfo::device
VkDevice device
Vulkan device.
Definition vk_mem_alloc.h:1093
VmaAllocatorCreateInfo::vulkanApiVersion
uint32_t vulkanApiVersion
Optional. Vulkan version that the application uses.
Definition vk_mem_alloc.h:1149
VmaAllocator
Represents main object of this library initialized.
VmaVulkanFunctions
Pointers to some Vulkan functions - a subset used by the library.
Definition vk_mem_alloc.h:1028

Internally in this function, pointers to functions related to the entire Vulkan instance are fetched using global function definitions, while pointers to functions related to the Vulkan device are fetched using volkLoadDeviceTable() for given pAllocatorCreateInfo->device.

## vmaSetCurrentFrameIndex()

void vmaSetCurrentFrameIndex | ( | VmaAllocator | allocator,
|  | uint32_t | frameIndex )

Sets index of the current frame.