From 594a56260f0af9f1d32f0e7217d90c98b109911a Mon Sep 17 00:00:00 2001 From: Adam Sawicki Date: Tue, 21 Nov 2017 15:01:29 +0100 Subject: [PATCH] Added VmaAllocationCreateInfo::memoryTypeBits. Wrote more documentation, including new page "Choosing memory type". --- bin/VulkanSample_Release_2015.exe | Bin 101888 -> 102400 bytes docs/html/choosing_memory_type.html | 103 ++++++++ docs/html/functions.html | 3 + docs/html/functions_vars.html | 3 + docs/html/index.html | 1 + docs/html/search/all_2.js | 1 + docs/html/search/all_6.js | 1 + docs/html/search/pages_1.js | 1 + docs/html/search/variables_4.js | 1 + ...ct_vma_allocation_create_info-members.html | 11 +- .../struct_vma_allocation_create_info.html | 41 +++- docs/html/vk__mem__alloc_8h.html | 9 +- docs/html/vk__mem__alloc_8h_source.html | 219 +++++++++--------- docs/html/vk_khr_dedicated_allocation.html | 8 +- src/vk_mem_alloc.h | 203 ++++++++++++++-- 15 files changed, 445 insertions(+), 160 deletions(-) create mode 100644 docs/html/choosing_memory_type.html diff --git a/bin/VulkanSample_Release_2015.exe b/bin/VulkanSample_Release_2015.exe index 1fd8967cc646a37e2175cbcd9ec747b5b301bfd1..ae08c334fbb99cb942e4aee2ee79b52011da7a3f 100644 GIT binary patch delta 40539 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

9A(`3C$=)m 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 + + + + + + +Vulkan Memory Allocator: Choosing memory type + + + + + + + + + +

+
+ + + + + + +
+
Vulkan Memory Allocator +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Choosing memory type
+
+
+

Physical devices in Vulkan support various combinations of memory heaps and types. Help with choosing correct and optimal memory type for your specific resource is one of the key features of this library. You can use it by filling appropriate members of VmaAllocationCreateInfo structure, as described below. You can also combine multiple methods.

+
    +
  1. If you just want to find memory type index that meets your requirements, you can use function vmaFindMemoryTypeIndex().
  2. +
  3. If you want to allocate a region of device memory without association with any specific image or buffer, you can use function vmaAllocateMemory(). Usage of this function is not recommended and usually not needed.
  4. +
  5. If you already have a buffer or an image created, you want to allocate memory for it and then you will bind it yourself, you can use function vmaAllocateMemoryForBuffer(), vmaAllocateMemoryForImage().
  6. +
  7. If you want to create a buffer or an image, allocate memory for it and bind them together, all in one call, you can use function vmaCreateBuffer(), vmaCreateImage(). This is the recommended way to use this library.
  8. +
+

When using 3. or 4., the library internally queries Vulkan for memory types supported for that buffer or image (function vkGetBufferMemoryRequirements()) and uses only one of these types.

+

If no memory type can be found that meets all the requirements, these functions return VK_ERROR_FEATURE_NOT_PRESENT.

+

You can leave VmaAllocationCreateInfo structure completely filled with zeros. It means no requirements are specified for memory type. It is valid, although not very useful.

+

+Usage

+

The easiest way to specify memory requirements is to fill member VmaAllocationCreateInfo::usage using one of the values of enum VmaMemoryUsage. It defines high level, common usage types.

+

For example, if you want to create a uniform buffer that will be filled using transfer only once or infrequently and used for rendering every frame, you can do it using following code:

+
VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
bufferInfo.size = 65536;
bufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
VmaAllocationCreateInfo allocInfo = {};
VkBuffer buffer;
VmaAllocation allocation;
vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);

+Required and preferred flags

+

You can specify more detailed requirements by filling members VmaAllocationCreateInfo::requiredFlags and VmaAllocationCreateInfo::preferredFlags with a combination of bits from enum VkMemoryPropertyFlags. For example, if you want to create a buffer that will be persistently mapped on host (so it must be HOST_VISIBLE) and preferably will also be HOST_COHERENT and HOST_CACHED, use following code:

+
VmaAllocationCreateInfo allocInfo = {};
allocInfo.requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
allocInfo.preferredFlags = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
VkBuffer buffer;
VmaAllocation allocation;
vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);

A memory type is chosen that has all the required flags and as many preferred flags set as possible.

+

If you use VmaAllocationCreateInfo::usage, it is just internally converted to a set of required and preferred flags.

+

+Explicit memory types

+

If you inspected memory types available on the physical device and you have a preference for memory types that you want to use, you can fill member VmaAllocationCreateInfo::memoryTypeBits. It is a bit mask, where each bit set means that a memory type with that index is allowed to be used for the allocation. Special value 0, just like UINT32_MAX, means there are no restrictions to memory type index.

+

Please note that this member is NOT just a memory type index. Still you can use it to choose just one, specific memory type. For example, if you already determined that your buffer should be created in memory type 2, use following code:

+
uint32_t memoryTypeIndex = 2;
VmaAllocationCreateInfo allocInfo = {};
allocInfo.memoryTypeBits = 1u << memoryTypeIndex;
VkBuffer buffer;
VmaAllocation allocation;
vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);

+Custom memory pools

+

If you allocate from custom memory pool, all the ways of specifying memory requirements described above are not applicable and the aforementioned members of VmaAllocationCreateInfo structure are ignored. Memory type is selected explicitly when creating the pool and then used to make all the allocations from that pool. For further details, see Custom memory pools.

+
+ + + + diff --git a/docs/html/functions.html b/docs/html/functions.html index bb64a0b..b79b1aa 100644 --- a/docs/html/functions.html +++ b/docs/html/functions.html @@ -139,6 +139,9 @@ $(function() { : VmaAllocationInfo , VmaStats +
  • memoryTypeBits +: VmaAllocationCreateInfo +
  • memoryTypeIndex : VmaPoolCreateInfo
  • diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html index eb1456a..fc26998 100644 --- a/docs/html/functions_vars.html +++ b/docs/html/functions_vars.html @@ -139,6 +139,9 @@ $(function() { : VmaAllocationInfo , VmaStats +
  • memoryTypeBits +: VmaAllocationCreateInfo +
  • memoryTypeIndex : VmaPoolCreateInfo
  • diff --git a/docs/html/index.html b/docs/html/index.html index fda4013..fd509d2 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -70,6 +70,7 @@ License: MIT

    • User guide
      • Quick start
      • +
      • Choosing memory type
      • Memory mapping
      • Custom memory pools
      • Defragmentation
      • diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js index bf1d77b..e5f807d 100644 --- a/docs/html/search/all_2.js +++ b/docs/html/search/all_2.js @@ -1,5 +1,6 @@ var searchData= [ + ['choosing_20memory_20type',['Choosing memory type',['../choosing_memory_type.html',1,'index']]], ['configuration',['Configuration',['../configuration.html',1,'index']]], ['custom_20memory_20pools',['Custom memory pools',['../custom_memory_pools.html',1,'index']]] ]; diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js index 0140fe2..8e80e1a 100644 --- a/docs/html/search/all_6.js +++ b/docs/html/search/all_6.js @@ -6,6 +6,7 @@ var searchData= ['memory_20mapping',['Memory mapping',['../memory_mapping.html',1,'index']]], ['memoryheap',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]], ['memorytype',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]], + ['memorytypebits',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]], ['memorytypeindex',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]], ['minblockcount',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]] ]; diff --git a/docs/html/search/pages_1.js b/docs/html/search/pages_1.js index bf1d77b..e5f807d 100644 --- a/docs/html/search/pages_1.js +++ b/docs/html/search/pages_1.js @@ -1,5 +1,6 @@ var searchData= [ + ['choosing_20memory_20type',['Choosing memory type',['../choosing_memory_type.html',1,'index']]], ['configuration',['Configuration',['../configuration.html',1,'index']]], ['custom_20memory_20pools',['Custom memory pools',['../custom_memory_pools.html',1,'index']]] ]; diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js index 1002ad2..96a5bce 100644 --- a/docs/html/search/variables_4.js +++ b/docs/html/search/variables_4.js @@ -5,6 +5,7 @@ var searchData= ['maxbytestomove',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]], ['memoryheap',['memoryHeap',['../struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0',1,'VmaStats']]], ['memorytype',['memoryType',['../struct_vma_stats.html#a13e3caf754be79352c42408756309331',1,'VmaStats::memoryType()'],['../struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5',1,'VmaAllocationInfo::memoryType()']]], + ['memorytypebits',['memoryTypeBits',['../struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055',1,'VmaAllocationCreateInfo']]], ['memorytypeindex',['memoryTypeIndex',['../struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319',1,'VmaPoolCreateInfo']]], ['minblockcount',['minBlockCount',['../struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae',1,'VmaPoolCreateInfo']]] ]; diff --git a/docs/html/struct_vma_allocation_create_info-members.html b/docs/html/struct_vma_allocation_create_info-members.html index 1b63856..d9dba01 100644 --- a/docs/html/struct_vma_allocation_create_info-members.html +++ b/docs/html/struct_vma_allocation_create_info-members.html @@ -66,11 +66,12 @@ $(function() {

        This is the complete list of members for VmaAllocationCreateInfo, including all inherited members.

        - - - - - + + + + + +
        flagsVmaAllocationCreateInfo
        poolVmaAllocationCreateInfo
        preferredFlagsVmaAllocationCreateInfo
        pUserDataVmaAllocationCreateInfo
        requiredFlagsVmaAllocationCreateInfo
        usageVmaAllocationCreateInfo
        memoryTypeBitsVmaAllocationCreateInfo
        poolVmaAllocationCreateInfo
        preferredFlagsVmaAllocationCreateInfo
        pUserDataVmaAllocationCreateInfo
        requiredFlagsVmaAllocationCreateInfo
        usageVmaAllocationCreateInfo