Merge branch 'v2_release'
diff --git a/bin/VulkanSample_Release_2015.exe b/bin/VulkanSample_Release_2015.exe
deleted file mode 100644
index 381625f..0000000
--- a/bin/VulkanSample_Release_2015.exe
+++ /dev/null
Binary files differ
diff --git a/bin/VulkanSample_Release_vs2015.exe b/bin/VulkanSample_Release_vs2015.exe
new file mode 100644
index 0000000..8f46ee8
--- /dev/null
+++ b/bin/VulkanSample_Release_vs2015.exe
Binary files differ
diff --git a/docs/html/allocation_annotation.html b/docs/html/allocation_annotation.html
index 5032b64..e9cd214 100644
--- a/docs/html/allocation_annotation.html
+++ b/docs/html/allocation_annotation.html
@@ -69,13 +69,13 @@
 <div class="textblock"><h1><a class="anchor" id="allocation_user_data"></a>
 Allocation user data</h1>
 <p>You can annotate allocations with your own information, e.g. for debugging purposes. To do that, fill <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> field when creating an allocation. It's an opaque <code>void*</code> pointer. You can use it e.g. as a pointer, some handle, index, key, ordinal number or any other value that would associate the allocation with your custom metadata.</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line"><span class="comment">// Fill bufferInfo...</span></div><div class="line"></div><div class="line">MyBufferMetadata* pMetadata = CreateBufferMetadata();</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a> = pMetadata;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line">VmaAllocation allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocCreateInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>The pointer may be later retrieved as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a>:</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line"><span class="comment">// Fill bufferInfo...</span></div><div class="line"></div><div class="line">MyBufferMetadata* pMetadata = CreateBufferMetadata();</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a> = pMetadata;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocCreateInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>The pointer may be later retrieved as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a>:</p>
 <div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocation, &amp;allocInfo);</div><div class="line">MyBufferMetadata* pMetadata = (MyBufferMetadata*)allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div></div><!-- fragment --><p>It can also be changed using function <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value. ">vmaSetAllocationUserData()</a>.</p>
 <p>Values of (non-zero) allocations' <code>pUserData</code> are printed in JSON report created by <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format. ">vmaBuildStatsString()</a>, in hexadecimal form.</p>
 <h1><a class="anchor" id="allocation_names"></a>
 Allocation names</h1>
-<p>There is alternative mode available where <code>pUserData</code> pointer is used to point to a null-terminated string, giving a name to the allocation. To use this mode, set <code>VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</code> flag in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum. ">VmaAllocationCreateInfo::flags</a>. Then <code>pUserData</code> passed as <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> or argument to <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value. ">vmaSetAllocationUserData()</a> must be either null or pointer to a null-terminated string. The library creates internal copy of the string, so the pointer you pass doesn't need to be valid for whole lifetime of the allocation. You can free it after the call.</p>
-<div class="fragment"><div class="line">VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };</div><div class="line"><span class="comment">// Fill imageInfo...</span></div><div class="line"></div><div class="line">std::string imageName = <span class="stringliteral">&quot;Texture: &quot;</span>;</div><div class="line">imageName += fileName;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a> = imageName.c_str();</div><div class="line"></div><div class="line">VkImage image;</div><div class="line">VmaAllocation allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(allocator, &amp;imageInfo, &amp;allocCreateInfo, &amp;image, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>The value of <code>pUserData</code> pointer of the allocation will be different than the one you passed when setting allocation's name - pointing to a buffer managed internally that holds copy of the string.</p>
+<p>There is alternative mode available where <code>pUserData</code> pointer is used to point to a null-terminated string, giving a name to the allocation. To use this mode, set <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> flag in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum. ">VmaAllocationCreateInfo::flags</a>. Then <code>pUserData</code> passed as <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> or argument to <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value. ">vmaSetAllocationUserData()</a> must be either null or pointer to a null-terminated string. The library creates internal copy of the string, so the pointer you pass doesn't need to be valid for whole lifetime of the allocation. You can free it after the call.</p>
+<div class="fragment"><div class="line">VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };</div><div class="line"><span class="comment">// Fill imageInfo...</span></div><div class="line"></div><div class="line">std::string imageName = <span class="stringliteral">&quot;Texture: &quot;</span>;</div><div class="line">imageName += fileName;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a> = imageName.c_str();</div><div class="line"></div><div class="line">VkImage image;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(allocator, &amp;imageInfo, &amp;allocCreateInfo, &amp;image, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>The value of <code>pUserData</code> pointer of the allocation will be different than the one you passed when setting allocation's name - pointing to a buffer managed internally that holds copy of the string.</p>
 <div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocation, &amp;allocInfo);</div><div class="line"><span class="keyword">const</span> <span class="keywordtype">char</span>* imageName = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div><div class="line">printf(<span class="stringliteral">&quot;Image name: %s\n&quot;</span>, imageName);</div></div><!-- fragment --><p>That string is also printed in JSON report created by <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format. ">vmaBuildStatsString()</a>. </p>
 </div></div><!-- contents -->
 <!-- start footer part -->
diff --git a/docs/html/annotated.html b/docs/html/annotated.html
index ed46442..18ddbd5 100644
--- a/docs/html/annotated.html
+++ b/docs/html/annotated.html
@@ -64,17 +64,20 @@
 <div class="contents">
 <div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
 <table class="directory">
-<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocation_create_info.html" target="_self">VmaAllocationCreateInfo</a></td><td class="desc"></td></tr>
-<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocation_info.html" target="_self">VmaAllocationInfo</a></td><td class="desc">Parameters of <code>VmaAllocation</code> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a> </td></tr>
-<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocator_create_info.html" target="_self">VmaAllocatorCreateInfo</a></td><td class="desc">Description of a Allocator to be created </td></tr>
-<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_defragmentation_info.html" target="_self">VmaDefragmentationInfo</a></td><td class="desc">Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a> </td></tr>
-<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_defragmentation_stats.html" target="_self">VmaDefragmentationStats</a></td><td class="desc">Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a> </td></tr>
-<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_device_memory_callbacks.html" target="_self">VmaDeviceMemoryCallbacks</a></td><td class="desc">Set of callbacks that the library will call for <code>vkAllocateMemory</code> and <code>vkFreeMemory</code> </td></tr>
-<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_pool_create_info.html" target="_self">VmaPoolCreateInfo</a></td><td class="desc">Describes parameter of created <code>VmaPool</code> </td></tr>
-<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_pool_stats.html" target="_self">VmaPoolStats</a></td><td class="desc">Describes parameter of existing <code>VmaPool</code> </td></tr>
-<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_stat_info.html" target="_self">VmaStatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire allocator </td></tr>
-<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_stats.html" target="_self">VmaStats</a></td><td class="desc">General statistics from current state of Allocator </td></tr>
-<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_vulkan_functions.html" target="_self">VmaVulkanFunctions</a></td><td class="desc">Pointers to some Vulkan functions - a subset used by the library </td></tr>
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocation.html" target="_self">VmaAllocation</a></td><td class="desc">Represents single memory allocation </td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocation_create_info.html" target="_self">VmaAllocationCreateInfo</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocation_info.html" target="_self">VmaAllocationInfo</a></td><td class="desc">Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> </td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocator.html" target="_self">VmaAllocator</a></td><td class="desc">Represents main object of this library initialized </td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_allocator_create_info.html" target="_self">VmaAllocatorCreateInfo</a></td><td class="desc">Description of a Allocator to be created </td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_defragmentation_info.html" target="_self">VmaDefragmentationInfo</a></td><td class="desc">Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a> </td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_defragmentation_stats.html" target="_self">VmaDefragmentationStats</a></td><td class="desc">Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a> </td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_device_memory_callbacks.html" target="_self">VmaDeviceMemoryCallbacks</a></td><td class="desc">Set of callbacks that the library will call for <code>vkAllocateMemory</code> and <code>vkFreeMemory</code> </td></tr>
+<tr id="row_8_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_pool.html" target="_self">VmaPool</a></td><td class="desc">Represents custom memory pool </td></tr>
+<tr id="row_9_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_pool_create_info.html" target="_self">VmaPoolCreateInfo</a></td><td class="desc">Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> </td></tr>
+<tr id="row_10_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_pool_stats.html" target="_self">VmaPoolStats</a></td><td class="desc">Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> </td></tr>
+<tr id="row_11_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_stat_info.html" target="_self">VmaStatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire allocator </td></tr>
+<tr id="row_12_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_stats.html" target="_self">VmaStats</a></td><td class="desc">General statistics from current state of Allocator </td></tr>
+<tr id="row_13_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_vma_vulkan_functions.html" target="_self">VmaVulkanFunctions</a></td><td class="desc">Pointers to some Vulkan functions - a subset used by the library </td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/docs/html/choosing_memory_type.html b/docs/html/choosing_memory_type.html
index dbee1f9..b713e77 100644
--- a/docs/html/choosing_memory_type.html
+++ b/docs/html/choosing_memory_type.html
@@ -70,7 +70,7 @@
 <ol type="1">
 <li>If you just want to find memory type index that meets your requirements, you can use function <a class="el" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a" title="Helps to find memoryTypeIndex, given memoryTypeBits and VmaAllocationCreateInfo. ">vmaFindMemoryTypeIndex()</a>.</li>
 <li>If you want to allocate a region of device memory without association with any specific image or buffer, you can use function <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8" title="General purpose memory allocation. ">vmaAllocateMemory()</a>. Usage of this function is not recommended and usually not needed.</li>
-<li>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 <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb" title="Function similar to vmaAllocateMemoryForBuffer(). ">vmaAllocateMemoryForImage()</a>.</li>
+<li>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 <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb" title="Function similar to vmaAllocateMemoryForBuffer(). ">vmaAllocateMemoryForImage()</a>. For binding you should use functions: <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470" title="Binds buffer to allocation. ">vmaBindBufferMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5" title="Binds image to allocation. ">vmaBindImageMemory()</a>.</li>
 <li>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 <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer(). ">vmaCreateImage()</a>. This is the recommended way to use this library.</li>
 </ol>
 <p>When using 3. or 4., the library internally queries Vulkan for memory types supported for that buffer or image (function <code>vkGetBufferMemoryRequirements()</code>) and uses only one of these types.</p>
@@ -80,16 +80,16 @@
 Usage</h1>
 <p>The easiest way to specify memory requirements is to fill member <a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910" title="Intended usage of memory. ">VmaAllocationCreateInfo::usage</a> using one of the values of enum <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>. It defines high level, common usage types. For more details, see description of this enum.</p>
 <p>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:</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufferInfo.size = 65536;</div><div class="line">bufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line">VmaAllocation allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_required_preferred_flags"></a>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufferInfo.size = 65536;</div><div class="line">bufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_required_preferred_flags"></a>
 Required and preferred flags</h1>
 <p>You can specify more detailed requirements by filling members <a class="el" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90" title="Flags that must be set in a Memory Type chosen for an allocation. ">VmaAllocationCreateInfo::requiredFlags</a> and <a class="el" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d" title="Flags that preferably should be set in a memory type chosen for an allocation. ">VmaAllocationCreateInfo::preferredFlags</a> with a combination of bits from enum <code>VkMemoryPropertyFlags</code>. For example, if you want to create a buffer that will be persistently mapped on host (so it must be <code>HOST_VISIBLE</code>) and preferably will also be <code>HOST_COHERENT</code> and <code>HOST_CACHED</code>, use following code:</p>
-<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a> = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a> = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line">VmaAllocation allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>A memory type is chosen that has all the required flags and as many preferred flags set as possible.</p>
+<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a> = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a> = VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>A memory type is chosen that has all the required flags and as many preferred flags set as possible.</p>
 <p>If you use <a class="el" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910" title="Intended usage of memory. ">VmaAllocationCreateInfo::usage</a>, it is just internally converted to a set of required and preferred flags.</p>
 <h1><a class="anchor" id="choosing_memory_type_explicit_memory_types"></a>
 Explicit memory types</h1>
-<p>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 <a class="el" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055" title="Bitmask containing one bit set for every memory type acceptable for this allocation. ">VmaAllocationCreateInfo::memoryTypeBits</a>. 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.</p>
+<p>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 <a class="el" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055" title="Bitmask containing one bit set for every memory type acceptable for this allocation. ">VmaAllocationCreateInfo::memoryTypeBits</a>. 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 <code>UINT32_MAX</code>, means there are no restrictions to memory type index.</p>
 <p>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:</p>
-<div class="fragment"><div class="line">uint32_t memoryTypeIndex = 2;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> = 1u &lt;&lt; memoryTypeIndex;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line">VmaAllocation allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_custom_memory_pools"></a>
+<div class="fragment"><div class="line">uint32_t memoryTypeIndex = 2;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> = 1u &lt;&lt; memoryTypeIndex;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><h1><a class="anchor" id="choosing_memory_type_custom_memory_pools"></a>
 Custom memory pools</h1>
 <p>If you allocate from custom memory pool, all the ways of specifying memory requirements described above are not applicable and the aforementioned members of <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> 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 <a class="el" href="custom_memory_pools.html">Custom memory pools</a>. </p>
 </div></div><!-- contents -->
diff --git a/docs/html/classes.html b/docs/html/classes.html
index bbb29c7..b900f2a 100644
--- a/docs/html/classes.html
+++ b/docs/html/classes.html
@@ -65,9 +65,10 @@
 <div class="qindex"><a class="qindex" href="#letter_v">v</a></div>
 <table class="classindex">
 <tr><td rowspan="2" valign="bottom"><a name="letter_v"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;v&#160;&#160;</div></td></tr></table>
-</td><td valign="top"><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&#160;&#160;&#160;</td></tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a>&#160;&#160;&#160;</td><td></td></tr>
-<tr><td valign="top"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_stats.html">VmaStats</a>&#160;&#160;&#160;</td><td></td></tr>
+</td><td valign="top"><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_stat_info.html">VmaStatInfo</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_stats.html">VmaStats</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&#160;&#160;&#160;</td><td></td></tr>
 <tr><td></td><td></td><td></td><td></td><td></td></tr>
 </table>
 <div class="qindex"><a class="qindex" href="#letter_v">v</a></div>
diff --git a/docs/html/configuration.html b/docs/html/configuration.html
index 5b471d9..42ac113 100644
--- a/docs/html/configuration.html
+++ b/docs/html/configuration.html
@@ -66,7 +66,7 @@
 <div class="title">Configuration </div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><p>Please check "CONFIGURATION SECTION" in the code to find macros that you can define before each include of this file or change directly in this file to provide your own implementation of basic facilities like assert, <code>min()</code> and <code>max()</code> functions, mutex etc. C++ STL is used by default, but changing these allows you to get rid of any STL usage if you want, as many game developers tend to do.</p>
+<div class="textblock"><p>Please check "CONFIGURATION SECTION" in the code to find macros that you can define before each include of this file or change directly in this file to provide your own implementation of basic facilities like assert, <code>min()</code> and <code>max()</code> functions, mutex, atomic etc. The library uses its own implementation of containers by default, but you can switch to using STL containers instead.</p>
 <h1><a class="anchor" id="config_Vulkan_functions"></a>
 Pointers to Vulkan functions</h1>
 <p>The library uses Vulkan functions straight from the <code>vulkan.h</code> header by default. If you want to provide your own pointers to these functions, e.g. fetched using <code>vkGetInstanceProcAddr()</code> and <code>vkGetDeviceProcAddr()</code>:</p>
@@ -76,13 +76,13 @@
 </ol>
 <h1><a class="anchor" id="custom_memory_allocator"></a>
 Custom host memory allocator</h1>
-<p>If you use custom allocator for CPU memory rather than default operator <code>new</code> and <code>delete</code> from C++, you can make this library using your allocator as well by filling optional member <a class="el" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d" title="Custom CPU memory allocation callbacks. ">VmaAllocatorCreateInfo::pAllocationCallbacks</a>. These functions will be passed to Vulkan, as well as used by the library itself to make any CPU-side allocations.</p>
+<p>If you use custom allocator for CPU memory rather than default operator <code>new</code> and <code>delete</code> from C++, you can make this library using your allocator as well by filling optional member <a class="el" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d" title="Custom CPU memory allocation callbacks. Optional. ">VmaAllocatorCreateInfo::pAllocationCallbacks</a>. These functions will be passed to Vulkan, as well as used by the library itself to make any CPU-side allocations.</p>
 <h1><a class="anchor" id="allocation_callbacks"></a>
 Device memory allocation callbacks</h1>
-<p>The library makes calls to <code>vkAllocateMemory()</code> and <code>vkFreeMemory()</code> internally. You can setup callbacks to be informed about these calls, e.g. for the purpose of gathering some statistics. To do it, fill optional member <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e" title="Informative callbacks for vkAllocateMemory, vkFreeMemory. ">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a>.</p>
+<p>The library makes calls to <code>vkAllocateMemory()</code> and <code>vkFreeMemory()</code> internally. You can setup callbacks to be informed about these calls, e.g. for the purpose of gathering some statistics. To do it, fill optional member <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e" title="Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional. ">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a>.</p>
 <h1><a class="anchor" id="heap_memory_limit"></a>
 Device heap memory limit</h1>
-<p>If you want to test how your program behaves with limited amount of Vulkan device memory available without switching your graphics card to one that really has smaller VRAM, you can use a feature of this library intended for this purpose. To do it, fill optional member <a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b" title="Either NULL or a pointer to an array of limits on maximum number of bytes that can be allocated out o...">VmaAllocatorCreateInfo::pHeapSizeLimit</a>. </p>
+<p>If you want to test how your program behaves with limited amount of Vulkan device memory available without switching your graphics card to one that really has smaller VRAM, you can use a feature of this library intended for this purpose. To do it, fill optional member <a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b" title="Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out o...">VmaAllocatorCreateInfo::pHeapSizeLimit</a>. </p>
 </div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/docs/html/custom_memory_pools.html b/docs/html/custom_memory_pools.html
index c40e397..fed21c8 100644
--- a/docs/html/custom_memory_pools.html
+++ b/docs/html/custom_memory_pools.html
@@ -77,15 +77,19 @@
 <p>To use custom memory pools:</p>
 <ol type="1">
 <li>Fill <a class="el" href="struct_vma_pool_create_info.html" title="Describes parameter of created VmaPool. ">VmaPoolCreateInfo</a> structure.</li>
-<li>Call <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50" title="Allocates Vulkan device memory and creates VmaPool object. ">vmaCreatePool()</a> to obtain <code>VmaPool</code> handle.</li>
+<li>Call <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50" title="Allocates Vulkan device memory and creates VmaPool object. ">vmaCreatePool()</a> to obtain <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> handle.</li>
 <li>When making an allocation, set <a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150" title="Pool that this allocation should be created in. ">VmaAllocationCreateInfo::pool</a> to this handle. You don't need to specify any other parameters of this structure, like usage.</li>
 </ol>
 <p>Example:</p>
-<div class="fragment"><div class="line"><span class="comment">// Create a pool that can have at most 2 blocks, 128 MiB each.</span></div><div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = ...</div><div class="line">poolCreateInfo.blockSize = 128ull * 1024 * 1024;</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = 2;</div><div class="line"></div><div class="line">VmaPool pool;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(allocator, &amp;poolCreateInfo, &amp;pool);</div><div class="line"></div><div class="line"><span class="comment">// Allocate a buffer out of it.</span></div><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = 1024;</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> = pool;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line">VmaAllocation alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div></div><!-- fragment --><p>You have to free all allocations made from this pool before destroying it.</p>
+<div class="fragment"><div class="line"><span class="comment">// Create a pool that can have at most 2 blocks, 128 MiB each.</span></div><div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = ...</div><div class="line">poolCreateInfo.blockSize = 128ull * 1024 * 1024;</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = 2;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_pool.html">VmaPool</a> pool;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(allocator, &amp;poolCreateInfo, &amp;pool);</div><div class="line"></div><div class="line"><span class="comment">// Allocate a buffer out of it.</span></div><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = 1024;</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> = pool;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div></div><!-- fragment --><p>You have to free all allocations made from this pool before destroying it.</p>
 <div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, buf, alloc);</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(allocator, pool);</div></div><!-- fragment --><h1><a class="anchor" id="custom_memory_pools_MemTypeIndex"></a>
 Choosing memory type index</h1>
-<p>When creating a pool, you must explicitly specify memory type index. To find the one suitable for your buffers or images, you can use code similar to the following:</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo dummyBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">dummyBufCreateInfo.size = 1024; <span class="comment">// Whatever.</span></div><div class="line">dummyBufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; <span class="comment">// Change if needed.</span></div><div class="line"></div><div class="line">VkBuffer dummyBuf;</div><div class="line">vkCreateBuffer(device, &amp;dummyBufCreateInfo, <span class="keyword">nullptr</span>, &amp;dummyBuf);</div><div class="line"></div><div class="line">VkMemoryRequirements memReq;</div><div class="line">vkGetBufferMemoryRequirements(device, dummyBuf, &amp;memReq);</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>; <span class="comment">// Change if needed.</span></div><div class="line"></div><div class="line">uint32_t memTypeIndex;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(allocator, memReq.memoryTypeBits, &amp;allocCreateInfo, &amp;memTypeIndex);</div><div class="line"></div><div class="line">vkDestroyBuffer(device, dummyBuf, <span class="keyword">nullptr</span>);</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = memTypeIndex;</div><div class="line"><span class="comment">// ...</span></div></div><!-- fragment --><p>Dummy buffer is needed to query driver for <code>memReq.memoryTypeBits</code>. Memory is never allocated for this buffer. You should fill structures <code>dummyBufCreateInfo</code> and <code>allocCreateInfo</code> with the same parameters as you are going to use for buffers created in your pool. </p>
+<p>When creating a pool, you must explicitly specify memory type index. To find the one suitable for your buffers or images, you can use helper functions <a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888" title="Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo. ">vmaFindMemoryTypeIndexForBufferInfo()</a>, <a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472" title="Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo. ">vmaFindMemoryTypeIndexForImageInfo()</a>. You need to provide structures with example parameters of buffers or images that you are going to create in that pool.</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo exampleBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">exampleBufCreateInfo.size = 1024; <span class="comment">// Whatever.</span></div><div class="line">exampleBufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; <span class="comment">// Change if needed.</span></div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>; <span class="comment">// Change if needed.</span></div><div class="line"></div><div class="line">uint32_t memTypeIndex;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(allocator, &amp;exampleBufCreateInfo, &amp;allocCreateInfo, &amp;memTypeIndex);</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> poolCreateInfo = {};</div><div class="line">poolCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a> = memTypeIndex;</div><div class="line"><span class="comment">// ...</span></div></div><!-- fragment --><p>When creating buffers/images allocated in that pool, provide following parameters:</p>
+<ul>
+<li><code>VkBufferCreateInfo</code>: Prefer to pass same parameters as above. Otherwise you risk creating resources in a memory type that is not suitable for them, which may result in undefined behavior. Using different <code>VK_BUFFER_USAGE_</code> flags may work, but you shouldn't create images in a pool intended for buffers or the other way around.</li>
+<li><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>: You don't need to pass same parameters. Fill only <code>pool</code> member. Other members are ignored anyway. </li>
+</ul>
 </div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/docs/html/general_considerations.html b/docs/html/general_considerations.html
new file mode 100644
index 0000000..139d6e6
--- /dev/null
+++ b/docs/html/general_considerations.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: General considerations</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">General considerations </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h1><a class="anchor" id="general_considerations_thread_safety"></a>
+Thread safety</h1>
+<ul>
+<li>The library has no global state, so separate <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a> objects can be used independently. There should be no need to create multiple such objects though - one per <code>VkDevice</code> is enough.</li>
+<li>By default, all calls to functions that take <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a> as first parameter are safe to call from multiple threads simultaneously because they are synchronized internally when needed.</li>
+<li>When the allocator is created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d" title="Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> flag, calls to functions that take such <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a> object must be synchronized externally.</li>
+<li>Access to a <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> object must be externally synchronized. For example, you must not call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> from different threads at the same time if you pass the same <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> object to these functions.</li>
+</ul>
+<h1><a class="anchor" id="general_considerations_allocation_algorithm"></a>
+Allocation algorithm</h1>
+<p>The library uses following algorithm for allocation, in order:</p>
+<ol type="1">
+<li>Try to find free range of memory in existing blocks.</li>
+<li>If failed, try to create a new block of <code>VkDeviceMemory</code>, with preferred block size.</li>
+<li>If failed, try to create such block with size/2, size/4, size/8.</li>
+<li>If failed and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flag was specified, try to find space in existing blocks, possilby making some other allocations lost.</li>
+<li>If failed, try to allocate separate <code>VkDeviceMemory</code> for this allocation, just like when you use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block. ">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>.</li>
+<li>If failed, choose other memory type that meets the requirements specified in <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> and go to point 1.</li>
+<li>If failed, return <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code>.</li>
+</ol>
+<h1><a class="anchor" id="general_considerations_features_not_supported"></a>
+Features not supported</h1>
+<p>Features deliberately excluded from the scope of this library:</p>
+<ul>
+<li>Data transfer - issuing commands that transfer data between buffers or images, any usage of <code>VkCommandList</code> or <code>VkCommandQueue</code> and related synchronization is responsibility of the user.</li>
+<li>Support for any programming languages other than C/C++. Bindings to other languages are welcomed as external projects. </li>
+</ul>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/globals.html b/docs/html/globals.html
index 95f9354..e94b352 100644
--- a/docs/html/globals.html
+++ b/docs/html/globals.html
@@ -158,6 +158,12 @@
 <li>VmaAllocatorCreateInfo
 : <a class="el" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">vk_mem_alloc.h</a>
 </li>
+<li>vmaBindBufferMemory()
+: <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vk_mem_alloc.h</a>
+</li>
+<li>vmaBindImageMemory()
+: <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vk_mem_alloc.h</a>
+</li>
 <li>vmaBuildStatsString()
 : <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/globals_func.html b/docs/html/globals_func.html
index c7268fa..55ac717 100644
--- a/docs/html/globals_func.html
+++ b/docs/html/globals_func.html
@@ -70,6 +70,12 @@
 <li>vmaAllocateMemoryForImage()
 : <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vk_mem_alloc.h</a>
 </li>
+<li>vmaBindBufferMemory()
+: <a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vk_mem_alloc.h</a>
+</li>
+<li>vmaBindImageMemory()
+: <a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vk_mem_alloc.h</a>
+</li>
 <li>vmaBuildStatsString()
 : <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/index.html b/docs/html/index.html
index 921a093..128c049 100644
--- a/docs/html/index.html
+++ b/docs/html/index.html
@@ -66,29 +66,73 @@
 <p>Copyright (c) 2017-2018 Advanced Micro Devices, Inc. All rights reserved. <br />
 License: MIT</p>
 <p>Documentation of all members: <a class="el" href="vk__mem__alloc_8h.html">vk_mem_alloc.h</a></p>
-<p>Table of contents:</p>
+<h1><a class="anchor" id="main_table_of_contents"></a>
+Table of contents</h1>
 <ul>
-<li>User guide<ul>
-<li><a class="el" href="quick_start.html">Quick start</a></li>
-<li><a class="el" href="choosing_memory_type.html">Choosing memory type</a></li>
-<li><a class="el" href="memory_mapping.html">Memory mapping</a></li>
-<li><a class="el" href="custom_memory_pools.html">Custom memory pools</a></li>
+<li><b>User guide</b><ul>
+<li><a class="el" href="quick_start.html">Quick start</a><ul>
+<li><a class="el" href="quick_start.html#quick_start_project_setup">Project setup</a></li>
+<li><a class="el" href="quick_start.html#quick_start_initialization">Initialization</a></li>
+<li><a class="el" href="quick_start.html#quick_start_resource_allocation">Resource allocation</a></li>
+</ul>
+</li>
+<li><a class="el" href="choosing_memory_type.html">Choosing memory type</a><ul>
+<li><a class="el" href="choosing_memory_type.html#choosing_memory_type_usage">Usage</a></li>
+<li><a class="el" href="choosing_memory_type.html#choosing_memory_type_required_preferred_flags">Required and preferred flags</a></li>
+<li><a class="el" href="choosing_memory_type.html#choosing_memory_type_explicit_memory_types">Explicit memory types</a></li>
+<li><a class="el" href="choosing_memory_type.html#choosing_memory_type_custom_memory_pools">Custom memory pools</a></li>
+</ul>
+</li>
+<li><a class="el" href="memory_mapping.html">Memory mapping</a><ul>
+<li><a class="el" href="memory_mapping.html#memory_mapping_mapping_functions">Mapping functions</a></li>
+<li><a class="el" href="memory_mapping.html#memory_mapping_persistently_mapped_memory">Persistently mapped memory</a></li>
+<li><a class="el" href="memory_mapping.html#memory_mapping_cache_control">Cache control</a></li>
+<li><a class="el" href="memory_mapping.html#memory_mapping_finding_if_memory_mappable">Finding out if memory is mappable</a></li>
+</ul>
+</li>
+<li><a class="el" href="custom_memory_pools.html">Custom memory pools</a><ul>
+<li><a class="el" href="custom_memory_pools.html#custom_memory_pools_MemTypeIndex">Choosing memory type index</a></li>
+</ul>
+</li>
 <li><a class="el" href="defragmentation.html">Defragmentation</a></li>
 <li><a class="el" href="lost_allocations.html">Lost allocations</a></li>
-<li><a class="el" href="allocation_annotation.html">Allocation names and user data</a></li>
+<li><a class="el" href="statistics.html">Statistics</a><ul>
+<li><a class="el" href="statistics.html#statistics_numeric_statistics">Numeric statistics</a></li>
+<li><a class="el" href="statistics.html#statistics_json_dump">JSON dump</a></li>
+</ul>
+</li>
+<li><a class="el" href="allocation_annotation.html">Allocation names and user data</a><ul>
+<li><a class="el" href="allocation_annotation.html#allocation_user_data">Allocation user data</a></li>
+<li><a class="el" href="allocation_annotation.html#allocation_names">Allocation names</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="el" href="usage_patterns.html">Recommended usage patterns</a><ul>
+<li><a class="el" href="usage_patterns.html#usage_patterns_simple">Simple patterns</a></li>
+<li><a class="el" href="usage_patterns.html#usage_patterns_advanced">Advanced patterns</a></li>
 </ul>
 </li>
 <li><a class="el" href="configuration.html">Configuration</a><ul>
+<li><a class="el" href="configuration.html#config_Vulkan_functions">Pointers to Vulkan functions</a></li>
+<li><a class="el" href="configuration.html#custom_memory_allocator">Custom host memory allocator</a></li>
+<li><a class="el" href="configuration.html#allocation_callbacks">Device memory allocation callbacks</a></li>
+<li><a class="el" href="configuration.html#heap_memory_limit">Device heap memory limit</a></li>
 <li><a class="el" href="vk_khr_dedicated_allocation.html">VK_KHR_dedicated_allocation</a></li>
 </ul>
 </li>
-<li><a class="el" href="thread_safety.html">Thread safety</a></li>
-<li><a class="el" href="about_the_library.html">About the library</a></li>
+<li><a class="el" href="general_considerations.html">General considerations</a><ul>
+<li><a class="el" href="general_considerations.html#general_considerations_thread_safety">Thread safety</a></li>
+<li><a class="el" href="general_considerations.html#general_considerations_allocation_algorithm">Allocation algorithm</a></li>
+<li><a class="el" href="general_considerations.html#general_considerations_features_not_supported">Features not supported</a></li>
 </ul>
-<p>See also:</p>
+</li>
+</ul>
+<h1><a class="anchor" id="main_see_also"></a>
+See also</h1>
 <ul>
-<li><a href="https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator">Source repository on GitHub</a></li>
-<li><a href="https://gpuopen.com/gaming-product/vulkan-memory-allocator/">Product page on GPUOpen</a> </li>
+<li><a href="https://gpuopen.com/gaming-product/vulkan-memory-allocator/">Product page on GPUOpen</a></li>
+<li><a href="https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator">Source repository on GitHub</a> </li>
 </ul>
 </div></div><!-- contents -->
 <!-- start footer part -->
diff --git a/docs/html/lost_allocations.html b/docs/html/lost_allocations.html
index 4b2e113..a4c3113 100644
--- a/docs/html/lost_allocations.html
+++ b/docs/html/lost_allocations.html
@@ -67,27 +67,19 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><p>If your game oversubscribes video memory, if may work OK in previous-generation graphics APIs (DirectX 9, 10, 11, OpenGL) because resources are automatically paged to system RAM. In Vulkan you can't do it because when you run out of memory, an allocation just fails. If you have more data (e.g. textures) that can fit into VRAM and you don't need it all at once, you may want to upload them to GPU on demand and "push out" ones that are not used for a long time to make room for the new ones, effectively using VRAM (or a cartain memory pool) as a form of cache. Vulkan Memory Allocator can help you with that by supporting a concept of "lost allocations".</p>
-<p>To create an allocation that can become lost, include <code>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</code> flag in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum. ">VmaAllocationCreateInfo::flags</a>. Before using a buffer or image bound to such allocation in every new frame, you need to query it if it's not lost. To check it: call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a> and see if <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object. ">VmaAllocationInfo::deviceMemory</a> is not <code>VK_NULL_HANDLE</code>. If the allocation is lost, you should not use it or buffer/image bound to it. You mustn't forget to destroy this allocation and this buffer/image.</p>
-<p>To create an allocation that can make some other allocations lost to make room for it, use <code>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</code> flag. You will usually use both flags <code>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</code> and <code>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</code> at the same time.</p>
-<p>Warning! Current implementation uses quite naive, brute force algorithm, which can make allocation calls that use <code>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</code> flag quite slow. A new, more optimal algorithm and data structure to speed this up is planned for the future.</p>
-<p><b>When interleaving creation of new allocations with usage of existing ones, how do you make sure that an allocation won't become lost while it's used in the current frame?</b></p>
-<p>It is ensured because <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a> not only returns allocation parameters and checks whether it's not lost, but when it's not, it also atomically marks it as used in the current frame, which makes it impossible to become lost in that frame. It uses lockless algorithm, so it works fast and doesn't involve locking any internal mutex.</p>
-<p><b>What if my allocation may still be in use by the GPU when it's rendering a previous frame while I already submit new frame on the CPU?</b></p>
-<p>You can make sure that allocations "touched" by <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a> will not become lost for a number of additional frames back from the current one by specifying this number as <a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7" title="Maximum number of additional frames that are in use at the same time as current frame. ">VmaAllocatorCreateInfo::frameInUseCount</a> (for default memory pool) and <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame. ">VmaPoolCreateInfo::frameInUseCount</a> (for custom pool).</p>
-<p><b>How do you inform the library when new frame starts?</b></p>
+<p>To create an allocation that can become lost, include <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum. ">VmaAllocationCreateInfo::flags</a>. Before using a buffer or image bound to such allocation in every new frame, you need to query it if it's not lost. To check it, call <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame...">vmaTouchAllocation()</a>. If the allocation is lost, you should not use it or buffer/image bound to it. You mustn't forget to destroy this allocation and this buffer/image. <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> can also be used for checking status of the allocation. Allocation is lost when returned <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object. ">VmaAllocationInfo::deviceMemory</a> == <code>VK_NULL_HANDLE</code>.</p>
+<p>To create an allocation that can make some other allocations lost to make room for it, use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flag. You will usually use both flags <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> at the same time.</p>
+<p>Warning! Current implementation uses quite naive, brute force algorithm, which can make allocation calls that use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flag quite slow. A new, more optimal algorithm and data structure to speed this up is planned for the future.</p>
+<p><b>Q: When interleaving creation of new allocations with usage of existing ones, how do you make sure that an allocation won't become lost while it's used in the current frame?</b></p>
+<p>It is ensured because <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame...">vmaTouchAllocation()</a> / <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> not only returns allocation status/parameters and checks whether it's not lost, but when it's not, it also atomically marks it as used in the current frame, which makes it impossible to become lost in that frame. It uses lockless algorithm, so it works fast and doesn't involve locking any internal mutex.</p>
+<p><b>Q: What if my allocation may still be in use by the GPU when it's rendering a previous frame while I already submit new frame on the CPU?</b></p>
+<p>You can make sure that allocations "touched" by <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame...">vmaTouchAllocation()</a> / <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> will not become lost for a number of additional frames back from the current one by specifying this number as <a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7" title="Maximum number of additional frames that are in use at the same time as current frame. ">VmaAllocatorCreateInfo::frameInUseCount</a> (for default memory pool) and <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame. ">VmaPoolCreateInfo::frameInUseCount</a> (for custom pool).</p>
+<p><b>Q: How do you inform the library when new frame starts?</b></p>
 <p>You need to call function <a class="el" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236" title="Sets index of the current frame. ">vmaSetCurrentFrameIndex()</a>.</p>
 <p>Example code:</p>
-<div class="fragment"><div class="line"><span class="keyword">struct </span>MyBuffer</div><div class="line">{</div><div class="line">    VkBuffer m_Buf = <span class="keyword">nullptr</span>;</div><div class="line">    VmaAllocation m_Alloc = <span class="keyword">nullptr</span>;</div><div class="line"></div><div class="line">    <span class="comment">// Called when the buffer is really needed in the current frame.</span></div><div class="line">    <span class="keywordtype">void</span> EnsureBuffer();</div><div class="line">};</div><div class="line"></div><div class="line"><span class="keywordtype">void</span> MyBuffer::EnsureBuffer()</div><div class="line">{</div><div class="line">    <span class="comment">// Buffer has been created.</span></div><div class="line">    <span class="keywordflow">if</span>(m_Buf != VK_NULL_HANDLE)</div><div class="line">    {</div><div class="line">        <span class="comment">// Check if its allocation is not lost + mark it as used in current frame.</span></div><div class="line">        <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, m_Alloc, &amp;allocInfo);</div><div class="line">        <span class="keywordflow">if</span>(allocInfo.<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> != VK_NULL_HANDLE)</div><div class="line">        {</div><div class="line">            <span class="comment">// It&#39;s all OK - safe to use m_Buf.</span></div><div class="line">            <span class="keywordflow">return</span>;</div><div class="line">        }</div><div class="line">    }</div><div class="line"></div><div class="line">    <span class="comment">// Buffer not yet exists or lost - destroy and recreate it.</span></div><div class="line"></div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, m_Buf, m_Alloc);</div><div class="line"></div><div class="line">    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">    bufCreateInfo.size = 1024;</div><div class="line">    bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line">    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">    allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">    allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> |</div><div class="line">        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>;</div><div class="line"></div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;m_Buf, &amp;m_Alloc, <span class="keyword">nullptr</span>);</div><div class="line">}</div></div><!-- fragment --><p>When using lost allocations, you may see some Vulkan validation layer warnings about overlapping regions of memory bound to different kinds of buffers and images. This is still valid as long as you implement proper handling of lost allocations (like in the example above) and don't use them.</p>
-<p>The library uses following algorithm for allocation, in order:</p>
-<ol type="1">
-<li>Try to find free range of memory in existing blocks.</li>
-<li>If failed, try to create a new block of <code>VkDeviceMemory</code>, with preferred block size.</li>
-<li>If failed, try to create such block with size/2 and size/4.</li>
-<li>If failed and <code>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</code> flag was specified, try to find space in existing blocks, possilby making some other allocations lost.</li>
-<li>If failed, try to allocate separate <code>VkDeviceMemory</code> for this allocation, just like when you use <code>VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</code>.</li>
-<li>If failed, choose other memory type that meets the requirements specified in <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> and go to point 1.</li>
-<li>If failed, return <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code>. </li>
-</ol>
+<div class="fragment"><div class="line"><span class="keyword">struct </span>MyBuffer</div><div class="line">{</div><div class="line">    VkBuffer m_Buf = <span class="keyword">nullptr</span>;</div><div class="line">    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_Alloc = <span class="keyword">nullptr</span>;</div><div class="line"></div><div class="line">    <span class="comment">// Called when the buffer is really needed in the current frame.</span></div><div class="line">    <span class="keywordtype">void</span> EnsureBuffer();</div><div class="line">};</div><div class="line"></div><div class="line"><span class="keywordtype">void</span> MyBuffer::EnsureBuffer()</div><div class="line">{</div><div class="line">    <span class="comment">// Buffer has been created.</span></div><div class="line">    <span class="keywordflow">if</span>(m_Buf != VK_NULL_HANDLE)</div><div class="line">    {</div><div class="line">        <span class="comment">// Check if its allocation is not lost + mark it as used in current frame.</span></div><div class="line">        <span class="keywordflow">if</span>(<a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(allocator, m_Alloc))</div><div class="line">        {</div><div class="line">            <span class="comment">// It&#39;s all OK - safe to use m_Buf.</span></div><div class="line">            <span class="keywordflow">return</span>;</div><div class="line">        }</div><div class="line">    }</div><div class="line"></div><div class="line">    <span class="comment">// Buffer not yet exists or lost - destroy and recreate it.</span></div><div class="line"></div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, m_Buf, m_Alloc);</div><div class="line"></div><div class="line">    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">    bufCreateInfo.size = 1024;</div><div class="line">    bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line">    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">    allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">    allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> |</div><div class="line">        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>;</div><div class="line"></div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;m_Buf, &amp;m_Alloc, <span class="keyword">nullptr</span>);</div><div class="line">}</div></div><!-- fragment --><p>When using lost allocations, you may see some Vulkan validation layer warnings about overlapping regions of memory bound to different kinds of buffers and images. This is still valid as long as you implement proper handling of lost allocations (like in the example above) and don't use them.</p>
+<p>You can create an allocation that is already in lost state from the beginning using function <a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1" title="Creates new allocation that is in lost state from the beginning. ">vmaCreateLostAllocation()</a>. It may be useful if you need a "dummy" allocation that is not null.</p>
+<p>You can call function <a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024" title="Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...">vmaMakePoolAllocationsLost()</a> to set all eligible allocations in a specified custom pool to lost state. Allocations that have been "touched" in current frame or <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame. ">VmaPoolCreateInfo::frameInUseCount</a> frames back cannot become lost. </p>
 </div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/docs/html/memory_mapping.html b/docs/html/memory_mapping.html
index f4e37a0..90480cb 100644
--- a/docs/html/memory_mapping.html
+++ b/docs/html/memory_mapping.html
@@ -69,26 +69,26 @@
 <div class="textblock"><p>To "map memory" in Vulkan means to obtain a CPU pointer to <code>VkDeviceMemory</code>, to be able to read from it or write to it in CPU code. Mapping is possible only of memory allocated from a memory type that has <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> flag. Functions <code>vkMapMemory()</code>, <code>vkUnmapMemory()</code> are designed for this purpose. You can use them directly with memory allocated by this library, but it is not recommended because of following issue: Mapping the same <code>VkDeviceMemory</code> block multiple times is illegal - only one mapping at a time is allowed. This includes mapping disjoint regions. Mapping is not reference-counted internally by Vulkan. Because of this, Vulkan Memory Allocator provides following facilities:</p>
 <h1><a class="anchor" id="memory_mapping_mapping_functions"></a>
 Mapping functions</h1>
-<p>The library provides following functions for mapping of a specific <code>VmaAllocation</code>: <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a>. They are safer and more convenient to use than standard Vulkan functions. You can map an allocation multiple times simultaneously - mapping is reference-counted internally. You can also map different allocations simultaneously regardless of whether they use the same <code>VkDeviceMemory</code> block. They way it's implemented is that the library always maps entire memory block, not just region of the allocation. For further details, see description of <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> function. Example:</p>
-<div class="fragment"><div class="line"><span class="comment">// Having these objects initialized:</span></div><div class="line"></div><div class="line"><span class="keyword">struct </span>ConstantBuffer</div><div class="line">{</div><div class="line">    ...</div><div class="line">};</div><div class="line">ConstantBuffer constantBufferData;</div><div class="line"></div><div class="line">VmaAllocator allocator;</div><div class="line">VmaBuffer constantBuffer;</div><div class="line">VmaAllocation constantBufferAllocation;</div><div class="line"></div><div class="line"><span class="comment">// You can map and fill your buffer using following code:</span></div><div class="line"></div><div class="line"><span class="keywordtype">void</span>* mappedData;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, constantBufferAllocation, &amp;mappedData);</div><div class="line">memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, constantBufferAllocation);</div></div><!-- fragment --><h1><a class="anchor" id="memory_mapping_persistently_mapped_memory"></a>
+<p>The library provides following functions for mapping of a specific <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>: <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a>. They are safer and more convenient to use than standard Vulkan functions. You can map an allocation multiple times simultaneously - mapping is reference-counted internally. You can also map different allocations simultaneously regardless of whether they use the same <code>VkDeviceMemory</code> block. They way it's implemented is that the library always maps entire memory block, not just region of the allocation. For further details, see description of <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> function. Example:</p>
+<div class="fragment"><div class="line"><span class="comment">// Having these objects initialized:</span></div><div class="line"></div><div class="line"><span class="keyword">struct </span>ConstantBuffer</div><div class="line">{</div><div class="line">    ...</div><div class="line">};</div><div class="line">ConstantBuffer constantBufferData;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div><div class="line">VmaBuffer constantBuffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> constantBufferAllocation;</div><div class="line"></div><div class="line"><span class="comment">// You can map and fill your buffer using following code:</span></div><div class="line"></div><div class="line"><span class="keywordtype">void</span>* mappedData;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, constantBufferAllocation, &amp;mappedData);</div><div class="line">memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, constantBufferAllocation);</div></div><!-- fragment --><h1><a class="anchor" id="memory_mapping_persistently_mapped_memory"></a>
 Persistently mapped memory</h1>
-<p>Kepping your memory persistently mapped is generally OK in Vulkan. You don't need to unmap it before using its data on the GPU. The library provides a special feature designed for that: Allocations made with <code>VMA_ALLOCATION_CREATE_MAPPED_BIT</code> flag set in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum. ">VmaAllocationCreateInfo::flags</a> stay mapped all the time, so you can just access CPU pointer to it any time without a need to call any "map" or "unmap" function. Example:</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line">VmaAllocation alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line"><span class="comment">// Buffer is already mapped. You can access its memory.</span></div><div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div></div><!-- fragment --><p>There are some exceptions though, when you should consider mapping memory only for a short period of time:</p>
+<p>Kepping your memory persistently mapped is generally OK in Vulkan. You don't need to unmap it before using its data on the GPU. The library provides a special feature designed for that: Allocations made with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag set in <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b" title="Use VmaAllocationCreateFlagBits enum. ">VmaAllocationCreateInfo::flags</a> stay mapped all the time, so you can just access CPU pointer to it any time without a need to call any "map" or "unmap" function. Example:</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line"><span class="comment">// Buffer is already mapped. You can access its memory.</span></div><div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div></div><!-- fragment --><p>There are some exceptions though, when you should consider mapping memory only for a short period of time:</p>
 <ul>
-<li>When operating system is Windows 7 or 8.x (Windows 10 is not affected because it uses WDDM2), device is discrete AMD GPU, and memory type is the special 256 MiB pool of <code>DEVICE_LOCAL + HOST_VISIBLE</code> memory (selected when you use <code>VMA_MEMORY_USAGE_CPU_TO_GPU</code>), then whenever a memory block allocated from this memory type stays mapped for the time of any call to <code>vkQueueSubmit()</code> or <code>vkQueuePresentKHR()</code>, this block is migrated by WDDM to system RAM, which degrades performance. It doesn't matter if that particular memory block is actually used by the command buffer being submitted.</li>
+<li>When operating system is Windows 7 or 8.x (Windows 10 is not affected because it uses WDDM2), device is discrete AMD GPU, and memory type is the special 256 MiB pool of <code>DEVICE_LOCAL + HOST_VISIBLE</code> memory (selected when you use <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>), then whenever a memory block allocated from this memory type stays mapped for the time of any call to <code>vkQueueSubmit()</code> or <code>vkQueuePresentKHR()</code>, this block is migrated by WDDM to system RAM, which degrades performance. It doesn't matter if that particular memory block is actually used by the command buffer being submitted.</li>
 <li>Keeping many large memory blocks mapped may impact performance or stability of some debugging tools.</li>
 </ul>
 <h1><a class="anchor" id="memory_mapping_cache_control"></a>
 Cache control</h1>
 <p>Memory in Vulkan doesn't need to be unmapped before using it on GPU, but unless a memory types has <code>VK_MEMORY_PROPERTY_HOST_COHERENT_BIT</code> flag set, you need to manually invalidate cache before reading of mapped pointer using function <code>vkvkInvalidateMappedMemoryRanges()</code> and flush cache after writing to mapped pointer using function <code>vkFlushMappedMemoryRanges()</code>. Example:</p>
-<div class="fragment"><div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line"></div><div class="line">VkMemoryPropertyFlags memFlags;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(allocator, allocInfo.<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>, &amp;memFlags);</div><div class="line"><span class="keywordflow">if</span>((memFlags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0)</div><div class="line">{</div><div class="line">    VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div><div class="line">    memRange.memory = allocInfo.<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line">    memRange.offset = allocInfo.<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line">    memRange.size   = allocInfo.<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line">    vkFlushMappedMemoryRanges(device, 1, &amp;memRange);</div><div class="line">}</div></div><!-- fragment --><p>Please note that memory allocated with <code>VMA_MEMORY_USAGE_CPU_ONLY</code> is guaranteed to be host coherent.</p>
+<div class="fragment"><div class="line">memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line"></div><div class="line">VkMemoryPropertyFlags memFlags;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(allocator, allocInfo.<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>, &amp;memFlags);</div><div class="line"><span class="keywordflow">if</span>((memFlags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0)</div><div class="line">{</div><div class="line">    VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div><div class="line">    memRange.memory = allocInfo.<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line">    memRange.offset = allocInfo.<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line">    memRange.size   = allocInfo.<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line">    vkFlushMappedMemoryRanges(device, 1, &amp;memRange);</div><div class="line">}</div></div><!-- fragment --><p>Please note that memory allocated with <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> is guaranteed to be host coherent.</p>
 <p>Also, Windows drivers from all 3 PC GPU vendors (AMD, Intel, NVIDIA) currently provide <code>VK_MEMORY_PROPERTY_HOST_COHERENT_BIT</code> flag on all memory types that are <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code>, so on this platform you may not need to bother.</p>
 <h1><a class="anchor" id="memory_mapping_finding_if_memory_mappable"></a>
 Finding out if memory is mappable</h1>
 <p>It may happen that your allocation ends up in memory that is <code>HOST_VISIBLE</code> (available for mapping) despite it wasn't explicitly requested. For example, application may work on integrated graphics with unified memory (like Intel) or allocation from video memory might have failed, so the library chose system memory as fallback.</p>
 <p>You can detect this case and map such allocation to access its memory on CPU directly, instead of launching a transfer operation. In order to do that: inspect <code>allocInfo.memoryType</code>, call <a class="el" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca" title="Given Memory Type Index, returns Property Flags of this memory type. ">vmaGetMemoryTypeProperties()</a>, and look for <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> flag in properties of that memory type.</p>
-<p>You can even use <code>VMA_ALLOCATION_CREATE_MAPPED_BIT</code> flag while creating allocations that are not necessarily <code>HOST_VISIBLE</code> (e.g. using <code>VMA_MEMORY_USAGE_GPU_ONLY</code>). If the allocation ends up in memory type that is <code>HOST_VISIBLE</code>, it will be persistently mapped and you can use it directly. If not, the flag is just ignored. Example:</p>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line">VmaAllocation alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line"><span class="keywordflow">if</span>(allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> != <span class="keyword">nullptr</span>)</div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in mappable memory.</span></div><div class="line">    <span class="comment">// It&#39;s persistently mapped. You can access it directly.</span></div><div class="line">    memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line">}</div><div class="line"><span class="keywordflow">else</span></div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in non-mappable memory.</span></div><div class="line">    <span class="comment">// You need to create CPU-side copy in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div><div class="line">}</div></div><!-- fragment --> </div></div><!-- contents -->
+<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line">VkMemoryPropertyFlags memFlags;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(allocator, allocInfo.<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>, &amp;memFlags);</div><div class="line"><span class="keywordflow">if</span>((memFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in mappable memory. You can map it and access it directly.</span></div><div class="line">    <span class="keywordtype">void</span>* mappedData;</div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(allocator, alloc, &amp;mappedData);</div><div class="line">    memcpy(mappedData, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line">    <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(allocator, alloc);</div><div class="line">}</div><div class="line"><span class="keywordflow">else</span></div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in non-mappable memory.</span></div><div class="line">    <span class="comment">// You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div><div class="line">}</div></div><!-- fragment --><p>You can even use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag while creating allocations that are not necessarily <code>HOST_VISIBLE</code> (e.g. using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>). If the allocation ends up in memory type that is <code>HOST_VISIBLE</code>, it will be persistently mapped and you can use it directly. If not, the flag is just ignored. Example:</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufCreateInfo.size = <span class="keyword">sizeof</span>(ConstantBuffer);</div><div class="line">bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocCreateInfo = {};</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line">allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"></div><div class="line">VkBuffer buf;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufCreateInfo, &amp;allocCreateInfo, &amp;buf, &amp;alloc, &amp;allocInfo);</div><div class="line"></div><div class="line"><span class="keywordflow">if</span>(allocInfo.<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> != <span class="keyword">nullptr</span>)</div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in mappable memory.</span></div><div class="line">    <span class="comment">// It&#39;s persistently mapped. You can access it directly.</span></div><div class="line">    memcpy(allocInfo.<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>, &amp;constantBufferData, <span class="keyword">sizeof</span>(constantBufferData));</div><div class="line">}</div><div class="line"><span class="keywordflow">else</span></div><div class="line">{</div><div class="line">    <span class="comment">// Allocation ended up in non-mappable memory.</span></div><div class="line">    <span class="comment">// You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.</span></div><div class="line">}</div></div><!-- fragment --> </div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
 Generated by &#160;<a href="http://www.doxygen.org/index.html">
diff --git a/docs/html/quick_start.html b/docs/html/quick_start.html
index adb1f28..ae0bc59 100644
--- a/docs/html/quick_start.html
+++ b/docs/html/quick_start.html
@@ -66,21 +66,24 @@
 <div class="title">Quick start </div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="textblock"><h1><a class="anchor" id="project_setup"></a>
+<div class="textblock"><h1><a class="anchor" id="quick_start_project_setup"></a>
 Project setup</h1>
-<p>In your project code:</p>
+<p>Vulkan Memory Allocator comes in form of a single header file. You don't need to build it as a separate library project. You can add this file directly to your project and submit it to code repository next to your other source files.</p>
+<p>"Single header" doesn't mean that everything is contained in C/C++ declarations, like it tends to be in case of inline functions or C++ templates. It means that implementation is bundled with interface in a single file and needs to be extracted using preprocessor macro. If you don't do it properly, you will get linker errors.</p>
+<p>To do it properly:</p>
 <ol type="1">
-<li>Include "vk_mem_alloc.h" file wherever you want to use the library.</li>
-<li>In exacly one C++ file define following macro before include to build library implementation.</li>
+<li>Include "vk_mem_alloc.h" file in each CPP file where you want to use the library. This includes declarations of all members of the library.</li>
+<li>In exacly one CPP file define following macro before this include. It enables also internal definitions.</li>
 </ol>
-<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div></div><!-- fragment --><h1><a class="anchor" id="initialization"></a>
+<div class="fragment"><div class="line"><span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><span class="preprocessor">#include &quot;vk_mem_alloc.h&quot;</span></div></div><!-- fragment --><p>It may be a good idea to create dedicated CPP file just for this purpose.</p>
+<h1><a class="anchor" id="quick_start_initialization"></a>
 Initialization</h1>
 <p>At program startup:</p>
 <ol type="1">
 <li>Initialize Vulkan to have <code>VkPhysicalDevice</code> and <code>VkDevice</code> object.</li>
-<li>Fill <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created. ">VmaAllocatorCreateInfo</a> structure and create <code>VmaAllocator</code> object by calling <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object. ">vmaCreateAllocator()</a>.</li>
+<li>Fill <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created. ">VmaAllocatorCreateInfo</a> structure and create <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a> object by calling <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object. ">vmaCreateAllocator()</a>.</li>
 </ol>
-<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> allocatorInfo = {};</div><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> = physicalDevice;</div><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a> = device;</div><div class="line"></div><div class="line">VmaAllocator allocator;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div></div><!-- fragment --><h1><a class="anchor" id="resource_allocation"></a>
+<div class="fragment"><div class="line"><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> allocatorInfo = {};</div><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> = physicalDevice;</div><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a> = device;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div></div><!-- fragment --><h1><a class="anchor" id="quick_start_resource_allocation"></a>
 Resource allocation</h1>
 <p>When you want to create a buffer or image:</p>
 <ol type="1">
@@ -88,7 +91,7 @@
 <li>Fill <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> structure.</li>
 <li>Call <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a> / <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer(). ">vmaCreateImage()</a> to get <code>VkBuffer</code>/<code>VkImage</code> with memory already allocated and bound to it.</li>
 </ol>
-<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufferInfo.size = 65536;</div><div class="line">bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line">VmaAllocation allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>Don't forget to destroy your objects when no longer needed:</p>
+<div class="fragment"><div class="line">VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };</div><div class="line">bufferInfo.size = 65536;</div><div class="line">bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;</div><div class="line"></div><div class="line"><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> allocInfo = {};</div><div class="line">allocInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a> = <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>;</div><div class="line"></div><div class="line">VkBuffer buffer;</div><div class="line"><a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation;</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(allocator, &amp;bufferInfo, &amp;allocInfo, &amp;buffer, &amp;allocation, <span class="keyword">nullptr</span>);</div></div><!-- fragment --><p>Don't forget to destroy your objects when no longer needed:</p>
 <div class="fragment"><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(allocator, buffer, allocation);</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(allocator);</div></div><!-- fragment --> </div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js
index 269b59b..a4ffe71 100644
--- a/docs/html/search/all_0.js
+++ b/docs/html/search/all_0.js
@@ -1,6 +1,5 @@
 var searchData=
 [
-  ['about_20the_20library',['About the library',['../about_the_library.html',1,'index']]],
   ['allocation_20names_20and_20user_20data',['Allocation names and user data',['../allocation_annotation.html',1,'index']]],
   ['allocationcount',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()']]],
   ['allocationsizeavg',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]],
diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js
index 2cd9042..93e8ffe 100644
--- a/docs/html/search/all_5.js
+++ b/docs/html/search/all_5.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['lost_20allocations',['Lost allocations',['../lost_allocations.html',1,'index']]]
+  ['general_20considerations',['General considerations',['../general_considerations.html',1,'index']]]
 ];
diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js
index 8e80e1a..2cd9042 100644
--- a/docs/html/search/all_6.js
+++ b/docs/html/search/all_6.js
@@ -1,12 +1,4 @@
 var searchData=
 [
-  ['maxallocationstomove',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]],
-  ['maxblockcount',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]],
-  ['maxbytestomove',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]],
-  ['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']]]
+  ['lost_20allocations',['Lost allocations',['../lost_allocations.html',1,'index']]]
 ];
diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js
index c9c4229..8e80e1a 100644
--- a/docs/html/search/all_7.js
+++ b/docs/html/search/all_7.js
@@ -1,4 +1,12 @@
 var searchData=
 [
-  ['offset',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo']]]
+  ['maxallocationstomove',['maxAllocationsToMove',['../struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc',1,'VmaDefragmentationInfo']]],
+  ['maxblockcount',['maxBlockCount',['../struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c',1,'VmaPoolCreateInfo']]],
+  ['maxbytestomove',['maxBytesToMove',['../struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d',1,'VmaDefragmentationInfo']]],
+  ['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/all_8.js b/docs/html/search/all_8.js
index 590465a..c9c4229 100644
--- a/docs/html/search/all_8.js
+++ b/docs/html/search/all_8.js
@@ -1,17 +1,4 @@
 var searchData=
 [
-  ['pallocationcallbacks',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
-  ['pdevicememorycallbacks',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
-  ['pfn_5fvmaallocatedevicememoryfunction',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b',1,'vk_mem_alloc.h']]],
-  ['pfn_5fvmafreedevicememoryfunction',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49',1,'vk_mem_alloc.h']]],
-  ['pfnallocate',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
-  ['pfnfree',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
-  ['pheapsizelimit',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
-  ['physicaldevice',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]],
-  ['pmappeddata',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
-  ['pool',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
-  ['preferredflags',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
-  ['preferredlargeheapblocksize',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
-  ['puserdata',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
-  ['pvulkanfunctions',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
+  ['offset',['offset',['../struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268',1,'VmaAllocationInfo']]]
 ];
diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js
index de761c9..590465a 100644
--- a/docs/html/search/all_9.js
+++ b/docs/html/search/all_9.js
@@ -1,4 +1,17 @@
 var searchData=
 [
-  ['quick_20start',['Quick start',['../quick_start.html',1,'index']]]
+  ['pallocationcallbacks',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
+  ['pdevicememorycallbacks',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
+  ['pfn_5fvmaallocatedevicememoryfunction',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b',1,'vk_mem_alloc.h']]],
+  ['pfn_5fvmafreedevicememoryfunction',['PFN_vmaFreeDeviceMemoryFunction',['../vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49',1,'vk_mem_alloc.h']]],
+  ['pfnallocate',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
+  ['pfnfree',['pfnFree',['../struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c',1,'VmaDeviceMemoryCallbacks']]],
+  ['pheapsizelimit',['pHeapSizeLimit',['../struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b',1,'VmaAllocatorCreateInfo']]],
+  ['physicaldevice',['physicalDevice',['../struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156',1,'VmaAllocatorCreateInfo']]],
+  ['pmappeddata',['pMappedData',['../struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2',1,'VmaAllocationInfo']]],
+  ['pool',['pool',['../struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150',1,'VmaAllocationCreateInfo']]],
+  ['preferredflags',['preferredFlags',['../struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d',1,'VmaAllocationCreateInfo']]],
+  ['preferredlargeheapblocksize',['preferredLargeHeapBlockSize',['../struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a',1,'VmaAllocatorCreateInfo']]],
+  ['puserdata',['pUserData',['../struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19',1,'VmaAllocationCreateInfo::pUserData()'],['../struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13',1,'VmaAllocationInfo::pUserData()']]],
+  ['pvulkanfunctions',['pVulkanFunctions',['../struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd',1,'VmaAllocatorCreateInfo']]]
 ];
diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js
index 9505699..de761c9 100644
--- a/docs/html/search/all_a.js
+++ b/docs/html/search/all_a.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['requiredflags',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]]
+  ['quick_20start',['Quick start',['../quick_start.html',1,'index']]]
 ];
diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js
index 740c955..f3376c8 100644
--- a/docs/html/search/all_b.js
+++ b/docs/html/search/all_b.js
@@ -1,4 +1,5 @@
 var searchData=
 [
-  ['size',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]]
+  ['requiredflags',['requiredFlags',['../struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90',1,'VmaAllocationCreateInfo']]],
+  ['recommended_20usage_20patterns',['Recommended usage patterns',['../usage_patterns.html',1,'index']]]
 ];
diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js
index 439118e..e93f611 100644
--- a/docs/html/search/all_c.js
+++ b/docs/html/search/all_c.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['thread_20safety',['Thread safety',['../thread_safety.html',1,'index']]],
-  ['total',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
+  ['size',['size',['../struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c',1,'VmaPoolStats::size()'],['../struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f',1,'VmaAllocationInfo::size()']]],
+  ['statistics',['Statistics',['../statistics.html',1,'index']]]
 ];
diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js
index bb52d7a..f8fbe3d 100644
--- a/docs/html/search/all_d.js
+++ b/docs/html/search/all_d.js
@@ -1,11 +1,4 @@
 var searchData=
 [
-  ['unusedbytes',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
-  ['unusedrangecount',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
-  ['unusedrangesizeavg',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
-  ['unusedrangesizemax',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
-  ['unusedrangesizemin',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
-  ['unusedsize',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
-  ['usage',['usage',['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo']]],
-  ['usedbytes',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
+  ['total',['total',['../struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9',1,'VmaStats']]]
 ];
diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js
index ba33b86..bb52d7a 100644
--- a/docs/html/search/all_e.js
+++ b/docs/html/search/all_e.js
@@ -1,90 +1,11 @@
 var searchData=
 [
-  ['vulkan_20memory_20allocator',['Vulkan Memory Allocator',['../index.html',1,'']]],
-  ['vk_5fkhr_5fdedicated_5fallocation',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]],
-  ['vk_5fmem_5falloc_2eh',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]],
-  ['vkallocatememory',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
-  ['vkbindbuffermemory',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
-  ['vkbindimagememory',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
-  ['vkcreatebuffer',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
-  ['vkcreateimage',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
-  ['vkdestroybuffer',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
-  ['vkdestroyimage',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
-  ['vkfreememory',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
-  ['vkgetbuffermemoryrequirements',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
-  ['vkgetbuffermemoryrequirements2khr',['vkGetBufferMemoryRequirements2KHR',['../struct_vma_vulkan_functions.html#a9d8d1b05d2b1e7e1d9b27f6f585acf9c',1,'VmaVulkanFunctions']]],
-  ['vkgetimagememoryrequirements',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
-  ['vkgetimagememoryrequirements2khr',['vkGetImageMemoryRequirements2KHR',['../struct_vma_vulkan_functions.html#a9cdcdc1e2b2ea7c571f7d27e30ba6875',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldevicememoryproperties',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
-  ['vkgetphysicaldeviceproperties',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
-  ['vkmapmemory',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
-  ['vkunmapmemory',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]],
-  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fmapped_5fbit',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
-  ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fonly',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fonly',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5fmax_5fenum',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
-  ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
-  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
-  ['vma_5fstats_5fstring_5fenabled',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememory',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
-  ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
-  ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmaallocationcreateflags',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
-  ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a',1,'VmaAllocationCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmaallocationinfo',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255',1,'VmaAllocationInfo():&#160;vk_mem_alloc.h']]],
-  ['vmaallocatorcreateflagbits',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmaallocatorcreateflags',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
-  ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283',1,'VmaAllocatorCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmabuildstatsstring',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
-  ['vmacalculatestats',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
-  ['vmacreateallocator',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
-  ['vmacreatebuffer',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]],
-  ['vmacreateimage',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]],
-  ['vmacreatelostallocation',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]],
-  ['vmacreatepool',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]],
-  ['vmadefragment',['vmaDefragment',['../vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb',1,'vk_mem_alloc.h']]],
-  ['vmadefragmentationinfo',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'VmaDefragmentationInfo'],['../vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0',1,'VmaDefragmentationInfo():&#160;vk_mem_alloc.h']]],
-  ['vmadefragmentationstats',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'VmaDefragmentationStats'],['../vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9',1,'VmaDefragmentationStats():&#160;vk_mem_alloc.h']]],
-  ['vmadestroyallocator',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]],
-  ['vmadestroybuffer',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]],
-  ['vmadestroyimage',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]],
-  ['vmadestroypool',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]],
-  ['vmadevicememorycallbacks',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31',1,'VmaDeviceMemoryCallbacks():&#160;vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindex',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforbufferinfo',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]],
-  ['vmafindmemorytypeindexforimageinfo',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]],
-  ['vmafreememory',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568',1,'vk_mem_alloc.h']]],
-  ['vmafreestatsstring',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]],
-  ['vmagetallocationinfo',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]],
-  ['vmagetmemoryproperties',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]],
-  ['vmagetmemorytypeproperties',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]],
-  ['vmagetphysicaldeviceproperties',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]],
-  ['vmagetpoolstats',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]],
-  ['vmamakepoolallocationslost',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]],
-  ['vmamapmemory',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]],
-  ['vmamemoryusage',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ad63b2113c0bfdbeade1cb498f5a8580d',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h']]],
-  ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h']]],
-  ['vmapoolcreateflags',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
-  ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo'],['../vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7',1,'VmaPoolCreateInfo():&#160;vk_mem_alloc.h']]],
-  ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34',1,'VmaPoolStats():&#160;vk_mem_alloc.h']]],
-  ['vmasetallocationuserdata',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
-  ['vmasetcurrentframeindex',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
-  ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c',1,'VmaStatInfo():&#160;vk_mem_alloc.h']]],
-  ['vmastats',['VmaStats',['../struct_vma_stats.html',1,'VmaStats'],['../vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af',1,'VmaStats():&#160;vk_mem_alloc.h']]],
-  ['vmatouchallocation',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]],
-  ['vmaunmapmemory',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]],
-  ['vmavulkanfunctions',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'VmaVulkanFunctions'],['../vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5',1,'VmaVulkanFunctions():&#160;vk_mem_alloc.h']]]
+  ['unusedbytes',['unusedBytes',['../struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669',1,'VmaStatInfo']]],
+  ['unusedrangecount',['unusedRangeCount',['../struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9',1,'VmaStatInfo::unusedRangeCount()'],['../struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4',1,'VmaPoolStats::unusedRangeCount()']]],
+  ['unusedrangesizeavg',['unusedRangeSizeAvg',['../struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc',1,'VmaStatInfo']]],
+  ['unusedrangesizemax',['unusedRangeSizeMax',['../struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4',1,'VmaStatInfo::unusedRangeSizeMax()'],['../struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b',1,'VmaPoolStats::unusedRangeSizeMax()']]],
+  ['unusedrangesizemin',['unusedRangeSizeMin',['../struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4',1,'VmaStatInfo']]],
+  ['unusedsize',['unusedSize',['../struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8',1,'VmaPoolStats']]],
+  ['usage',['usage',['../struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910',1,'VmaAllocationCreateInfo']]],
+  ['usedbytes',['usedBytes',['../struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a',1,'VmaStatInfo']]]
 ];
diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html
new file mode 100644
index 0000000..6ecfc0e
--- /dev/null
+++ b/docs/html/search/all_f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js
new file mode 100644
index 0000000..c41492b
--- /dev/null
+++ b/docs/html/search/all_f.js
@@ -0,0 +1,95 @@
+var searchData=
+[
+  ['vulkan_20memory_20allocator',['Vulkan Memory Allocator',['../index.html',1,'']]],
+  ['vk_5fkhr_5fdedicated_5fallocation',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]],
+  ['vk_5fmem_5falloc_2eh',['vk_mem_alloc.h',['../vk__mem__alloc_8h.html',1,'']]],
+  ['vkallocatememory',['vkAllocateMemory',['../struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c',1,'VmaVulkanFunctions']]],
+  ['vkbindbuffermemory',['vkBindBufferMemory',['../struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2',1,'VmaVulkanFunctions']]],
+  ['vkbindimagememory',['vkBindImageMemory',['../struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637',1,'VmaVulkanFunctions']]],
+  ['vkcreatebuffer',['vkCreateBuffer',['../struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f',1,'VmaVulkanFunctions']]],
+  ['vkcreateimage',['vkCreateImage',['../struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325',1,'VmaVulkanFunctions']]],
+  ['vkdestroybuffer',['vkDestroyBuffer',['../struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45',1,'VmaVulkanFunctions']]],
+  ['vkdestroyimage',['vkDestroyImage',['../struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa',1,'VmaVulkanFunctions']]],
+  ['vkfreememory',['vkFreeMemory',['../struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4',1,'VmaVulkanFunctions']]],
+  ['vkgetbuffermemoryrequirements',['vkGetBufferMemoryRequirements',['../struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143',1,'VmaVulkanFunctions']]],
+  ['vkgetbuffermemoryrequirements2khr',['vkGetBufferMemoryRequirements2KHR',['../struct_vma_vulkan_functions.html#a9d8d1b05d2b1e7e1d9b27f6f585acf9c',1,'VmaVulkanFunctions']]],
+  ['vkgetimagememoryrequirements',['vkGetImageMemoryRequirements',['../struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4',1,'VmaVulkanFunctions']]],
+  ['vkgetimagememoryrequirements2khr',['vkGetImageMemoryRequirements2KHR',['../struct_vma_vulkan_functions.html#a9cdcdc1e2b2ea7c571f7d27e30ba6875',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldevicememoryproperties',['vkGetPhysicalDeviceMemoryProperties',['../struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830',1,'VmaVulkanFunctions']]],
+  ['vkgetphysicaldeviceproperties',['vkGetPhysicalDeviceProperties',['../struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96',1,'VmaVulkanFunctions']]],
+  ['vkmapmemory',['vkMapMemory',['../struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49',1,'VmaVulkanFunctions']]],
+  ['vkunmapmemory',['vkUnmapMemory',['../struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9',1,'VmaVulkanFunctions']]],
+  ['vma_5fallocation_5fcreate_5fcan_5fbecome_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fcan_5fmake_5fother_5flost_5fbit',['VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fdedicated_5fmemory_5fbit',['VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fmapped_5fbit',['VMA_ALLOCATION_CREATE_MAPPED_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fnever_5fallocate_5fbit',['VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocation_5fcreate_5fuser_5fdata_5fcopy_5fstring_5fbit',['VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fexternally_5fsynchronized_5fbit',['VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c',1,'vk_mem_alloc.h']]],
+  ['vma_5fallocator_5fcreate_5fkhr_5fdedicated_5fallocation_5fbit',['VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fonly',['VMA_MEMORY_USAGE_CPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fcpu_5fto_5fgpu',['VMA_MEMORY_USAGE_CPU_TO_GPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fonly',['VMA_MEMORY_USAGE_GPU_ONLY',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fgpu_5fto_5fcpu',['VMA_MEMORY_USAGE_GPU_TO_CPU',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5fmax_5fenum',['VMA_MEMORY_USAGE_MAX_ENUM',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e',1,'vk_mem_alloc.h']]],
+  ['vma_5fmemory_5fusage_5funknown',['VMA_MEMORY_USAGE_UNKNOWN',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fflag_5fbits_5fmax_5fenum',['VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec',1,'vk_mem_alloc.h']]],
+  ['vma_5fpool_5fcreate_5fignore_5fbuffer_5fimage_5fgranularity_5fbit',['VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2',1,'vk_mem_alloc.h']]],
+  ['vma_5fstats_5fstring_5fenabled',['VMA_STATS_STRING_ENABLED',['../vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememory',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
+  ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
+  ['vmaallocation',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
+  ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#abf6bf6748c7a9fe7ce5b7835c0f56af4',1,'VmaAllocationCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmaallocationcreateflags',['VmaAllocationCreateFlags',['../vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817',1,'vk_mem_alloc.h']]],
+  ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'VmaAllocationCreateInfo'],['../vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a',1,'VmaAllocationCreateInfo():&#160;vk_mem_alloc.h']]],
+  ['vmaallocationinfo',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'VmaAllocationInfo'],['../vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255',1,'VmaAllocationInfo():&#160;vk_mem_alloc.h']]],
+  ['vmaallocator',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
+  ['vmaallocatorcreateflagbits',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915',1,'VmaAllocatorCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmaallocatorcreateflags',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
+  ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'VmaAllocatorCreateInfo'],['../vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283',1,'VmaAllocatorCreateInfo():&#160;vk_mem_alloc.h']]],
+  ['vmabindbuffermemory',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]],
+  ['vmabuildstatsstring',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
+  ['vmacalculatestats',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
+  ['vmacreateallocator',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
+  ['vmacreatebuffer',['vmaCreateBuffer',['../vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51',1,'vk_mem_alloc.h']]],
+  ['vmacreateimage',['vmaCreateImage',['../vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73',1,'vk_mem_alloc.h']]],
+  ['vmacreatelostallocation',['vmaCreateLostAllocation',['../vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1',1,'vk_mem_alloc.h']]],
+  ['vmacreatepool',['vmaCreatePool',['../vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50',1,'vk_mem_alloc.h']]],
+  ['vmadefragment',['vmaDefragment',['../vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'VmaDefragmentationInfo'],['../vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0',1,'VmaDefragmentationInfo():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationstats',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'VmaDefragmentationStats'],['../vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9',1,'VmaDefragmentationStats():&#160;vk_mem_alloc.h']]],
+  ['vmadestroyallocator',['vmaDestroyAllocator',['../vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d',1,'vk_mem_alloc.h']]],
+  ['vmadestroybuffer',['vmaDestroyBuffer',['../vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77',1,'vk_mem_alloc.h']]],
+  ['vmadestroyimage',['vmaDestroyImage',['../vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e',1,'vk_mem_alloc.h']]],
+  ['vmadestroypool',['vmaDestroyPool',['../vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1',1,'vk_mem_alloc.h']]],
+  ['vmadevicememorycallbacks',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'VmaDeviceMemoryCallbacks'],['../vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31',1,'VmaDeviceMemoryCallbacks():&#160;vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindex',['vmaFindMemoryTypeIndex',['../vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforbufferinfo',['vmaFindMemoryTypeIndexForBufferInfo',['../vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888',1,'vk_mem_alloc.h']]],
+  ['vmafindmemorytypeindexforimageinfo',['vmaFindMemoryTypeIndexForImageInfo',['../vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472',1,'vk_mem_alloc.h']]],
+  ['vmafreememory',['vmaFreeMemory',['../vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568',1,'vk_mem_alloc.h']]],
+  ['vmafreestatsstring',['vmaFreeStatsString',['../vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288',1,'vk_mem_alloc.h']]],
+  ['vmagetallocationinfo',['vmaGetAllocationInfo',['../vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b',1,'vk_mem_alloc.h']]],
+  ['vmagetmemoryproperties',['vmaGetMemoryProperties',['../vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19',1,'vk_mem_alloc.h']]],
+  ['vmagetmemorytypeproperties',['vmaGetMemoryTypeProperties',['../vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca',1,'vk_mem_alloc.h']]],
+  ['vmagetphysicaldeviceproperties',['vmaGetPhysicalDeviceProperties',['../vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0',1,'vk_mem_alloc.h']]],
+  ['vmagetpoolstats',['vmaGetPoolStats',['../vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153',1,'vk_mem_alloc.h']]],
+  ['vmamakepoolallocationslost',['vmaMakePoolAllocationsLost',['../vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024',1,'vk_mem_alloc.h']]],
+  ['vmamapmemory',['vmaMapMemory',['../vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069',1,'vk_mem_alloc.h']]],
+  ['vmamemoryusage',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#ad63b2113c0bfdbeade1cb498f5a8580d',1,'VmaMemoryUsage():&#160;vk_mem_alloc.h']]],
+  ['vmapool',['VmaPool',['../struct_vma_pool.html',1,'']]],
+  ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a8f93195158e0e2ac80ca352064e71c1f',1,'VmaPoolCreateFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmapoolcreateflags',['VmaPoolCreateFlags',['../vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a',1,'vk_mem_alloc.h']]],
+  ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'VmaPoolCreateInfo'],['../vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7',1,'VmaPoolCreateInfo():&#160;vk_mem_alloc.h']]],
+  ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'VmaPoolStats'],['../vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34',1,'VmaPoolStats():&#160;vk_mem_alloc.h']]],
+  ['vmasetallocationuserdata',['vmaSetAllocationUserData',['../vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f',1,'vk_mem_alloc.h']]],
+  ['vmasetcurrentframeindex',['vmaSetCurrentFrameIndex',['../vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236',1,'vk_mem_alloc.h']]],
+  ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'VmaStatInfo'],['../vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c',1,'VmaStatInfo():&#160;vk_mem_alloc.h']]],
+  ['vmastats',['VmaStats',['../struct_vma_stats.html',1,'VmaStats'],['../vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af',1,'VmaStats():&#160;vk_mem_alloc.h']]],
+  ['vmatouchallocation',['vmaTouchAllocation',['../vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a',1,'vk_mem_alloc.h']]],
+  ['vmaunmapmemory',['vmaUnmapMemory',['../vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45',1,'vk_mem_alloc.h']]],
+  ['vmavulkanfunctions',['VmaVulkanFunctions',['../struct_vma_vulkan_functions.html',1,'VmaVulkanFunctions'],['../vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5',1,'VmaVulkanFunctions():&#160;vk_mem_alloc.h']]]
+];
diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js
index 6fa18bb..152fb2b 100644
--- a/docs/html/search/classes_0.js
+++ b/docs/html/search/classes_0.js
@@ -1,11 +1,14 @@
 var searchData=
 [
+  ['vmaallocation',['VmaAllocation',['../struct_vma_allocation.html',1,'']]],
   ['vmaallocationcreateinfo',['VmaAllocationCreateInfo',['../struct_vma_allocation_create_info.html',1,'']]],
   ['vmaallocationinfo',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]],
+  ['vmaallocator',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
   ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]],
   ['vmadefragmentationinfo',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]],
   ['vmadefragmentationstats',['VmaDefragmentationStats',['../struct_vma_defragmentation_stats.html',1,'']]],
   ['vmadevicememorycallbacks',['VmaDeviceMemoryCallbacks',['../struct_vma_device_memory_callbacks.html',1,'']]],
+  ['vmapool',['VmaPool',['../struct_vma_pool.html',1,'']]],
   ['vmapoolcreateinfo',['VmaPoolCreateInfo',['../struct_vma_pool_create_info.html',1,'']]],
   ['vmapoolstats',['VmaPoolStats',['../struct_vma_pool_stats.html',1,'']]],
   ['vmastatinfo',['VmaStatInfo',['../struct_vma_stat_info.html',1,'']]],
diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js
index e918fc3..efddc9f 100644
--- a/docs/html/search/functions_0.js
+++ b/docs/html/search/functions_0.js
@@ -3,6 +3,8 @@
   ['vmaallocatememory',['vmaAllocateMemory',['../vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8',1,'vk_mem_alloc.h']]],
   ['vmaallocatememoryforbuffer',['vmaAllocateMemoryForBuffer',['../vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b',1,'vk_mem_alloc.h']]],
   ['vmaallocatememoryforimage',['vmaAllocateMemoryForImage',['../vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb',1,'vk_mem_alloc.h']]],
+  ['vmabindbuffermemory',['vmaBindBufferMemory',['../vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470',1,'vk_mem_alloc.h']]],
+  ['vmabindimagememory',['vmaBindImageMemory',['../vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5',1,'vk_mem_alloc.h']]],
   ['vmabuildstatsstring',['vmaBuildStatsString',['../vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0',1,'vk_mem_alloc.h']]],
   ['vmacalculatestats',['vmaCalculateStats',['../vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3',1,'vk_mem_alloc.h']]],
   ['vmacreateallocator',['vmaCreateAllocator',['../vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb',1,'vk_mem_alloc.h']]],
diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js
index 6ae1461..703dee4 100644
--- a/docs/html/search/pages_0.js
+++ b/docs/html/search/pages_0.js
@@ -1,5 +1,4 @@
 var searchData=
 [
-  ['about_20the_20library',['About the library',['../about_the_library.html',1,'index']]],
   ['allocation_20names_20and_20user_20data',['Allocation names and user data',['../allocation_annotation.html',1,'index']]]
 ];
diff --git a/docs/html/search/pages_3.js b/docs/html/search/pages_3.js
index 2cd9042..93e8ffe 100644
--- a/docs/html/search/pages_3.js
+++ b/docs/html/search/pages_3.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['lost_20allocations',['Lost allocations',['../lost_allocations.html',1,'index']]]
+  ['general_20considerations',['General considerations',['../general_considerations.html',1,'index']]]
 ];
diff --git a/docs/html/search/pages_4.js b/docs/html/search/pages_4.js
index 125c1d3..2cd9042 100644
--- a/docs/html/search/pages_4.js
+++ b/docs/html/search/pages_4.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['memory_20mapping',['Memory mapping',['../memory_mapping.html',1,'index']]]
+  ['lost_20allocations',['Lost allocations',['../lost_allocations.html',1,'index']]]
 ];
diff --git a/docs/html/search/pages_5.js b/docs/html/search/pages_5.js
index de761c9..125c1d3 100644
--- a/docs/html/search/pages_5.js
+++ b/docs/html/search/pages_5.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['quick_20start',['Quick start',['../quick_start.html',1,'index']]]
+  ['memory_20mapping',['Memory mapping',['../memory_mapping.html',1,'index']]]
 ];
diff --git a/docs/html/search/pages_6.js b/docs/html/search/pages_6.js
index 50aac68..de761c9 100644
--- a/docs/html/search/pages_6.js
+++ b/docs/html/search/pages_6.js
@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['thread_20safety',['Thread safety',['../thread_safety.html',1,'index']]]
+  ['quick_20start',['Quick start',['../quick_start.html',1,'index']]]
 ];
diff --git a/docs/html/search/pages_7.js b/docs/html/search/pages_7.js
index f9c7890..1e4f738 100644
--- a/docs/html/search/pages_7.js
+++ b/docs/html/search/pages_7.js
@@ -1,5 +1,4 @@
 var searchData=
 [
-  ['vulkan_20memory_20allocator',['Vulkan Memory Allocator',['../index.html',1,'']]],
-  ['vk_5fkhr_5fdedicated_5fallocation',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]]
+  ['recommended_20usage_20patterns',['Recommended usage patterns',['../usage_patterns.html',1,'index']]]
 ];
diff --git a/docs/html/search/pages_8.html b/docs/html/search/pages_8.html
new file mode 100644
index 0000000..b704407
--- /dev/null
+++ b/docs/html/search/pages_8.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/docs/html/search/pages_8.js b/docs/html/search/pages_8.js
new file mode 100644
index 0000000..566811f
--- /dev/null
+++ b/docs/html/search/pages_8.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+  ['statistics',['Statistics',['../statistics.html',1,'index']]]
+];
diff --git a/docs/html/search/pages_9.html b/docs/html/search/pages_9.html
new file mode 100644
index 0000000..751a30f
--- /dev/null
+++ b/docs/html/search/pages_9.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/docs/html/search/pages_9.js b/docs/html/search/pages_9.js
new file mode 100644
index 0000000..f9c7890
--- /dev/null
+++ b/docs/html/search/pages_9.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+  ['vulkan_20memory_20allocator',['Vulkan Memory Allocator',['../index.html',1,'']]],
+  ['vk_5fkhr_5fdedicated_5fallocation',['VK_KHR_dedicated_allocation',['../vk_khr_dedicated_allocation.html',1,'index']]]
+];
diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js
index b48bb9e..4653a57 100644
--- a/docs/html/search/searchdata.js
+++ b/docs/html/search/searchdata.js
@@ -1,6 +1,6 @@
 var indexSectionsWithContent =
 {
-  0: "abcdflmopqrstuv",
+  0: "abcdfglmopqrstuv",
   1: "v",
   2: "v",
   3: "v",
@@ -9,7 +9,7 @@
   6: "v",
   7: "v",
   8: "v",
-  9: "acdlmqtv"
+  9: "acdglmqrsv"
 };
 
 var indexSectionNames =
diff --git a/docs/html/statistics.html b/docs/html/statistics.html
new file mode 100644
index 0000000..ecc9ca2
--- /dev/null
+++ b/docs/html/statistics.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: Statistics</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">Statistics </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>This library contains functions that return information about its internal state, especially the amount of memory allocated from Vulkan. Please keep in mind that these functions need to traverse all internal data structures to gather these information, so they may be quite time-consuming. Don't call them too often.</p>
+<h1><a class="anchor" id="statistics_numeric_statistics"></a>
+Numeric statistics</h1>
+<p>You can query for overall statistics of the allocator using function <a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3" title="Retrieves statistics from current state of the Allocator. ">vmaCalculateStats()</a>. Information are returned using structure <a class="el" href="struct_vma_stats.html" title="General statistics from current state of Allocator. ">VmaStats</a>. It contains <a class="el" href="struct_vma_stat_info.html" title="Calculated statistics of memory usage in entire allocator. ">VmaStatInfo</a> - number of allocated blocks, number of allocations (occupied ranges in these blocks), number of unused (free) ranges in these blocks, number of bytes used and unused (but still allocated from Vulkan) and other information. They are summed across memory heaps, memory types and total for whole allocator.</p>
+<p>You can query for statistics of a custom pool using function <a class="el" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153" title="Retrieves statistics of existing VmaPool object. ">vmaGetPoolStats()</a>. Information are returned using structure <a class="el" href="struct_vma_pool_stats.html" title="Describes parameter of existing VmaPool. ">VmaPoolStats</a>.</p>
+<p>You can query for information about specific allocation using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. It fill structure <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). ">VmaAllocationInfo</a>.</p>
+<h1><a class="anchor" id="statistics_json_dump"></a>
+JSON dump</h1>
+<p>You can dump internal state of the allocator to a string in JSON format using function <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format. ">vmaBuildStatsString()</a>. The result is guaranteed to be correct JSON. It uses ANSI encoding. Any strings provided by user (see <a class="el" href="allocation_annotation.html#allocation_names">Allocation names</a>) are copied as-is and properly escaped for JSON, so if they use UTF-8, ISO-8859-2 or any other encoding, this JSON string can be treated as using this encoding. It must be freed using function <a class="el" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString()</a>.</p>
+<p>The format of this JSON string is not part of official documentation of the library, but it will not change in backward-incompatible way without increasing library major version number and appropriate mention in changelog.</p>
+<p>The JSON string contains all the data that can be obtained using <a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3" title="Retrieves statistics from current state of the Allocator. ">vmaCalculateStats()</a>. It can also contain detailed map of allocated memory blocks and their regions - free and occupied by allocations. This allows e.g. to visualize the memory or assess fragmentation. </p>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_allocation.html b/docs/html/struct_vma_allocation.html
new file mode 100644
index 0000000..7e0dc83
--- /dev/null
+++ b/docs/html/struct_vma_allocation.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: VmaAllocation Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">VmaAllocation Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Represents single memory allocation.  
+ <a href="struct_vma_allocation.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Represents single memory allocation. </p>
+<p>It may be either dedicated block of <code>VkDeviceMemory</code> or a specific region of a bigger block of this type plus unique offset.</p>
+<p>There are multiple ways to create such object. You need to fill structure <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>. For more information see <a class="el" href="choosing_memory_type.html">Choosing memory type</a>.</p>
+<p>Although the library provides convenience functions that create Vulkan buffer or image, allocate memory for it and bind them together, binding of the allocation to a buffer or an image is out of scope of the allocation itself. Allocation object can exist without buffer/image bound, binding can be done manually by the user, and destruction of it can be done independently of destruction of the allocation.</p>
+<p>The object also remembers its size and some other information. To retrieve this information, use function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and inspect returned structure <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). ">VmaAllocationInfo</a>.</p>
+<p>Some kinds allocations can be in lost state. For more information, see <a class="el" href="lost_allocations.html">Lost allocations</a>. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_allocation_create_info.html b/docs/html/struct_vma_allocation_create_info.html
index 30623d1..1bd8a32 100644
--- a/docs/html/struct_vma_allocation_create_info.html
+++ b/docs/html/struct_vma_allocation_create_info.html
@@ -85,11 +85,11 @@
 <tr class="memitem:a3bf940c0271d85d6ba32a4d820075055"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a></td></tr>
 <tr class="memdesc:a3bf940c0271d85d6ba32a4d820075055"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bitmask containing one bit set for every memory type acceptable for this allocation.  <a href="#a3bf940c0271d85d6ba32a4d820075055">More...</a><br /></td></tr>
 <tr class="separator:a3bf940c0271d85d6ba32a4d820075055"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a6272c0555cfd1fe28bff1afeb6190150"><td class="memItemLeft" align="right" valign="top">VmaPool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a></td></tr>
+<tr class="memitem:a6272c0555cfd1fe28bff1afeb6190150"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a></td></tr>
 <tr class="memdesc:a6272c0555cfd1fe28bff1afeb6190150"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pool that this allocation should be created in.  <a href="#a6272c0555cfd1fe28bff1afeb6190150">More...</a><br /></td></tr>
 <tr class="separator:a6272c0555cfd1fe28bff1afeb6190150"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8259e85c272683434f4abb4ddddffe19"><td class="memItemLeft" align="right" valign="top">void *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a></td></tr>
-<tr class="memdesc:a8259e85c272683434f4abb4ddddffe19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value. ">vmaSetAllocationUserData()</a>.  <a href="#a8259e85c272683434f4abb4ddddffe19">More...</a><br /></td></tr>
+<tr class="memdesc:a8259e85c272683434f4abb4ddddffe19"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value. ">vmaSetAllocationUserData()</a>.  <a href="#a8259e85c272683434f4abb4ddddffe19">More...</a><br /></td></tr>
 <tr class="separator:a8259e85c272683434f4abb4ddddffe19"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <h2 class="groupheader">Member Data Documentation</h2>
@@ -134,7 +134,7 @@
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">VmaPool VmaAllocationCreateInfo::pool</td>
+          <td class="memname"><a class="el" href="struct_vma_pool.html">VmaPool</a> VmaAllocationCreateInfo::pool</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -174,8 +174,8 @@
       </table>
 </div><div class="memdoc">
 
-<p>Custom general-purpose pointer that will be stored in VmaAllocation, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value. ">vmaSetAllocationUserData()</a>. </p>
-<p>If <code>VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</code> is used, it must be either null or pointer to a null-terminated string. The string will be then copied to internal buffer, so it doesn't need to be valid after allocation call. </p>
+<p>Custom general-purpose pointer that will be stored in <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>, can be read as <a class="el" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13" title="Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...">VmaAllocationInfo::pUserData</a> and changed using <a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f" title="Sets pUserData in given allocation to new value. ">vmaSetAllocationUserData()</a>. </p>
+<p>If <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> is used, it must be either null or pointer to a null-terminated string. The string will be then copied to internal buffer, so it doesn't need to be valid after allocation call. </p>
 
 </div>
 </div>
@@ -210,7 +210,7 @@
 </div><div class="memdoc">
 
 <p>Intended usage of memory. </p>
-<p>You can leave <code>VMA_MEMORY_USAGE_UNKNOWN</code> if you specify memory requirements in other way. <br />
+<p>You can leave <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> if you specify memory requirements in other way. <br />
 If <code>pool</code> is not null, this member is ignored. </p>
 
 </div>
diff --git a/docs/html/struct_vma_allocation_info.html b/docs/html/struct_vma_allocation_info.html
index 52cb2f8..eaf2de5 100644
--- a/docs/html/struct_vma_allocation_info.html
+++ b/docs/html/struct_vma_allocation_info.html
@@ -66,7 +66,7 @@
 </div><!--header-->
 <div class="contents">
 
-<p>Parameters of <code>VmaAllocation</code> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a>.  
+<p>Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.  
  <a href="struct_vma_allocation_info.html#details">More...</a></p>
 
 <p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
@@ -93,7 +93,7 @@
 <tr class="separator:adc507656149c04de7ed95d0042ba2a13"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Parameters of <code>VmaAllocation</code> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a>. </p>
+<div class="textblock"><p>Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="ae0bfb7dfdf79a76ffefc9a94677a2f67"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ae0bfb7dfdf79a76ffefc9a94677a2f67">&#9670;&nbsp;</a></span>deviceMemory</h2>
@@ -161,7 +161,7 @@
 </div><div class="memdoc">
 
 <p>Pointer to the beginning of this allocation as mapped data. </p>
-<p>If the allocation hasn't been mapped using <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> and hasn't been created with <code>VMA_ALLOCATION_CREATE_MAPPED_BIT</code> flag, this value null.</p>
+<p>If the allocation hasn't been mapped using <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> and hasn't been created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag, this value null.</p>
 <p>It can change after call to <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a>. It can also change after call to <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a> if this allocation is passed to the function. </p>
 
 </div>
diff --git a/docs/html/struct_vma_allocator.html b/docs/html/struct_vma_allocator.html
new file mode 100644
index 0000000..0f6dd81
--- /dev/null
+++ b/docs/html/struct_vma_allocator.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: VmaAllocator Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">VmaAllocator Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Represents main object of this library initialized.  
+ <a href="struct_vma_allocator.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Represents main object of this library initialized. </p>
+<p>Fill structure <a class="el" href="struct_vma_allocator_create_info.html" title="Description of a Allocator to be created. ">VmaAllocatorCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb" title="Creates Allocator object. ">vmaCreateAllocator()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d" title="Destroys allocator object. ">vmaDestroyAllocator()</a> to destroy it.</p>
+<p>It is recommended to create just one object of this type per <code>VkDevice</code> object, right after Vulkan is initialized and keep it alive until before Vulkan device is destroyed. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_allocator_create_info.html b/docs/html/struct_vma_allocator_create_info.html
index 3391251..35e8d05 100644
--- a/docs/html/struct_vma_allocator_create_info.html
+++ b/docs/html/struct_vma_allocator_create_info.html
@@ -83,19 +83,19 @@
 <tr class="memdesc:ad924ddd77b04039c88d0c09b0ffcd500"><td class="mdescLeft">&#160;</td><td class="mdescRight">Vulkan device.  <a href="#ad924ddd77b04039c88d0c09b0ffcd500">More...</a><br /></td></tr>
 <tr class="separator:ad924ddd77b04039c88d0c09b0ffcd500"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a8e4714298e3121cdd8b214a1ae7a637a"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a></td></tr>
-<tr class="memdesc:a8e4714298e3121cdd8b214a1ae7a637a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Preferred size of a single <code>VkDeviceMemory</code> block to be allocated from large heaps &gt; 1 GiB.  <a href="#a8e4714298e3121cdd8b214a1ae7a637a">More...</a><br /></td></tr>
+<tr class="memdesc:a8e4714298e3121cdd8b214a1ae7a637a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Preferred size of a single <code>VkDeviceMemory</code> block to be allocated from large heaps &gt; 1 GiB. Optional.  <a href="#a8e4714298e3121cdd8b214a1ae7a637a">More...</a><br /></td></tr>
 <tr class="separator:a8e4714298e3121cdd8b214a1ae7a637a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a6e409087e3be55400d0e4ccbe43c608d"><td class="memItemLeft" align="right" valign="top">const VkAllocationCallbacks *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a></td></tr>
-<tr class="memdesc:a6e409087e3be55400d0e4ccbe43c608d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom CPU memory allocation callbacks.  <a href="#a6e409087e3be55400d0e4ccbe43c608d">More...</a><br /></td></tr>
+<tr class="memdesc:a6e409087e3be55400d0e4ccbe43c608d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Custom CPU memory allocation callbacks. Optional.  <a href="#a6e409087e3be55400d0e4ccbe43c608d">More...</a><br /></td></tr>
 <tr class="separator:a6e409087e3be55400d0e4ccbe43c608d"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:af1380969b5e1ea4c3184a877892d260e"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a></td></tr>
-<tr class="memdesc:af1380969b5e1ea4c3184a877892d260e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informative callbacks for vkAllocateMemory, vkFreeMemory.  <a href="#af1380969b5e1ea4c3184a877892d260e">More...</a><br /></td></tr>
+<tr class="memdesc:af1380969b5e1ea4c3184a877892d260e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Informative callbacks for <code>vkAllocateMemory</code>, <code>vkFreeMemory</code>. Optional.  <a href="#af1380969b5e1ea4c3184a877892d260e">More...</a><br /></td></tr>
 <tr class="separator:af1380969b5e1ea4c3184a877892d260e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a21ea188dd212b8171cb9ecbed4a2a3a7"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a></td></tr>
 <tr class="memdesc:a21ea188dd212b8171cb9ecbed4a2a3a7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of additional frames that are in use at the same time as current frame.  <a href="#a21ea188dd212b8171cb9ecbed4a2a3a7">More...</a><br /></td></tr>
 <tr class="separator:a21ea188dd212b8171cb9ecbed4a2a3a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a31c192aa6cbffa33279f6d9f0c47c44b"><td class="memItemLeft" align="right" valign="top">const VkDeviceSize *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a></td></tr>
-<tr class="memdesc:a31c192aa6cbffa33279f6d9f0c47c44b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Either NULL or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap.  <a href="#a31c192aa6cbffa33279f6d9f0c47c44b">More...</a><br /></td></tr>
+<tr class="memdesc:a31c192aa6cbffa33279f6d9f0c47c44b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap.  <a href="#a31c192aa6cbffa33279f6d9f0c47c44b">More...</a><br /></td></tr>
 <tr class="separator:a31c192aa6cbffa33279f6d9f0c47c44b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a3dc197be3227da7338b1643f70db36bd"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a></td></tr>
 <tr class="memdesc:a3dc197be3227da7338b1643f70db36bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointers to Vulkan functions. Can be null if you leave define <code>VMA_STATIC_VULKAN_FUNCTIONS 1</code>.  <a href="#a3dc197be3227da7338b1643f70db36bd">More...</a><br /></td></tr>
@@ -168,7 +168,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Custom CPU memory allocation callbacks. </p>
+<p>Custom CPU memory allocation callbacks. Optional. </p>
 <p>Optional, can be null. When specified, will also be used for all CPU-side memory allocations. </p>
 
 </div>
@@ -185,7 +185,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Informative callbacks for vkAllocateMemory, vkFreeMemory. </p>
+<p>Informative callbacks for <code>vkAllocateMemory</code>, <code>vkFreeMemory</code>. Optional. </p>
 <p>Optional, can be null. </p>
 
 </div>
@@ -202,7 +202,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Either NULL or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap. </p>
+<p>Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap. </p>
 <p>If not NULL, it must be a pointer to an array of <code>VkPhysicalDeviceMemoryProperties::memoryHeapCount</code> elements, defining limit on maximum number of bytes that can be allocated out of particular Vulkan memory heap.</p>
 <p>Any of the elements may be equal to <code>VK_WHOLE_SIZE</code>, which means no limit on that heap. This is also the default in case of <code>pHeapSizeLimit</code> = NULL.</p>
 <p>If there is a limit defined for a heap:</p>
@@ -243,7 +243,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Preferred size of a single <code>VkDeviceMemory</code> block to be allocated from large heaps &gt; 1 GiB. </p>
+<p>Preferred size of a single <code>VkDeviceMemory</code> block to be allocated from large heaps &gt; 1 GiB. Optional. </p>
 <p>Set to 0 to use default, which is currently 256 MiB. </p>
 
 </div>
diff --git a/docs/html/struct_vma_device_memory_callbacks.html b/docs/html/struct_vma_device_memory_callbacks.html
index 4838de2..701c578 100644
--- a/docs/html/struct_vma_device_memory_callbacks.html
+++ b/docs/html/struct_vma_device_memory_callbacks.html
@@ -83,7 +83,7 @@
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Set of callbacks that the library will call for <code>vkAllocateMemory</code> and <code>vkFreeMemory</code>. </p>
 <p>Provided for informative purpose, e.g. to gather statistics about number of allocations or total amount of memory allocated in Vulkan.</p>
-<p>Used in <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e" title="Informative callbacks for vkAllocateMemory, vkFreeMemory. ">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a>. </p>
+<p>Used in <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e" title="Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional. ">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="a4f17f7b255101e733b44d5633aceabfb"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#a4f17f7b255101e733b44d5633aceabfb">&#9670;&nbsp;</a></span>pfnAllocate</h2>
diff --git a/docs/html/struct_vma_pool.html b/docs/html/struct_vma_pool.html
new file mode 100644
index 0000000..92b3d44
--- /dev/null
+++ b/docs/html/struct_vma_pool.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: VmaPool Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">VmaPool Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Represents custom memory pool.  
+ <a href="struct_vma_pool.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Represents custom memory pool. </p>
+<p>Fill structure <a class="el" href="struct_vma_pool_create_info.html" title="Describes parameter of created VmaPool. ">VmaPoolCreateInfo</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50" title="Allocates Vulkan device memory and creates VmaPool object. ">vmaCreatePool()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1" title="Destroys VmaPool object and frees Vulkan device memory. ">vmaDestroyPool()</a> to destroy it.</p>
+<p>For more information see <a class="el" href="choosing_memory_type.html#choosing_memory_type_custom_memory_pools">Custom memory pools</a>. </p>
+</div><hr/>The documentation for this struct was generated from the following file:<ul>
+<li><a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_pool_create_info.html b/docs/html/struct_vma_pool_create_info.html
index 06fd23f..153ff87 100644
--- a/docs/html/struct_vma_pool_create_info.html
+++ b/docs/html/struct_vma_pool_create_info.html
@@ -66,7 +66,7 @@
 </div><!--header-->
 <div class="contents">
 
-<p>Describes parameter of created <code>VmaPool</code>.  
+<p>Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>.  
  <a href="struct_vma_pool_create_info.html#details">More...</a></p>
 
 <p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
@@ -86,14 +86,14 @@
 <tr class="memdesc:ad8006fb803185c0a699d30f3e9a865ae"><td class="mdescLeft">&#160;</td><td class="mdescRight">Minimum number of blocks to be always allocated in this pool, even if they stay empty.  <a href="#ad8006fb803185c0a699d30f3e9a865ae">More...</a><br /></td></tr>
 <tr class="separator:ad8006fb803185c0a699d30f3e9a865ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae41142f2834fcdc82baa4883c187b75c"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a></td></tr>
-<tr class="memdesc:ae41142f2834fcdc82baa4883c187b75c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of blocks that can be allocated in this pool.  <a href="#ae41142f2834fcdc82baa4883c187b75c">More...</a><br /></td></tr>
+<tr class="memdesc:ae41142f2834fcdc82baa4883c187b75c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of blocks that can be allocated in this pool. Optional.  <a href="#ae41142f2834fcdc82baa4883c187b75c">More...</a><br /></td></tr>
 <tr class="separator:ae41142f2834fcdc82baa4883c187b75c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a></td></tr>
 <tr class="memdesc:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of additional frames that are in use at the same time as current frame.  <a href="#a9437e43ffbb644dbbf7fc4e50cfad6aa">More...</a><br /></td></tr>
 <tr class="separator:a9437e43ffbb644dbbf7fc4e50cfad6aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Describes parameter of created <code>VmaPool</code>. </p>
+<div class="textblock"><p>Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="aa4265160536cdb9be821b7686c16c676"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aa4265160536cdb9be821b7686c16c676">&#9670;&nbsp;</a></span>blockSize</h2>
@@ -141,7 +141,7 @@
 </div><div class="memdoc">
 
 <p>Maximum number of additional frames that are in use at the same time as current frame. </p>
-<p>This value is used only when you make allocations with <code>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</code> flag. Such allocation cannot become lost if allocation.lastUseFrameIndex &gt;= allocator.currentFrameIndex - frameInUseCount.</p>
+<p>This value is used only when you make allocations with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag. Such allocation cannot become lost if allocation.lastUseFrameIndex &gt;= allocator.currentFrameIndex - frameInUseCount.</p>
 <p>For example, if you double-buffer your command buffers, so resources used for rendering in previous frame may still be in use by the GPU at the moment you allocate resources needed for the current frame, set this value to 1.</p>
 <p>If you want to allow any allocations other than used in the current frame to become lost, set this value to 0. </p>
 
@@ -159,7 +159,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Maximum number of blocks that can be allocated in this pool. </p>
+<p>Maximum number of blocks that can be allocated in this pool. Optional. </p>
 <p>Optional. Set to 0 to use <code>SIZE_MAX</code>, which means no limit.</p>
 <p>Set to same value as minBlockCount to have fixed amount of memory allocated throuout whole lifetime of this pool. </p>
 
diff --git a/docs/html/struct_vma_pool_stats.html b/docs/html/struct_vma_pool_stats.html
index 92e1999..3ee189b 100644
--- a/docs/html/struct_vma_pool_stats.html
+++ b/docs/html/struct_vma_pool_stats.html
@@ -66,7 +66,7 @@
 </div><!--header-->
 <div class="contents">
 
-<p>Describes parameter of existing <code>VmaPool</code>.  
+<p>Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>.  
  <a href="struct_vma_pool_stats.html#details">More...</a></p>
 
 <p><code>#include &lt;<a class="el" href="vk__mem__alloc_8h_source.html">vk_mem_alloc.h</a>&gt;</code></p>
@@ -77,20 +77,20 @@
 <tr class="memdesc:a326807b2de2b0931cee4ed9a5f2e420c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total amount of <code>VkDeviceMemory</code> allocated from Vulkan for this pool, in bytes.  <a href="#a326807b2de2b0931cee4ed9a5f2e420c">More...</a><br /></td></tr>
 <tr class="separator:a326807b2de2b0931cee4ed9a5f2e420c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad7c54874724fce7b06aba526202d82a8"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a></td></tr>
-<tr class="memdesc:ad7c54874724fce7b06aba526202d82a8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes in the pool not used by any <code>VmaAllocation</code>.  <a href="#ad7c54874724fce7b06aba526202d82a8">More...</a><br /></td></tr>
+<tr class="memdesc:ad7c54874724fce7b06aba526202d82a8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Total number of bytes in the pool not used by any <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>.  <a href="#ad7c54874724fce7b06aba526202d82a8">More...</a><br /></td></tr>
 <tr class="separator:ad7c54874724fce7b06aba526202d82a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ad1924eb54fffa45e9e0e65670c8fe5eb"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a></td></tr>
-<tr class="memdesc:ad1924eb54fffa45e9e0e65670c8fe5eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of VmaAllocation objects created from this pool that were not destroyed or lost.  <a href="#ad1924eb54fffa45e9e0e65670c8fe5eb">More...</a><br /></td></tr>
+<tr class="memdesc:ad1924eb54fffa45e9e0e65670c8fe5eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> objects created from this pool that were not destroyed or lost.  <a href="#ad1924eb54fffa45e9e0e65670c8fe5eb">More...</a><br /></td></tr>
 <tr class="separator:ad1924eb54fffa45e9e0e65670c8fe5eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae4f3546ffa4d1e598b64d8e6134854f4"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a></td></tr>
-<tr class="memdesc:ae4f3546ffa4d1e598b64d8e6134854f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of continuous memory ranges in the pool not used by any <code>VmaAllocation</code>.  <a href="#ae4f3546ffa4d1e598b64d8e6134854f4">More...</a><br /></td></tr>
+<tr class="memdesc:ae4f3546ffa4d1e598b64d8e6134854f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of continuous memory ranges in the pool not used by any <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>.  <a href="#ae4f3546ffa4d1e598b64d8e6134854f4">More...</a><br /></td></tr>
 <tr class="separator:ae4f3546ffa4d1e598b64d8e6134854f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ab4c8f52dd42ab01998f60f0b6acc722b"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a></td></tr>
 <tr class="memdesc:ab4c8f52dd42ab01998f60f0b6acc722b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Size of the largest continuous free memory region.  <a href="#ab4c8f52dd42ab01998f60f0b6acc722b">More...</a><br /></td></tr>
 <tr class="separator:ab4c8f52dd42ab01998f60f0b6acc722b"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
-<div class="textblock"><p>Describes parameter of existing <code>VmaPool</code>. </p>
+<div class="textblock"><p>Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="ad1924eb54fffa45e9e0e65670c8fe5eb"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ad1924eb54fffa45e9e0e65670c8fe5eb">&#9670;&nbsp;</a></span>allocationCount</h2>
@@ -104,7 +104,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Number of VmaAllocation objects created from this pool that were not destroyed or lost. </p>
+<p>Number of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> objects created from this pool that were not destroyed or lost. </p>
 
 </div>
 </div>
@@ -136,7 +136,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Number of continuous memory ranges in the pool not used by any <code>VmaAllocation</code>. </p>
+<p>Number of continuous memory ranges in the pool not used by any <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>. </p>
 
 </div>
 </div>
@@ -169,7 +169,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Total number of bytes in the pool not used by any <code>VmaAllocation</code>. </p>
+<p>Total number of bytes in the pool not used by any <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a>. </p>
 
 </div>
 </div>
diff --git a/docs/html/struct_vma_stat_info.html b/docs/html/struct_vma_stat_info.html
index 1a430fa..8dfebaa 100644
--- a/docs/html/struct_vma_stat_info.html
+++ b/docs/html/struct_vma_stat_info.html
@@ -77,7 +77,7 @@
 <tr class="memdesc:abc4bb7cd611900778464c56e50c970a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <code>VkDeviceMemory</code> Vulkan memory blocks allocated.  <a href="#abc4bb7cd611900778464c56e50c970a4">More...</a><br /></td></tr>
 <tr class="separator:abc4bb7cd611900778464c56e50c970a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a537741e4d5cdddc1c0ab95ec650afaff"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a></td></tr>
-<tr class="memdesc:a537741e4d5cdddc1c0ab95ec650afaff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <code>VmaAllocation</code> allocation objects allocated.  <a href="#a537741e4d5cdddc1c0ab95ec650afaff">More...</a><br /></td></tr>
+<tr class="memdesc:a537741e4d5cdddc1c0ab95ec650afaff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> allocation objects allocated.  <a href="#a537741e4d5cdddc1c0ab95ec650afaff">More...</a><br /></td></tr>
 <tr class="separator:a537741e4d5cdddc1c0ab95ec650afaff"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae06129c771bfebfd6468a7f4276502a9"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a></td></tr>
 <tr class="memdesc:ae06129c771bfebfd6468a7f4276502a9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of free ranges of memory between allocations.  <a href="#ae06129c771bfebfd6468a7f4276502a9">More...</a><br /></td></tr>
@@ -116,7 +116,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Number of <code>VmaAllocation</code> allocation objects allocated. </p>
+<p>Number of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> allocation objects allocated. </p>
 
 </div>
 </div>
diff --git a/docs/html/thread_safety.html b/docs/html/thread_safety.html
index 8585ce0..339e09d 100644
--- a/docs/html/thread_safety.html
+++ b/docs/html/thread_safety.html
@@ -67,10 +67,10 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><ul>
-<li>The library has no global state, so separate <code>VmaAllocator</code> objects can be used independently.</li>
+<li>The library has no global state, so separate <code>VmaAllocator</code> objects can be used independently. There should be no need to create multiple such objects though - one per <code>VkDevice</code> is enough.</li>
 <li>By default, all calls to functions that take <code>VmaAllocator</code> as first parameter are safe to call from multiple threads simultaneously because they are synchronized internally when needed.</li>
-<li>When the allocator is created with <code>VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</code> flag, calls to functions that take such <code>VmaAllocator</code> object must be synchronized externally.</li>
-<li>Access to a <code>VmaAllocation</code> object must be externally synchronized. For example, you must not call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> from different threads at the same time if you pass the same <code>VmaAllocation</code> object to these functions. </li>
+<li>When the allocator is created with <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d" title="Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> flag, calls to functions that take such <code>VmaAllocator</code> object must be synchronized externally.</li>
+<li>Access to a <code>VmaAllocation</code> object must be externally synchronized. For example, you must not call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a> from different threads at the same time if you pass the same <code>VmaAllocation</code> object to these functions. </li>
 </ul>
 </div></div><!-- contents -->
 <!-- start footer part -->
diff --git a/docs/html/usage_patterns.html b/docs/html/usage_patterns.html
new file mode 100644
index 0000000..9b9f459
--- /dev/null
+++ b/docs/html/usage_patterns.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.13"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: Recommended usage patterns</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+  <td id="projectalign" style="padding-left: 0.5em;">
+   <div id="projectname">Vulkan Memory Allocator
+   </div>
+  </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.13 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+     onmouseover="return searchBox.OnSearchSelectShow()"
+     onmouseout="return searchBox.OnSearchSelectHide()"
+     onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0" 
+        name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+  <ul>
+<li class="navelem"><a class="el" href="index.html">Vulkan Memory Allocator</a></li>  </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+  <div class="headertitle">
+<div class="title">Recommended usage patterns </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><h1><a class="anchor" id="usage_patterns_simple"></a>
+Simple patterns</h1>
+<h2><a class="anchor" id="usage_patterns_simple_render_targets"></a>
+Render targets</h2>
+<p><b>When:</b> Any resources that you frequently write and read on GPU, e.g. images used as color attachments (aka "render targets"), depth-stencil attachments, images/buffers used as storage image/buffer (aka "Unordered Access View (UAV)").</p>
+<p><b>What to do:</b> Create them in video memory that is fastest to access from GPU using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>.</p>
+<p>Consider using <a class="el" href="vk_khr_dedicated_allocation.html">VK_KHR_dedicated_allocation</a> extension and/or manually creating them as dedicated allocations using <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block. ">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>, especially if they are large or if you plan to destroy and recreate them e.g. when display resolution changes. Prefer to create such resources first and all other GPU resources (like textures and vertex buffers) later.</p>
+<h2><a class="anchor" id="usage_patterns_simple_immutable_resources"></a>
+Immutable resources</h2>
+<p><b>When:</b> Any resources that you fill on CPU only once (aka "immutable") or infrequently and then read frequently on GPU, e.g. textures, vertex and index buffers, constant buffers that don't change often.</p>
+<p><b>What to do:</b> Create them in video memory that is fastest to access from GPU using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>.</p>
+<p>To initialize content of such resource, create a CPU-side (aka "staging") copy of it in system memory - <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>, map it, fill it, and submit a transfer from it to the GPU resource. You can keep the staging copy if you need it for another upload transfer in the future. If you don't, you can destroy it or reuse this buffer for uploading different resource after the transfer finishes.</p>
+<p>Prefer to create just buffers in system memory rather than images, even for uploading textures. Use <code>vkCmdCopyBufferToImage()</code>. Dont use images with <code>VK_IMAGE_TILING_LINEAR</code>.</p>
+<h2><a class="anchor" id="usage_patterns_dynamic_resources"></a>
+Dynamic resources</h2>
+<p><b>When:</b> Any resources that change frequently (aka "dynamic"), e.g. every frame or every draw call, written on CPU, read on GPU.</p>
+<p><b>What to do:</b> Create them using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>. You can map it and write to it directly on CPU, as well as read from it on GPU.</p>
+<p>This is a more complex situation. Different solutions are possible, and the best one depends on specific GPU type, but you can use this simple approach for the start. Prefer to write to such resource sequentially (e.g. using <code>memcpy</code>). Don't perform random access or any reads from it, as it may be very slow.</p>
+<h2><a class="anchor" id="usage_patterns_readback"></a>
+Readback</h2>
+<p><b>When:</b> Resources that contain data written by GPU that you want to read back on CPU, e.g. results of some computations.</p>
+<p><b>What to do:</b> Create them using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a>. You can write to them directly on GPU, as well as map and read them on CPU.</p>
+<h1><a class="anchor" id="usage_patterns_advanced"></a>
+Advanced patterns</h1>
+<h2><a class="anchor" id="usage_patterns_integrated_graphics"></a>
+Detecting integrated graphics</h2>
+<p>You can support integrated graphics (like Intel HD Graphics, AMD APU) better by detecting it in Vulkan. To do it, call <code>vkGetPhysicalDeviceProperties()</code>, inspect <code>VkPhysicalDeviceProperties::deviceType</code> and look for <code>VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU</code>. When you find it, you can assume that memory is unified and all memory types are equally fast to access from GPU, regardless of <code>VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT</code>.</p>
+<p>You can then sum up sizes of all available memory heaps and treat them as useful for your GPU resources, instead of only <code>DEVICE_LOCAL</code> ones. You can also prefer to create your resources in memory types that are <code>HOST_VISIBLE</code> to map them directly instead of submitting explicit transfer (see below).</p>
+<h2><a class="anchor" id="usage_patterns_direct_vs_transfer"></a>
+Direct access versus transfer</h2>
+<p>For resources that you frequently write on CPU and read on GPU, many solutions are possible:</p>
+<ol type="1">
+<li>Create one copy in video memory using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>, second copy in system memory using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> and submit explicit tranfer each time.</li>
+<li>Create just single copy using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>, map it and fill it on CPU, read it directly on GPU.</li>
+<li>Create just single copy using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>, map it and fill it on CPU, read it directly on GPU.</li>
+</ol>
+<p>Which solution is the most efficient depends on your resource and especially on the GPU. It is best to measure it and then make the decision. Some general recommendations:</p>
+<ul>
+<li>On integrated graphics use (2) or (3) to avoid unnecesary time and memory overhead related to using a second copy.</li>
+<li>For small resources (e.g. constant buffers) use (2). Discrete AMD cards have special 256 MiB pool of video memory that is directly mappable. Even if the resource ends up in system memory, its data may be cached on GPU after first fetch over PCIe bus.</li>
+<li>For larger resources (e.g. textures), decide between (1) and (2). You may want to differentiate NVIDIA and AMD, e.g. by looking for memory type that is both <code>DEVICE_LOCAL</code> and <code>HOST_VISIBLE</code>. When you find it, use (2), otherwise use (1).</li>
+</ul>
+<p>Similarly, for resources that you frequently write on GPU and read on CPU, multiple solutions are possible:</p>
+<ol type="1">
+<li>Create one copy in video memory using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>, second copy in system memory using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> and submit explicit tranfer each time.</li>
+<li>Create just single copy using <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a>, write to it directly on GPU, map it and read it on CPU.</li>
+</ol>
+<p>You should take some measurements to decide which option is faster in case of your specific resource.</p>
+<p>If you don't want to specialize your code for specific types of GPUs, yon can still make an simple optimization for cases when your resource ends up in mappable memory to use it directly in this case instead of creating CPU-side staging copy. For details see <a class="el" href="memory_mapping.html#memory_mapping_finding_if_memory_mappable">Finding out if memory is mappable</a>. </p>
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by &#160;<a href="http://www.doxygen.org/index.html">
+<img class="footer" src="doxygen.png" alt="doxygen"/>
+</a> 1.8.13
+</small></address>
+</body>
+</html>
diff --git a/docs/html/vk__mem__alloc_8h.html b/docs/html/vk__mem__alloc_8h.html
index a7b3265..6fa4720 100644
--- a/docs/html/vk__mem__alloc_8h.html
+++ b/docs/html/vk__mem__alloc_8h.html
@@ -92,13 +92,13 @@
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of created <code>VmaPool</code>.  <a href="struct_vma_pool_create_info.html#details">More...</a><br /></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>.  <a href="struct_vma_pool_create_info.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of existing <code>VmaPool</code>.  <a href="struct_vma_pool_stats.html#details">More...</a><br /></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>.  <a href="struct_vma_pool_stats.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of <code>VmaAllocation</code> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a>.  <a href="struct_vma_allocation_info.html#details">More...</a><br /></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.  <a href="struct_vma_allocation_info.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></td></tr>
 <tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>.  <a href="struct_vma_defragmentation_info.html#details">More...</a><br /></td></tr>
@@ -114,17 +114,17 @@
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
 Typedefs</h2></td></tr>
-<tr class="memitem:ab6a6477cda1ce775b30bde96d766203b"><td class="memItemLeft" align="right" valign="top">typedef void(VKAPI_PTR *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a>) (VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td></tr>
+<tr class="memitem:ab6a6477cda1ce775b30bde96d766203b"><td class="memItemLeft" align="right" valign="top">typedef void(VKAPI_PTR *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a>) (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td></tr>
 <tr class="memdesc:ab6a6477cda1ce775b30bde96d766203b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function called after successful vkAllocateMemory.  <a href="#ab6a6477cda1ce775b30bde96d766203b">More...</a><br /></td></tr>
 <tr class="separator:ab6a6477cda1ce775b30bde96d766203b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><td class="memItemLeft" align="right" valign="top">typedef void(VKAPI_PTR *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a>) (VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td></tr>
+<tr class="memitem:aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><td class="memItemLeft" align="right" valign="top">typedef void(VKAPI_PTR *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a>) (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td></tr>
 <tr class="memdesc:aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><td class="mdescLeft">&#160;</td><td class="mdescRight">Callback function called before vkFreeMemory.  <a href="#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">More...</a><br /></td></tr>
 <tr class="separator:aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a5e2eb68d727cfd4df25702b027b7aa31"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a></td></tr>
 <tr class="memdesc:a5e2eb68d727cfd4df25702b027b7aa31"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set of callbacks that the library will call for <code>vkAllocateMemory</code> and <code>vkFreeMemory</code>.  <a href="#a5e2eb68d727cfd4df25702b027b7aa31">More...</a><br /></td></tr>
 <tr class="separator:a5e2eb68d727cfd4df25702b027b7aa31"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a4ddf381b6ce795bdfbc6c614640b9915"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915">VmaAllocatorCreateFlagBits</a></td></tr>
-<tr class="memdesc:a4ddf381b6ce795bdfbc6c614640b9915"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created VmaAllocator.  <a href="#a4ddf381b6ce795bdfbc6c614640b9915">More...</a><br /></td></tr>
+<tr class="memdesc:a4ddf381b6ce795bdfbc6c614640b9915"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a>.  <a href="#a4ddf381b6ce795bdfbc6c614640b9915">More...</a><br /></td></tr>
 <tr class="separator:a4ddf381b6ce795bdfbc6c614640b9915"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:acfe6863e160722c2c1bbcf7573fddc4d"><td class="memItemLeft" align="right" valign="top">typedef VkFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a></td></tr>
 <tr class="separator:acfe6863e160722c2c1bbcf7573fddc4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
@@ -155,13 +155,13 @@
 <tr class="memitem:a2770e325ea42e087c1b91fdf46d0292a"><td class="memItemLeft" align="right" valign="top">typedef VkFlags&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a></td></tr>
 <tr class="separator:a2770e325ea42e087c1b91fdf46d0292a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a211706e9348dcee25a843ed4ea69bce7"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a></td></tr>
-<tr class="memdesc:a211706e9348dcee25a843ed4ea69bce7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of created <code>VmaPool</code>.  <a href="#a211706e9348dcee25a843ed4ea69bce7">More...</a><br /></td></tr>
+<tr class="memdesc:a211706e9348dcee25a843ed4ea69bce7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>.  <a href="#a211706e9348dcee25a843ed4ea69bce7">More...</a><br /></td></tr>
 <tr class="separator:a211706e9348dcee25a843ed4ea69bce7"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a2e5612d871d64c5624087b837a338c34"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a></td></tr>
-<tr class="memdesc:a2e5612d871d64c5624087b837a338c34"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of existing <code>VmaPool</code>.  <a href="#a2e5612d871d64c5624087b837a338c34">More...</a><br /></td></tr>
+<tr class="memdesc:a2e5612d871d64c5624087b837a338c34"><td class="mdescLeft">&#160;</td><td class="mdescRight">Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>.  <a href="#a2e5612d871d64c5624087b837a338c34">More...</a><br /></td></tr>
 <tr class="separator:a2e5612d871d64c5624087b837a338c34"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a795e6ff02a21d5486c0565f403dd9255"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a></td></tr>
-<tr class="memdesc:a795e6ff02a21d5486c0565f403dd9255"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of <code>VmaAllocation</code> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a>.  <a href="#a795e6ff02a21d5486c0565f403dd9255">More...</a><br /></td></tr>
+<tr class="memdesc:a795e6ff02a21d5486c0565f403dd9255"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.  <a href="#a795e6ff02a21d5486c0565f403dd9255">More...</a><br /></td></tr>
 <tr class="separator:a795e6ff02a21d5486c0565f403dd9255"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae67f8573a0cf20f16f0a1eecbca566a0"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a></td></tr>
 <tr class="memdesc:ae67f8573a0cf20f16f0a1eecbca566a0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>.  <a href="#ae67f8573a0cf20f16f0a1eecbca566a0">More...</a><br /></td></tr>
@@ -175,7 +175,7 @@
 <tr class="memitem:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> { <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001, 
 <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002, 
 <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
- }<tr class="memdesc:a4f87c9100d154a65a4ad495f7763cf7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created VmaAllocator.  <a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">More...</a><br /></td></tr>
+ }<tr class="memdesc:a4f87c9100d154a65a4ad495f7763cf7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a>.  <a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">More...</a><br /></td></tr>
 </td></tr>
 <tr class="separator:a4f87c9100d154a65a4ad495f7763cf7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:aa5846affa1e9da3800e3e78fae2305cc"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> { <br />
@@ -210,92 +210,98 @@
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
-<tr class="memitem:a200692051ddb34240248234f5f4c17bb"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a> (const <a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> *pCreateInfo, VmaAllocator *pAllocator)</td></tr>
+<tr class="memitem:a200692051ddb34240248234f5f4c17bb"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a> (const <a class="el" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocator.html">VmaAllocator</a> *pAllocator)</td></tr>
 <tr class="memdesc:a200692051ddb34240248234f5f4c17bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates Allocator object.  <a href="#a200692051ddb34240248234f5f4c17bb">More...</a><br /></td></tr>
 <tr class="separator:a200692051ddb34240248234f5f4c17bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa8d164061c88f22fb1fd3c8f3534bc1d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a> (VmaAllocator allocator)</td></tr>
+<tr class="memitem:aa8d164061c88f22fb1fd3c8f3534bc1d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</td></tr>
 <tr class="memdesc:aa8d164061c88f22fb1fd3c8f3534bc1d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys allocator object.  <a href="#aa8d164061c88f22fb1fd3c8f3534bc1d">More...</a><br /></td></tr>
 <tr class="separator:aa8d164061c88f22fb1fd3c8f3534bc1d"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aecabf7b6e91ea87d0316fa0a9e014fe0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a> (VmaAllocator allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</td></tr>
+<tr class="memitem:aecabf7b6e91ea87d0316fa0a9e014fe0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</td></tr>
 <tr class="separator:aecabf7b6e91ea87d0316fa0a9e014fe0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ab88db292a17974f911182543fda52d19"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a> (VmaAllocator allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</td></tr>
+<tr class="memitem:ab88db292a17974f911182543fda52d19"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</td></tr>
 <tr class="separator:ab88db292a17974f911182543fda52d19"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a8701444752eb5de4464adb5a2b514bca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a> (VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</td></tr>
+<tr class="memitem:a8701444752eb5de4464adb5a2b514bca"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</td></tr>
 <tr class="memdesc:a8701444752eb5de4464adb5a2b514bca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Given Memory Type Index, returns Property Flags of this memory type.  <a href="#a8701444752eb5de4464adb5a2b514bca">More...</a><br /></td></tr>
 <tr class="separator:a8701444752eb5de4464adb5a2b514bca"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ade56bf8dc9f5a5eaddf5f119ed525236"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a> (VmaAllocator allocator, uint32_t frameIndex)</td></tr>
+<tr class="memitem:ade56bf8dc9f5a5eaddf5f119ed525236"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t frameIndex)</td></tr>
 <tr class="memdesc:ade56bf8dc9f5a5eaddf5f119ed525236"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets index of the current frame.  <a href="#ade56bf8dc9f5a5eaddf5f119ed525236">More...</a><br /></td></tr>
 <tr class="separator:ade56bf8dc9f5a5eaddf5f119ed525236"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a333b61c1788cb23559177531e6a93ca3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a> (VmaAllocator allocator, <a class="el" href="struct_vma_stats.html">VmaStats</a> *pStats)</td></tr>
+<tr class="memitem:a333b61c1788cb23559177531e6a93ca3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_stats.html">VmaStats</a> *pStats)</td></tr>
 <tr class="memdesc:a333b61c1788cb23559177531e6a93ca3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics from current state of the Allocator.  <a href="#a333b61c1788cb23559177531e6a93ca3">More...</a><br /></td></tr>
 <tr class="separator:a333b61c1788cb23559177531e6a93ca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa4fee7eb5253377599ef4fd38c93c2a0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a> (VmaAllocator allocator, char **ppStatsString, VkBool32 detailedMap)</td></tr>
+<tr class="memitem:aa4fee7eb5253377599ef4fd38c93c2a0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, char **ppStatsString, VkBool32 detailedMap)</td></tr>
 <tr class="memdesc:aa4fee7eb5253377599ef4fd38c93c2a0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Builds and returns statistics as string in JSON format.  <a href="#aa4fee7eb5253377599ef4fd38c93c2a0">More...</a><br /></td></tr>
 <tr class="separator:aa4fee7eb5253377599ef4fd38c93c2a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a3104eb30d8122c84dd8541063f145288"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a> (VmaAllocator allocator, char *pStatsString)</td></tr>
+<tr class="memitem:a3104eb30d8122c84dd8541063f145288"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, char *pStatsString)</td></tr>
 <tr class="separator:a3104eb30d8122c84dd8541063f145288"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aef15a94b58fbcb0fe706d5720e84a74a"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a> (VmaAllocator allocator, uint32_t memoryTypeBits, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
+<tr class="memitem:aef15a94b58fbcb0fe706d5720e84a74a"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
 <tr class="memdesc:aef15a94b58fbcb0fe706d5720e84a74a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given memoryTypeBits and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="#aef15a94b58fbcb0fe706d5720e84a74a">More...</a><br /></td></tr>
 <tr class="separator:aef15a94b58fbcb0fe706d5720e84a74a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae790ab9ffaf7667fb8f62523e6897888"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a> (VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
+<tr class="memitem:ae790ab9ffaf7667fb8f62523e6897888"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkBufferCreateInfo *pBufferCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
 <tr class="memdesc:ae790ab9ffaf7667fb8f62523e6897888"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given VkBufferCreateInfo and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="#ae790ab9ffaf7667fb8f62523e6897888">More...</a><br /></td></tr>
 <tr class="separator:ae790ab9ffaf7667fb8f62523e6897888"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a088da83d8eaf3ce9056d9ea0b981d472"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a> (VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
+<tr class="memitem:a088da83d8eaf3ce9056d9ea0b981d472"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkImageCreateInfo *pImageCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</td></tr>
 <tr class="memdesc:a088da83d8eaf3ce9056d9ea0b981d472"><td class="mdescLeft">&#160;</td><td class="mdescRight">Helps to find memoryTypeIndex, given VkImageCreateInfo and <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>.  <a href="#a088da83d8eaf3ce9056d9ea0b981d472">More...</a><br /></td></tr>
 <tr class="separator:a088da83d8eaf3ce9056d9ea0b981d472"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5c8770ded7c59c8caac6de0c2cb00b50"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a> (VmaAllocator allocator, const <a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> *pCreateInfo, VmaPool *pPool)</td></tr>
-<tr class="memdesc:a5c8770ded7c59c8caac6de0c2cb00b50"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates Vulkan device memory and creates <code>VmaPool</code> object.  <a href="#a5c8770ded7c59c8caac6de0c2cb00b50">More...</a><br /></td></tr>
+<tr class="memitem:a5c8770ded7c59c8caac6de0c2cb00b50"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const <a class="el" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_pool.html">VmaPool</a> *pPool)</td></tr>
+<tr class="memdesc:a5c8770ded7c59c8caac6de0c2cb00b50"><td class="mdescLeft">&#160;</td><td class="mdescRight">Allocates Vulkan device memory and creates <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> object.  <a href="#a5c8770ded7c59c8caac6de0c2cb00b50">More...</a><br /></td></tr>
 <tr class="separator:a5c8770ded7c59c8caac6de0c2cb00b50"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5485779c8f1948238fc4e92232fa65e1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a> (VmaAllocator allocator, VmaPool pool)</td></tr>
-<tr class="memdesc:a5485779c8f1948238fc4e92232fa65e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys VmaPool object and frees Vulkan device memory.  <a href="#a5485779c8f1948238fc4e92232fa65e1">More...</a><br /></td></tr>
+<tr class="memitem:a5485779c8f1948238fc4e92232fa65e1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool)</td></tr>
+<tr class="memdesc:a5485779c8f1948238fc4e92232fa65e1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> object and frees Vulkan device memory.  <a href="#a5485779c8f1948238fc4e92232fa65e1">More...</a><br /></td></tr>
 <tr class="separator:a5485779c8f1948238fc4e92232fa65e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae8bf76997b234ef68aad922616df4153"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a> (VmaAllocator allocator, VmaPool pool, <a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a> *pPoolStats)</td></tr>
-<tr class="memdesc:ae8bf76997b234ef68aad922616df4153"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics of existing VmaPool object.  <a href="#ae8bf76997b234ef68aad922616df4153">More...</a><br /></td></tr>
+<tr class="memitem:ae8bf76997b234ef68aad922616df4153"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool, <a class="el" href="struct_vma_pool_stats.html">VmaPoolStats</a> *pPoolStats)</td></tr>
+<tr class="memdesc:ae8bf76997b234ef68aad922616df4153"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieves statistics of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> object.  <a href="#ae8bf76997b234ef68aad922616df4153">More...</a><br /></td></tr>
 <tr class="separator:ae8bf76997b234ef68aad922616df4153"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a736bd6cbda886f36c891727e73bd4024"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a> (VmaAllocator allocator, VmaPool pool, size_t *pLostAllocationCount)</td></tr>
+<tr class="memitem:a736bd6cbda886f36c891727e73bd4024"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_pool.html">VmaPool</a> pool, size_t *pLostAllocationCount)</td></tr>
 <tr class="memdesc:a736bd6cbda886f36c891727e73bd4024"><td class="mdescLeft">&#160;</td><td class="mdescRight">Marks all allocations in given pool as lost if they are not used in current frame or <a class="el" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa" title="Maximum number of additional frames that are in use at the same time as current frame. ">VmaPoolCreateInfo::frameInUseCount</a> back from now.  <a href="#a736bd6cbda886f36c891727e73bd4024">More...</a><br /></td></tr>
 <tr class="separator:a736bd6cbda886f36c891727e73bd4024"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:abf28077dbf82d0908b8acbe8ee8dd9b8"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a> (VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, VmaAllocation *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memitem:abf28077dbf82d0908b8acbe8ee8dd9b8"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkMemoryRequirements *pVkMemoryRequirements, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
 <tr class="memdesc:abf28077dbf82d0908b8acbe8ee8dd9b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">General purpose memory allocation.  <a href="#abf28077dbf82d0908b8acbe8ee8dd9b8">More...</a><br /></td></tr>
 <tr class="separator:abf28077dbf82d0908b8acbe8ee8dd9b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a7fdf64415b6c3d83c454f28d2c53df7b"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a> (VmaAllocator allocator, VkBuffer buffer, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, VmaAllocation *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memitem:a7fdf64415b6c3d83c454f28d2c53df7b"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkBuffer buffer, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
 <tr class="separator:a7fdf64415b6c3d83c454f28d2c53df7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0faa3f9e5fb233d29d1e00390650febb"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a> (VmaAllocator allocator, VkImage image, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, VmaAllocation *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memitem:a0faa3f9e5fb233d29d1e00390650febb"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkImage image, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pCreateInfo, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
 <tr class="memdesc:a0faa3f9e5fb233d29d1e00390650febb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function similar to <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>.  <a href="#a0faa3f9e5fb233d29d1e00390650febb">More...</a><br /></td></tr>
 <tr class="separator:a0faa3f9e5fb233d29d1e00390650febb"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a11f0fbc034fa81a4efedd73d61ce7568"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a> (VmaAllocator allocator, VmaAllocation allocation)</td></tr>
+<tr class="memitem:a11f0fbc034fa81a4efedd73d61ce7568"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
 <tr class="memdesc:a11f0fbc034fa81a4efedd73d61ce7568"><td class="mdescLeft">&#160;</td><td class="mdescRight">Frees memory previously allocated using <a class="el" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8" title="General purpose memory allocation. ">vmaAllocateMemory()</a>, <a class="el" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer()</a>, or <a class="el" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb" title="Function similar to vmaAllocateMemoryForBuffer(). ">vmaAllocateMemoryForImage()</a>.  <a href="#a11f0fbc034fa81a4efedd73d61ce7568">More...</a><br /></td></tr>
 <tr class="separator:a11f0fbc034fa81a4efedd73d61ce7568"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a> (VmaAllocator allocator, VmaAllocation allocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
-<tr class="memdesc:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns current information about specified allocation.  <a href="#a86dd08aba8633bfa4ad0df2e76481d8b">More...</a><br /></td></tr>
+<tr class="memitem:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memdesc:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns current information about specified allocation and atomically marks it as used in current frame.  <a href="#a86dd08aba8633bfa4ad0df2e76481d8b">More...</a><br /></td></tr>
 <tr class="separator:a86dd08aba8633bfa4ad0df2e76481d8b"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a43d8ba9673c846f049089a5029d5c73a"><td class="memItemLeft" align="right" valign="top">VkBool32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a> (VmaAllocator allocator, VmaAllocation allocation)</td></tr>
-<tr class="memdesc:a43d8ba9673c846f049089a5029d5c73a"><td class="mdescLeft">&#160;</td><td class="mdescRight">TODO finish documentation...  <a href="#a43d8ba9673c846f049089a5029d5c73a">More...</a><br /></td></tr>
+<tr class="memitem:a43d8ba9673c846f049089a5029d5c73a"><td class="memItemLeft" align="right" valign="top">VkBool32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
+<tr class="memdesc:a43d8ba9673c846f049089a5029d5c73a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns <code>VK_TRUE</code> if allocation is not lost and atomically marks it as used in current frame.  <a href="#a43d8ba9673c846f049089a5029d5c73a">More...</a><br /></td></tr>
 <tr class="separator:a43d8ba9673c846f049089a5029d5c73a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:af9147d31ffc11d62fc187bde283ed14f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a> (VmaAllocator allocator, VmaAllocation allocation, void *pUserData)</td></tr>
+<tr class="memitem:af9147d31ffc11d62fc187bde283ed14f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, void *pUserData)</td></tr>
 <tr class="memdesc:af9147d31ffc11d62fc187bde283ed14f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Sets pUserData in given allocation to new value.  <a href="#af9147d31ffc11d62fc187bde283ed14f">More...</a><br /></td></tr>
 <tr class="separator:af9147d31ffc11d62fc187bde283ed14f"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae5c9657d9e94756269145b01c05d16f1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a> (VmaAllocator allocator, VmaAllocation *pAllocation)</td></tr>
+<tr class="memitem:ae5c9657d9e94756269145b01c05d16f1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation)</td></tr>
 <tr class="memdesc:ae5c9657d9e94756269145b01c05d16f1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates new allocation that is in lost state from the beginning.  <a href="#ae5c9657d9e94756269145b01c05d16f1">More...</a><br /></td></tr>
 <tr class="separator:ae5c9657d9e94756269145b01c05d16f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ad5bd1243512d099706de88168992f069"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a> (VmaAllocator allocator, VmaAllocation allocation, void **ppData)</td></tr>
+<tr class="memitem:ad5bd1243512d099706de88168992f069"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, void **ppData)</td></tr>
 <tr class="memdesc:ad5bd1243512d099706de88168992f069"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maps memory represented by given allocation and returns pointer to it.  <a href="#ad5bd1243512d099706de88168992f069">More...</a><br /></td></tr>
 <tr class="separator:ad5bd1243512d099706de88168992f069"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a9bc268595cb33f6ec4d519cfce81ff45"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a> (VmaAllocator allocator, VmaAllocation allocation)</td></tr>
+<tr class="memitem:a9bc268595cb33f6ec4d519cfce81ff45"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
 <tr class="memdesc:a9bc268595cb33f6ec4d519cfce81ff45"><td class="mdescLeft">&#160;</td><td class="mdescRight">Unmaps memory represented by given allocation, mapped previously using <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>.  <a href="#a9bc268595cb33f6ec4d519cfce81ff45">More...</a><br /></td></tr>
 <tr class="separator:a9bc268595cb33f6ec4d519cfce81ff45"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a6aced90fcc7b39882b6654a740a0b9bb"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a> (VmaAllocator allocator, VmaAllocation *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const <a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo, <a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> *pDefragmentationStats)</td></tr>
+<tr class="memitem:a6aced90fcc7b39882b6654a740a0b9bb"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const <a class="el" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo, <a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> *pDefragmentationStats)</td></tr>
 <tr class="memdesc:a6aced90fcc7b39882b6654a740a0b9bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Compacts memory by moving allocations.  <a href="#a6aced90fcc7b39882b6654a740a0b9bb">More...</a><br /></td></tr>
 <tr class="separator:a6aced90fcc7b39882b6654a740a0b9bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ac72ee55598617e8eecca384e746bab51"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a> (VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memitem:a6b0929b914b60cf2d45cac4bf3547470"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkBuffer buffer)</td></tr>
+<tr class="memdesc:a6b0929b914b60cf2d45cac4bf3547470"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds buffer to allocation.  <a href="#a6b0929b914b60cf2d45cac4bf3547470">More...</a><br /></td></tr>
+<tr class="separator:a6b0929b914b60cf2d45cac4bf3547470"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d3ca45799923aa5d138e9e5f9eb2da5"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkImage image)</td></tr>
+<tr class="memdesc:a3d3ca45799923aa5d138e9e5f9eb2da5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Binds image to allocation.  <a href="#a3d3ca45799923aa5d138e9e5f9eb2da5">More...</a><br /></td></tr>
+<tr class="separator:a3d3ca45799923aa5d138e9e5f9eb2da5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac72ee55598617e8eecca384e746bab51"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkBufferCreateInfo *pBufferCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, VkBuffer *pBuffer, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
 <tr class="separator:ac72ee55598617e8eecca384e746bab51"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a0d9f4e4ba5bf9aab1f1c746387753d77"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a> (VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</td></tr>
+<tr class="memitem:a0d9f4e4ba5bf9aab1f1c746387753d77"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkBuffer buffer, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
 <tr class="memdesc:a0d9f4e4ba5bf9aab1f1c746387753d77"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys Vulkan buffer and frees allocated memory.  <a href="#a0d9f4e4ba5bf9aab1f1c746387753d77">More...</a><br /></td></tr>
 <tr class="separator:a0d9f4e4ba5bf9aab1f1c746387753d77"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a02a94f25679275851a53e82eacbcfc73"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a> (VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
+<tr class="memitem:a02a94f25679275851a53e82eacbcfc73"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const VkImageCreateInfo *pImageCreateInfo, const <a class="el" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> *pAllocationCreateInfo, VkImage *pImage, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *pAllocation, <a class="el" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> *pAllocationInfo)</td></tr>
 <tr class="memdesc:a02a94f25679275851a53e82eacbcfc73"><td class="mdescLeft">&#160;</td><td class="mdescRight">Function similar to <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>.  <a href="#a02a94f25679275851a53e82eacbcfc73">More...</a><br /></td></tr>
 <tr class="separator:a02a94f25679275851a53e82eacbcfc73"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:ae50d2cb3b4a3bfd4dd40987234e50e7e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a> (VmaAllocator allocator, VkImage image, VmaAllocation allocation)</td></tr>
+<tr class="memitem:ae50d2cb3b4a3bfd4dd40987234e50e7e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, VkImage image, <a class="el" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</td></tr>
 <tr class="memdesc:ae50d2cb3b4a3bfd4dd40987234e50e7e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroys Vulkan image and frees allocated memory.  <a href="#ae50d2cb3b4a3bfd4dd40987234e50e7e">More...</a><br /></td></tr>
 <tr class="separator:ae50d2cb3b4a3bfd4dd40987234e50e7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
@@ -322,7 +328,7 @@
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction) (VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td>
+          <td class="memname">typedef void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction) (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -338,7 +344,7 @@
 <div class="memproto">
       <table class="memname">
         <tr>
-          <td class="memname">typedef void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction) (VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td>
+          <td class="memname">typedef void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction) (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</td>
         </tr>
       </table>
 </div><div class="memdoc">
@@ -403,7 +409,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Parameters of <code>VmaAllocation</code> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a>. </p>
+<p>Parameters of <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> objects, that can be retrieved using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>. </p>
 
 </div>
 </div>
@@ -419,7 +425,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Flags for created VmaAllocator. </p>
+<p>Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a>. </p>
 
 </div>
 </div>
@@ -499,7 +505,7 @@
 
 <p>Set of callbacks that the library will call for <code>vkAllocateMemory</code> and <code>vkFreeMemory</code>. </p>
 <p>Provided for informative purpose, e.g. to gather statistics about number of allocations or total amount of memory allocated in Vulkan.</p>
-<p>Used in <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e" title="Informative callbacks for vkAllocateMemory, vkFreeMemory. ">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a>. </p>
+<p>Used in <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e" title="Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional. ">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a>. </p>
 
 </div>
 </div>
@@ -559,7 +565,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Describes parameter of created <code>VmaPool</code>. </p>
+<p>Describes parameter of created <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>. </p>
 
 </div>
 </div>
@@ -575,7 +581,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Describes parameter of existing <code>VmaPool</code>. </p>
+<p>Describes parameter of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a>. </p>
 
 </div>
 </div>
@@ -650,23 +656,23 @@
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"></a>VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT&#160;</td><td class="fielddoc"><p>Set this flag to only try to allocate from existing <code>VkDeviceMemory</code> blocks and never create new such block. </p>
 <p>If new allocation cannot be placed in any of the existing blocks, allocation fails with <code>VK_ERROR_OUT_OF_DEVICE_MEMORY</code> error.</p>
-<p>You should not use <code>VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</code> and <code>VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</code> at the same time. It makes no sense.</p>
+<p>You should not use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block. ">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff" title="Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> at the same time. It makes no sense.</p>
 <p>If <a class="el" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150" title="Pool that this allocation should be created in. ">VmaAllocationCreateInfo::pool</a> is not null, this flag is implied and ignored. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"></a>VMA_ALLOCATION_CREATE_MAPPED_BIT&#160;</td><td class="fielddoc"><p>Set this flag to use a memory that will be persistently mapped and retrieve pointer to it. </p>
 <p>Pointer to mapped memory will be returned through <a class="el" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2" title="Pointer to the beginning of this allocation as mapped data. ">VmaAllocationInfo::pMappedData</a>.</p>
 <p>Is it valid to use this flag for allocation made from memory type that is not <code>HOST_VISIBLE</code>. This flag is then ignored and memory is not mapped. This is useful if you need an allocation that is efficient to use on GPU (<code>DEVICE_LOCAL</code>) and still want to map it directly if possible on platforms that support it (e.g. Intel GPU).</p>
-<p>You should not use this flag together with <code>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</code>. </p>
+<p>You should not use this flag together with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>. </p>
 </td></tr>
-<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"></a>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT&#160;</td><td class="fielddoc"><p>Allocation created with this flag can become lost as a result of another allocation with <code>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</code> flag, so you must check it before use.</p>
-<p>To check if allocation is not lost, call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a> and check if <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object. ">VmaAllocationInfo::deviceMemory</a> is not <code>VK_NULL_HANDLE</code>.</p>
+<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"></a>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT&#160;</td><td class="fielddoc"><p>Allocation created with this flag can become lost as a result of another allocation with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flag, so you must check it before use.</p>
+<p>To check if allocation is not lost, call <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> and check if <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object. ">VmaAllocationInfo::deviceMemory</a> is not <code>VK_NULL_HANDLE</code>.</p>
 <p>For details about supporting lost allocations, see Lost Allocations chapter of User Guide on Main Page.</p>
-<p>You should not use this flag together with <code>VMA_ALLOCATION_CREATE_MAPPED_BIT</code>. </p>
+<p>You should not use this flag together with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>. </p>
 </td></tr>
-<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"></a>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT&#160;</td><td class="fielddoc"><p>While creating allocation using this flag, other allocations that were created with flag <code>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</code> can become lost.</p>
+<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"></a>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT&#160;</td><td class="fielddoc"><p>While creating allocation using this flag, other allocations that were created with flag <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> can become lost.</p>
 <p>For details about supporting lost allocations, see Lost Allocations chapter of User Guide on Main Page. </p>
 </td></tr>
-<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"></a>VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT&#160;</td><td class="fielddoc"><p>Set this flag to treat <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> as pointer to a null-terminated string. Instead of copying pointer value, a local copy of the string is made and stored in allocation's pUserData. The string is automatically freed together with the allocation. It is also used in <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format. ">vmaBuildStatsString()</a>. </p>
+<tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"></a>VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT&#160;</td><td class="fielddoc"><p>Set this flag to treat <a class="el" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19" title="Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...">VmaAllocationCreateInfo::pUserData</a> as pointer to a null-terminated string. Instead of copying pointer value, a local copy of the string is made and stored in allocation's <code>pUserData</code>. The string is automatically freed together with the allocation. It is also used in <a class="el" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0" title="Builds and returns statistics as string in JSON format. ">vmaBuildStatsString()</a>. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"></a>VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM&#160;</td><td class="fielddoc"></td></tr>
 </table>
@@ -685,13 +691,13 @@
       </table>
 </div><div class="memdoc">
 
-<p>Flags for created VmaAllocator. </p>
+<p>Flags for created <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a>. </p>
 <table class="fieldtable">
 <tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"></a>VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT&#160;</td><td class="fielddoc"><p>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. </p>
 <p>Using this flag may increase performance because internal mutexes are not used. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"></a>VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT&#160;</td><td class="fielddoc"><p>Enables usage of VK_KHR_dedicated_allocation extension. </p>
-<p>Using this extenion 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.</p>
+<p>Using this extenion 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 <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block. ">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> flag) when it is recommended by the driver. It may improve performance on some GPUs.</p>
 <p>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 <a class="el" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500" title="Vulkan device. ">VmaAllocatorCreateInfo::device</a>, and you want them to be used internally by this library:</p>
 <ul>
 <li>VK_KHR_get_memory_requirements2</li>
@@ -727,7 +733,7 @@
 <li>Resources written and read by device, e.g. images used as attachments.</li>
 <li>Resources transferred from host once (immutable) or infrequently and read by device multiple times, e.g. textures to be sampled, vertex buffers, uniform (constant) buffers, and majority of other types of resources used by device.</li>
 </ul>
-<p>Allocation may still end up in <code>HOST_VISIBLE</code> memory on some implementations. In such case, you are free to map it. You can use <code>VMA_ALLOCATION_CREATE_MAPPED_BIT</code> with this usage type. </p>
+<p>Allocation may still end up in <code>HOST_VISIBLE</code> memory on some implementations. In such case, you are free to map it. You can use <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> with this usage type. </p>
 </td></tr>
 <tr><td class="fieldname"><a id="aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"></a>VMA_MEMORY_USAGE_CPU_ONLY&#160;</td><td class="fielddoc"><p>Memory will be mappable on host. It usually means CPU (system) memory. Resources created in this pool may still be accessible to the device, but access to them can be slower. Guarantees to be <code>HOST_VISIBLE</code> and <code>HOST_COHERENT</code>. CPU read may be uncached. It is roughly equivalent of <code>D3D12_HEAP_TYPE_UPLOAD</code>.</p>
 <p>Usage: Staging copy of resources used as transfer source. </p>
@@ -781,7 +787,7 @@
         <tr>
           <td class="memname">VkResult vmaAllocateMemory </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -799,7 +805,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *&#160;</td>
           <td class="paramname"><em>pAllocation</em>, </td>
         </tr>
         <tr>
@@ -820,7 +826,7 @@
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramdir">[out]</td><td class="paramname">pAllocation</td><td>Handle to allocated memory. </td></tr>
-    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a>.</td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
   </table>
   </dd>
 </dl>
@@ -838,7 +844,7 @@
         <tr>
           <td class="memname">VkResult vmaAllocateMemoryForBuffer </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -856,7 +862,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *&#160;</td>
           <td class="paramname"><em>pAllocation</em>, </td>
         </tr>
         <tr>
@@ -875,7 +881,7 @@
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramdir">[out]</td><td class="paramname">pAllocation</td><td>Handle to allocated memory. </td></tr>
-    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a>.</td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
   </table>
   </dd>
 </dl>
@@ -892,7 +898,7 @@
         <tr>
           <td class="memname">VkResult vmaAllocateMemoryForImage </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -910,7 +916,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *&#160;</td>
           <td class="paramname"><em>pAllocation</em>, </td>
         </tr>
         <tr>
@@ -931,6 +937,82 @@
 
 </div>
 </div>
+<a id="a6b0929b914b60cf2d45cac4bf3547470"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6b0929b914b60cf2d45cac4bf3547470">&#9670;&nbsp;</a></span>vmaBindBufferMemory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkResult vmaBindBufferMemory </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
+          <td class="paramname"><em>allocation</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">VkBuffer&#160;</td>
+          <td class="paramname"><em>buffer</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Binds buffer to allocation. </p>
+<p>Binds specified buffer to region of memory represented by specified allocation. Gets <code>VkDeviceMemory</code> handle and offset from the allocation. If you want to create a buffer, allocate memory for it and bind them together separately, you should use this function for binding instead of standard <code>vkBindBufferMemory()</code>, because it ensures proper synchronization so that when a <code>VkDeviceMemory</code> object is used by multiple allocations, calls to <code>vkBind*Memory()</code> or <code>vkMapMemory()</code> won't happen from multiple threads simultaneously (which is illegal in Vulkan).</p>
+<p>It is recommended to use function <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a> instead of this one. </p>
+
+</div>
+</div>
+<a id="a3d3ca45799923aa5d138e9e5f9eb2da5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d3ca45799923aa5d138e9e5f9eb2da5">&#9670;&nbsp;</a></span>vmaBindImageMemory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkResult vmaBindImageMemory </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
+          <td class="paramname"><em>allocator</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
+          <td class="paramname"><em>allocation</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">VkImage&#160;</td>
+          <td class="paramname"><em>image</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Binds image to allocation. </p>
+<p>Binds specified image to region of memory represented by specified allocation. Gets <code>VkDeviceMemory</code> handle and offset from the allocation. If you want to create an image, allocate memory for it and bind them together separately, you should use this function for binding instead of standard <code>vkBindImageMemory()</code>, because it ensures proper synchronization so that when a <code>VkDeviceMemory</code> object is used by multiple allocations, calls to <code>vkBind*Memory()</code> or <code>vkMapMemory()</code> won't happen from multiple threads simultaneously (which is illegal in Vulkan).</p>
+<p>It is recommended to use function <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer(). ">vmaCreateImage()</a> instead of this one. </p>
+
+</div>
+</div>
 <a id="aa4fee7eb5253377599ef4fd38c93c2a0"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aa4fee7eb5253377599ef4fd38c93c2a0">&#9670;&nbsp;</a></span>vmaBuildStatsString()</h2>
 
@@ -940,7 +1022,7 @@
         <tr>
           <td class="memname">void vmaBuildStatsString </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -982,7 +1064,7 @@
         <tr>
           <td class="memname">void vmaCalculateStats </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1018,7 +1100,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocator *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a> *&#160;</td>
           <td class="paramname"><em>pAllocator</em>&#160;</td>
         </tr>
         <tr>
@@ -1042,7 +1124,7 @@
         <tr>
           <td class="memname">VkResult vmaCreateBuffer </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1066,7 +1148,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *&#160;</td>
           <td class="paramname"><em>pAllocation</em>, </td>
         </tr>
         <tr>
@@ -1086,7 +1168,7 @@
   <table class="params">
     <tr><td class="paramdir">[out]</td><td class="paramname">pBuffer</td><td>Buffer that was created. </td></tr>
     <tr><td class="paramdir">[out]</td><td class="paramname">pAllocation</td><td>Allocation that was created. </td></tr>
-    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a>.</td></tr>
+    <tr><td class="paramdir">[out]</td><td class="paramname">pAllocationInfo</td><td>Optional. Information about allocated memory. It can be later fetched using function <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a>.</td></tr>
   </table>
   </dd>
 </dl>
@@ -1111,7 +1193,7 @@
         <tr>
           <td class="memname">VkResult vmaCreateImage </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1135,7 +1217,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *&#160;</td>
           <td class="paramname"><em>pAllocation</em>, </td>
         </tr>
         <tr>
@@ -1165,13 +1247,13 @@
         <tr>
           <td class="memname">void vmaCreateLostAllocation </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *&#160;</td>
           <td class="paramname"><em>pAllocation</em>&#160;</td>
         </tr>
         <tr>
@@ -1198,7 +1280,7 @@
         <tr>
           <td class="memname">VkResult vmaCreatePool </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1210,7 +1292,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaPool *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_pool.html">VmaPool</a> *&#160;</td>
           <td class="paramname"><em>pPool</em>&#160;</td>
         </tr>
         <tr>
@@ -1221,7 +1303,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Allocates Vulkan device memory and creates <code>VmaPool</code> object. </p>
+<p>Allocates Vulkan device memory and creates <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> object. </p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramdir"></td><td class="paramname">allocator</td><td>Allocator object. </td></tr>
@@ -1242,13 +1324,13 @@
         <tr>
           <td class="memname">VkResult vmaDefragment </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation *&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *&#160;</td>
           <td class="paramname"><em>pAllocations</em>, </td>
         </tr>
         <tr>
@@ -1298,14 +1380,14 @@
 <p>This function works by moving allocations to different places (different <code>VkDeviceMemory</code> objects and/or different offsets) in order to optimize memory usage. Only allocations that are in pAllocations array can be moved. All other allocations are considered nonmovable in this call. Basic rules:</p>
 <ul>
 <li>Only allocations made in memory types that have <code>VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT</code> flag can be compacted. You may pass other allocations but it makes no sense - these will never be moved.</li>
-<li>You may pass allocations made with <code>VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</code> but it makes no sense - they will never be moved.</li>
-<li>Both allocations made with or without <code>VMA_ALLOCATION_CREATE_MAPPED_BIT</code> flag can be compacted. If not persistently mapped, memory will be mapped temporarily inside this function if needed.</li>
-<li>You must not pass same <code>VmaAllocation</code> object multiple times in pAllocations array.</li>
+<li>You may pass allocations made with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f" title="Set this flag if the allocation should have its own memory block. ">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> but it makes no sense - they will never be moved.</li>
+<li>Both allocations made with or without <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag can be compacted. If not persistently mapped, memory will be mapped temporarily inside this function if needed.</li>
+<li>You must not pass same <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> object multiple times in pAllocations array.</li>
 </ul>
 <p>The function also frees empty <code>VkDeviceMemory</code> blocks.</p>
-<p>After allocation has been moved, its <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object. ">VmaAllocationInfo::deviceMemory</a> and/or <a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268" title="Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. ">VmaAllocationInfo::offset</a> changes. You must query them again using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a> if you need them.</p>
+<p>After allocation has been moved, its <a class="el" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67" title="Handle to Vulkan memory object. ">VmaAllocationInfo::deviceMemory</a> and/or <a class="el" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268" title="Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. ">VmaAllocationInfo::offset</a> changes. You must query them again using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> if you need them.</p>
 <p>If an allocation has been moved, data in memory is copied to new place automatically, but if it was bound to a buffer or an image, you must destroy that object yourself, create new one and bind it to the new memory pointed by the allocation. You must use <code>vkDestroyBuffer()</code>, <code>vkDestroyImage()</code>, <code>vkCreateBuffer()</code>, <code>vkCreateImage()</code> for that purpose and NOT <a class="el" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77" title="Destroys Vulkan buffer and frees allocated memory. ">vmaDestroyBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e" title="Destroys Vulkan image and frees allocated memory. ">vmaDestroyImage()</a>, <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer(). ">vmaCreateImage()</a>! Example:</p>
-<div class="fragment"><div class="line">VkDevice device = ...;</div><div class="line">VmaAllocator allocator = ...;</div><div class="line">std::vector&lt;VkBuffer&gt; buffers = ...;</div><div class="line">std::vector&lt;VmaAllocation&gt; allocations = ...;</div><div class="line"></div><div class="line">std::vector&lt;VkBool32&gt; allocationsChanged(allocations.size());</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(allocator, allocations.data(), allocations.size(), allocationsChanged.data(), <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>);</div><div class="line"></div><div class="line"><span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; allocations.size(); ++i)</div><div class="line">{</div><div class="line">    <span class="keywordflow">if</span>(allocationsChanged[i])</div><div class="line">    {</div><div class="line">        <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocations[i], &amp;allocInfo);</div><div class="line"></div><div class="line">        vkDestroyBuffer(device, buffers[i], <span class="keyword">nullptr</span>);</div><div class="line"></div><div class="line">        VkBufferCreateInfo bufferInfo = ...;</div><div class="line">        vkCreateBuffer(device, &amp;bufferInfo, <span class="keyword">nullptr</span>, &amp;buffers[i]);</div><div class="line">            </div><div class="line">        <span class="comment">// You can make dummy call to vkGetBufferMemoryRequirements here to silence validation layer warning.</span></div><div class="line">            </div><div class="line">        vkBindBufferMemory(device, buffers[i], allocInfo.<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>, allocInfo.<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>);</div><div class="line">    }</div><div class="line">}</div></div><!-- fragment --><p>Note: Please don't expect memory to be fully compacted after this call. Algorithms inside are based on some heuristics that try to maximize number of Vulkan memory blocks to make totally empty to release them, as well as to maximimze continuous empty space inside remaining blocks, while minimizing the number and size of data that needs to be moved. Some fragmentation still remains after this call. This is normal.</p>
+<div class="fragment"><div class="line">VkDevice device = ...;</div><div class="line"><a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator = ...;</div><div class="line">std::vector&lt;VkBuffer&gt; buffers = ...;</div><div class="line">std::vector&lt;VmaAllocation&gt; allocations = ...;</div><div class="line"></div><div class="line">std::vector&lt;VkBool32&gt; allocationsChanged(allocations.size());</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(allocator, allocations.data(), allocations.size(), allocationsChanged.data(), <span class="keyword">nullptr</span>, <span class="keyword">nullptr</span>);</div><div class="line"></div><div class="line"><span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; allocations.size(); ++i)</div><div class="line">{</div><div class="line">    <span class="keywordflow">if</span>(allocationsChanged[i])</div><div class="line">    {</div><div class="line">        <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> allocInfo;</div><div class="line">        <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(allocator, allocations[i], &amp;allocInfo);</div><div class="line"></div><div class="line">        vkDestroyBuffer(device, buffers[i], <span class="keyword">nullptr</span>);</div><div class="line"></div><div class="line">        VkBufferCreateInfo bufferInfo = ...;</div><div class="line">        vkCreateBuffer(device, &amp;bufferInfo, <span class="keyword">nullptr</span>, &amp;buffers[i]);</div><div class="line">            </div><div class="line">        <span class="comment">// You can make dummy call to vkGetBufferMemoryRequirements here to silence validation layer warning.</span></div><div class="line">            </div><div class="line">        vkBindBufferMemory(device, buffers[i], allocInfo.<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>, allocInfo.<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>);</div><div class="line">    }</div><div class="line">}</div></div><!-- fragment --><p>Note: Please don't expect memory to be fully compacted after this call. Algorithms inside are based on some heuristics that try to maximize number of Vulkan memory blocks to make totally empty to release them, as well as to maximimze continuous empty space inside remaining blocks, while minimizing the number and size of data that needs to be moved. Some fragmentation still remains after this call. This is normal.</p>
 <p>Warning: This function is not 100% correct according to Vulkan specification. Use it at your own risk. That's because Vulkan doesn't guarantee that memory requirements (size and alignment) for a new buffer or image are consistent. They may be different even for subsequent calls with the same parameters. It really does happen on some platforms, especially with images.</p>
 <p>Warning: This function may be time-consuming, so you shouldn't call it too often (like every frame or after every resource creation/destruction). You can call it on special occasions (like when reloading a game level or when you just destroyed a lot of objects). </p>
 
@@ -1320,7 +1402,7 @@
         <tr>
           <td class="memname">void vmaDestroyAllocator </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em></td><td>)</td>
           <td></td>
         </tr>
@@ -1340,7 +1422,7 @@
         <tr>
           <td class="memname">void vmaDestroyBuffer </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1352,7 +1434,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
           <td class="paramname"><em>allocation</em>&#160;</td>
         </tr>
         <tr>
@@ -1378,7 +1460,7 @@
         <tr>
           <td class="memname">void vmaDestroyImage </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1390,7 +1472,7 @@
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
           <td class="paramname"><em>allocation</em>&#160;</td>
         </tr>
         <tr>
@@ -1416,13 +1498,13 @@
         <tr>
           <td class="memname">void vmaDestroyPool </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaPool&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;</td>
           <td class="paramname"><em>pool</em>&#160;</td>
         </tr>
         <tr>
@@ -1433,7 +1515,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Destroys VmaPool object and frees Vulkan device memory. </p>
+<p>Destroys <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> object and frees Vulkan device memory. </p>
 
 </div>
 </div>
@@ -1446,7 +1528,7 @@
         <tr>
           <td class="memname">VkResult vmaFindMemoryTypeIndex </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1496,7 +1578,7 @@
         <tr>
           <td class="memname">VkResult vmaFindMemoryTypeIndexForBufferInfo </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1545,7 +1627,7 @@
         <tr>
           <td class="memname">VkResult vmaFindMemoryTypeIndexForImageInfo </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1594,13 +1676,13 @@
         <tr>
           <td class="memname">void vmaFreeMemory </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
           <td class="paramname"><em>allocation</em>&#160;</td>
         </tr>
         <tr>
@@ -1624,7 +1706,7 @@
         <tr>
           <td class="memname">void vmaFreeStatsString </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1652,13 +1734,13 @@
         <tr>
           <td class="memname">void vmaGetAllocationInfo </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
           <td class="paramname"><em>allocation</em>, </td>
         </tr>
         <tr>
@@ -1675,8 +1757,14 @@
       </table>
 </div><div class="memdoc">
 
-<p>Returns current information about specified allocation. </p>
-<p>It also "touches" allocation... TODO finish documentation. </p>
+<p>Returns current information about specified allocation and atomically marks it as used in current frame. </p>
+<p>Current paramters of given allocation are returned in <code>pAllocationInfo</code>.</p>
+<p>This function also atomically "touches" allocation - marks it as used in current frame, just like <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame...">vmaTouchAllocation()</a>. If the allocation is in lost state, <code>pAllocationInfo-&gt;deviceMemory == VK_NULL_HANDLE</code>.</p>
+<p>Although this function uses atomics and doesn't lock any mutex, so it should be quite efficient, you can avoid calling it too often.</p>
+<ul>
+<li>You can retrieve same <a class="el" href="struct_vma_allocation_info.html" title="Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). ">VmaAllocationInfo</a> structure while creating your resource, from function <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a>, <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer(). ">vmaCreateImage()</a>. You can remember it if you are sure parameters don't change (e.g. due to defragmentation or allocation becoming lost).</li>
+<li>If you just want to check if allocation is not lost, <a class="el" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a" title="Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame...">vmaTouchAllocation()</a> will work faster. </li>
+</ul>
 
 </div>
 </div>
@@ -1689,7 +1777,7 @@
         <tr>
           <td class="memname">void vmaGetMemoryProperties </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1718,7 +1806,7 @@
         <tr>
           <td class="memname">void vmaGetMemoryTypeProperties </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1755,7 +1843,7 @@
         <tr>
           <td class="memname">void vmaGetPhysicalDeviceProperties </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1784,13 +1872,13 @@
         <tr>
           <td class="memname">void vmaGetPoolStats </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaPool&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;</td>
           <td class="paramname"><em>pool</em>, </td>
         </tr>
         <tr>
@@ -1807,7 +1895,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Retrieves statistics of existing VmaPool object. </p>
+<p>Retrieves statistics of existing <a class="el" href="struct_vma_pool.html" title="Represents custom memory pool. ">VmaPool</a> object. </p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramdir"></td><td class="paramname">allocator</td><td>Allocator object. </td></tr>
@@ -1828,13 +1916,13 @@
         <tr>
           <td class="memname">void vmaMakePoolAllocationsLost </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaPool&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_pool.html">VmaPool</a>&#160;</td>
           <td class="paramname"><em>pool</em>, </td>
         </tr>
         <tr>
@@ -1872,13 +1960,13 @@
         <tr>
           <td class="memname">VkResult vmaMapMemory </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
           <td class="paramname"><em>allocation</em>, </td>
         </tr>
         <tr>
@@ -1900,9 +1988,9 @@
 <p>Mapping is internally reference-counted and synchronized, so despite raw Vulkan function <code>vkMapMemory()</code> cannot be used to map same block of <code>VkDeviceMemory</code> multiple times simultaneously, it is safe to call this function on allocations assigned to the same memory block. Actual Vulkan memory will be mapped on first mapping and unmapped on last unmapping.</p>
 <p>If the function succeeded, you must call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a> to unmap the allocation when mapping is no longer needed or before freeing the allocation, at the latest.</p>
 <p>It also safe to call this function multiple times on the same allocation. You must call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>.</p>
-<p>It is also safe to call this function on allocation created with <code>VMA_ALLOCATION_CREATE_MAPPED_BIT</code> flag. Its memory stays mapped all the time. You must still call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>. You must not call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a> additional time to free the "0-th" mapping made automatically due to <code>VMA_ALLOCATION_CREATE_MAPPED_BIT</code> flag.</p>
+<p>It is also safe to call this function on allocation created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag. Its memory stays mapped all the time. You must still call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a> same number of times as you called <a class="el" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069" title="Maps memory represented by given allocation and returns pointer to it. ">vmaMapMemory()</a>. You must not call <a class="el" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45" title="Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). ">vmaUnmapMemory()</a> additional time to free the "0-th" mapping made automatically due to <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f" title="Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> flag.</p>
 <p>This function fails when used on allocation made in memory type that is not <code>HOST_VISIBLE</code>.</p>
-<p>This function always fails when called for allocation that was created with <code>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</code> flag. Such allocations cannot be mapped. </p>
+<p>This function always fails when called for allocation that was created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag. Such allocations cannot be mapped. </p>
 
 </div>
 </div>
@@ -1915,13 +2003,13 @@
         <tr>
           <td class="memname">void vmaSetAllocationUserData </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
           <td class="paramname"><em>allocation</em>, </td>
         </tr>
         <tr>
@@ -1939,8 +2027,8 @@
 </div><div class="memdoc">
 
 <p>Sets pUserData in given allocation to new value. </p>
-<p>If the allocation was created with VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT, pUserData must be either null, or pointer to a null-terminated string. The function makes local copy of the string and sets it as allocation's pUserData. String passed as pUserData doesn't need to be valid for whole lifetime of the allocation - you can free it after this call. String previously pointed by allocation's pUserData is freed from memory.</p>
-<p>If the flag was not used, the value of pointer pUserData is just copied to allocation's pUserData. It is opaque, so you can use it however you want - e.g. as a pointer, ordinal number or some handle to you own data. </p>
+<p>If the allocation was created with VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT, pUserData must be either null, or pointer to a null-terminated string. The function makes local copy of the string and sets it as allocation's <code>pUserData</code>. String passed as pUserData doesn't need to be valid for whole lifetime of the allocation - you can free it after this call. String previously pointed by allocation's pUserData is freed from memory.</p>
+<p>If the flag was not used, the value of pointer <code>pUserData</code> is just copied to allocation's <code>pUserData</code>. It is opaque, so you can use it however you want - e.g. as a pointer, ordinal number or some handle to you own data. </p>
 
 </div>
 </div>
@@ -1953,7 +2041,7 @@
         <tr>
           <td class="memname">void vmaSetCurrentFrameIndex </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
@@ -1971,7 +2059,7 @@
 </div><div class="memdoc">
 
 <p>Sets index of the current frame. </p>
-<p>This function must be used if you make allocations with <code>VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</code> and <code>VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</code> flags to inform the allocator when a new frame begins. Allocations queried using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation. ">vmaGetAllocationInfo()</a> cannot become lost in the current frame. </p>
+<p>This function must be used if you make allocations with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> and <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> flags to inform the allocator when a new frame begins. Allocations queried using <a class="el" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b" title="Returns current information about specified allocation and atomically marks it as used in current fra...">vmaGetAllocationInfo()</a> cannot become lost in the current frame. </p>
 
 </div>
 </div>
@@ -1984,13 +2072,13 @@
         <tr>
           <td class="memname">VkBool32 vmaTouchAllocation </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
           <td class="paramname"><em>allocation</em>&#160;</td>
         </tr>
         <tr>
@@ -2001,7 +2089,10 @@
       </table>
 </div><div class="memdoc">
 
-<p>TODO finish documentation... </p>
+<p>Returns <code>VK_TRUE</code> if allocation is not lost and atomically marks it as used in current frame. </p>
+<p>If the allocation has been created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag, this function returns <code>VK_TRUE</code> if it's not in lost state, so it can still be used. It then also atomically "touches" the allocation - marks it as used in current frame, so that you can be sure it won't become lost in current frame or next <code>frameInUseCount</code> frames.</p>
+<p>If the allocation is in lost state, the function returns <code>VK_FALSE</code>. Memory of such allocation, as well as buffer or image bound to it, should not be used. Lost allocation and the buffer/image still need to be destroyed.</p>
+<p>If the allocation has been created without <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag, this function always returns <code>VK_TRUE</code>. </p>
 
 </div>
 </div>
@@ -2014,13 +2105,13 @@
         <tr>
           <td class="memname">void vmaUnmapMemory </td>
           <td>(</td>
-          <td class="paramtype">VmaAllocator&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocator.html">VmaAllocator</a>&#160;</td>
           <td class="paramname"><em>allocator</em>, </td>
         </tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">VmaAllocation&#160;</td>
+          <td class="paramtype"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>&#160;</td>
           <td class="paramname"><em>allocation</em>&#160;</td>
         </tr>
         <tr>
diff --git a/docs/html/vk__mem__alloc_8h_source.html b/docs/html/vk__mem__alloc_8h_source.html
index bdec8ad..60bb91c 100644
--- a/docs/html/vk__mem__alloc_8h_source.html
+++ b/docs/html/vk__mem__alloc_8h_source.html
@@ -62,157 +62,162 @@
 <div class="title">vk_mem_alloc.h</div>  </div>
 </div><!--header-->
 <div class="contents">
-<a href="vk__mem__alloc_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright (c) 2017-2018 Advanced Micro Devices, Inc. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">// Permission is hereby granted, free of charge, to any person obtaining a copy</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment">// of this software and associated documentation files (the &quot;Software&quot;), to deal</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment">// in the Software without restriction, including without limitation the rights</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment">// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment">// copies of the Software, and to permit persons to whom the Software is</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment">// furnished to do so, subject to the following conditions:</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment">// The above copyright notice and this permission notice shall be included in</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment">// all copies or substantial portions of the Software.</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment">// THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment">// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment">// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment">// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment">// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment">// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment">// THE SOFTWARE.</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#ifndef AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#define AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;<span class="preprocessor">#include &lt;vulkan/vulkan.h&gt;</span></div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;</div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;VK_DEFINE_HANDLE(VmaAllocator)</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a>)(</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;    VmaAllocator      allocator,</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l00837"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">  837</a></span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a>)(</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;    VmaAllocator      allocator,</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;</div><div class="line"><a name="l00850"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html">  850</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> {</div><div class="line"><a name="l00852"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">  852</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a> <a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div><div class="line"><a name="l00854"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">  854</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a> <a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;</div><div class="line"><a name="l00858"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">  858</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> {</div><div class="line"><a name="l00863"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">  863</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001,</div><div class="line"><a name="l00885"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">  885</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002,</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;</div><div class="line"><a name="l00887"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">  887</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div><div class="line"><a name="l00889"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">  889</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>;</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;</div><div class="line"><a name="l00895"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html">  895</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> {</div><div class="line"><a name="l00896"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">  896</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div><div class="line"><a name="l00897"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">  897</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div><div class="line"><a name="l00898"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">  898</a></span>&#160;    PFN_vkAllocateMemory <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div><div class="line"><a name="l00899"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">  899</a></span>&#160;    PFN_vkFreeMemory <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div><div class="line"><a name="l00900"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">  900</a></span>&#160;    PFN_vkMapMemory <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div><div class="line"><a name="l00901"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">  901</a></span>&#160;    PFN_vkUnmapMemory <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div><div class="line"><a name="l00902"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">  902</a></span>&#160;    PFN_vkBindBufferMemory <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div><div class="line"><a name="l00903"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">  903</a></span>&#160;    PFN_vkBindImageMemory <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div><div class="line"><a name="l00904"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">  904</a></span>&#160;    PFN_vkGetBufferMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div><div class="line"><a name="l00905"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">  905</a></span>&#160;    PFN_vkGetImageMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div><div class="line"><a name="l00906"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">  906</a></span>&#160;    PFN_vkCreateBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div><div class="line"><a name="l00907"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">  907</a></span>&#160;    PFN_vkDestroyBuffer <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div><div class="line"><a name="l00908"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">  908</a></span>&#160;    PFN_vkCreateImage <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div><div class="line"><a name="l00909"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">  909</a></span>&#160;    PFN_vkDestroyImage <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div><div class="line"><a name="l00910"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a9d8d1b05d2b1e7e1d9b27f6f585acf9c">  910</a></span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR <a class="code" href="struct_vma_vulkan_functions.html#a9d8d1b05d2b1e7e1d9b27f6f585acf9c">vkGetBufferMemoryRequirements2KHR</a>;</div><div class="line"><a name="l00911"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a9cdcdc1e2b2ea7c571f7d27e30ba6875">  911</a></span>&#160;    PFN_vkGetImageMemoryRequirements2KHR <a class="code" href="struct_vma_vulkan_functions.html#a9cdcdc1e2b2ea7c571f7d27e30ba6875">vkGetImageMemoryRequirements2KHR</a>;</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a>;</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;</div><div class="line"><a name="l00915"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html">  915</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;{</div><div class="line"><a name="l00918"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">  918</a></span>&#160;    VmaAllocatorCreateFlags <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;</div><div class="line"><a name="l00921"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">  921</a></span>&#160;    VkPhysicalDevice <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;</div><div class="line"><a name="l00924"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">  924</a></span>&#160;    VkDevice <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;</div><div class="line"><a name="l00927"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">  927</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;</div><div class="line"><a name="l00930"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">  930</a></span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>;</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;</div><div class="line"><a name="l00933"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">  933</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>* <a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l00947"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">  947</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div><div class="line"><a name="l00971"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">  971</a></span>&#160;    <span class="keyword">const</span> VkDeviceSize* <a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>;</div><div class="line"><a name="l00983"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">  983</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* <a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>;</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a>;</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;    VmaAllocator* pAllocator);</div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;</div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;    VmaAllocator allocator);</div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties** ppPhysicalDeviceProperties);</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;    VkMemoryPropertyFlags* pFlags);</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;    uint32_t frameIndex);</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;</div><div class="line"><a name="l01036"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 1036</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;{</div><div class="line"><a name="l01039"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 1039</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l01041"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 1041</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l01043"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 1043</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l01045"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 1045</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l01047"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 1047</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l01048"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 1048</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocationSizeAvg, allocationSizeMax;</div><div class="line"><a name="l01049"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 1049</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSizeAvg, unusedRangeSizeMax;</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a>;</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;</div><div class="line"><a name="l01053"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 1053</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stats.html">VmaStats</a></div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;{</div><div class="line"><a name="l01055"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 1055</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryType[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l01056"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 1056</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryHeap[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l01057"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 1057</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>;</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a>;</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;</div><div class="line"><a name="l01065"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 1065</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;    VkBool32 detailedMap);</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;    <span class="keywordtype">char</span>* pStatsString);</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;VK_DEFINE_HANDLE(VmaPool)</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;</div><div class="line"><a name="l01085"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 1085</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;{</div><div class="line"><a name="l01090"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 1090</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0,</div><div class="line"><a name="l01107"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 1107</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1,</div><div class="line"><a name="l01117"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 1117</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2,</div><div class="line"><a name="l01124"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 1124</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3,</div><div class="line"><a name="l01133"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 1133</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4,</div><div class="line"><a name="l01134"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 1134</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;</div><div class="line"><a name="l01138"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 1138</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> {</div><div class="line"><a name="l01150"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 1150</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001,</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;</div><div class="line"><a name="l01161"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 1161</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002,</div><div class="line"><a name="l01174"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 1174</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004,</div><div class="line"><a name="l01187"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 1187</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008,</div><div class="line"><a name="l01194"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 1194</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010,</div><div class="line"><a name="l01200"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 1200</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020,</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;</div><div class="line"><a name="l01202"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 1202</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div><div class="line"><a name="l01204"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 1204</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>;</div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;</div><div class="line"><a name="l01206"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 1206</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;{</div><div class="line"><a name="l01209"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 1209</a></span>&#160;    VmaAllocationCreateFlags <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div><div class="line"><a name="l01215"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 1215</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> <a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>;</div><div class="line"><a name="l01220"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 1220</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l01225"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 1225</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l01233"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 1233</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l01239"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 1239</a></span>&#160;    VmaPool <a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>;</div><div class="line"><a name="l01246"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 1246</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>;</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a>;</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l01268"></a><span class="lineno"> 1268</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l01304"></a><span class="lineno"> 1304</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;</div><div class="line"><a name="l01308"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 1308</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> {</div><div class="line"><a name="l01326"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 1326</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002,</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;</div><div class="line"><a name="l01328"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 1328</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div><div class="line"><a name="l01330"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 1330</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>;</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;</div><div class="line"><a name="l01334"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 1334</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> {</div><div class="line"><a name="l01337"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 1337</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div><div class="line"><a name="l01340"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 1340</a></span>&#160;    VmaPoolCreateFlags <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div><div class="line"><a name="l01345"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 1345</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div><div class="line"><a name="l01350"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 1350</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>;</div><div class="line"><a name="l01358"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 1358</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>;</div><div class="line"><a name="l01372"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 1372</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a>;</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;</div><div class="line"><a name="l01377"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 1377</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a> {</div><div class="line"><a name="l01380"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 1380</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div><div class="line"><a name="l01383"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 1383</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div><div class="line"><a name="l01386"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 1386</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div><div class="line"><a name="l01389"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 1389</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l01396"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 1396</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a>;</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;    VmaPool* pPool);</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;    VmaPool pool);</div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;    VmaPool pool,</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;    VmaPool pool,</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;VK_DEFINE_HANDLE(VmaAllocation)</div><div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;</div><div class="line"><a name="l01442"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 1442</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div><div class="line"><a name="l01447"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 1447</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div><div class="line"><a name="l01456"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 1456</a></span>&#160;    VkDeviceMemory <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line"><a name="l01461"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 1461</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line"><a name="l01466"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 1466</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line"><a name="l01475"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 1475</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>;</div><div class="line"><a name="l01480"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 1480</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a>;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;    VkImage image,</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;    VmaAllocation allocation);</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;    VmaAllocation allocation,</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;    VmaAllocation allocation);</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;    VmaAllocation allocation,</div><div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;    <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;    VmaAllocation* pAllocation);</div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;    VmaAllocation allocation,</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;    <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;    VmaAllocation allocation);</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;</div><div class="line"><a name="l01621"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 1621</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> {</div><div class="line"><a name="l01626"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 1626</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l01631"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 1631</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>;</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;</div><div class="line"><a name="l01635"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 1635</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> {</div><div class="line"><a name="l01637"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 1637</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l01639"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 1639</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div><div class="line"><a name="l01641"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 1641</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l01643"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 1643</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a>;</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;    VmaAllocation* pAllocations,</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l01763"></a><span class="lineno"> 1763</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;    VmaAllocation allocation);</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;    VkImage image,</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;    VmaAllocation allocation);</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;}</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;<span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</span>&#160;</div><div class="line"><a name="l01817"></a><span class="lineno"> 1817</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;<span class="preprocessor">#ifdef __INTELLISENSE__</span></div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01821"></a><span class="lineno"> 1821</span>&#160;</div><div class="line"><a name="l01822"></a><span class="lineno"> 1822</span>&#160;<span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l01824"></a><span class="lineno"> 1824</span>&#160;</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;<span class="comment">Define some of these macros before each #include of this header or change them</span></div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;</div><div class="line"><a name="l01836"></a><span class="lineno"> 1836</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01837"></a><span class="lineno"> 1837</span>&#160;<span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</span>&#160;<span class="comment">internally, like:</span></div><div class="line"><a name="l01839"></a><span class="lineno"> 1839</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div><div class="line"><a name="l01841"></a><span class="lineno"> 1841</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;<span class="comment">Define to 0 if you are going to provide you own pointers to Vulkan functions via</span></div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;<span class="comment">VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;<span class="preprocessor">#define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</span>&#160;<span class="comment">// Define this macro to 1 to make the library use STL containers instead of its own implementation.</span></div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160;<span class="comment">Set it to 0 or undefined to make the library using its own implementation of</span></div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;<span class="comment">the containers.</span></div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;</div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160;</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;<span class="comment">Following headers are used in this CONFIGURATION section only, so feel free to</span></div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160;<span class="comment">remove them if not needed.</span></div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span> <span class="comment">// for std::mutex</span></div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160;<span class="preprocessor">#include &lt;atomic&gt;</span> <span class="comment">// for std::atomic</span></div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;<span class="preprocessor">#if !defined(_WIN32) &amp;&amp; !defined(__APPLE__)</span></div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160;<span class="preprocessor">    #include &lt;malloc.h&gt;</span> <span class="comment">// for aligned_alloc()</span></div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;   <span class="comment">// Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.</span></div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;<span class="preprocessor">#if defined(__APPLE__)</span></div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;<span class="keywordtype">void</span> *aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</span>&#160;{</div><div class="line"><a name="l01898"></a><span class="lineno"> 1898</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;    <span class="keywordflow">if</span>(alignment &lt; <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160;    {</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;    }</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;    <span class="keywordtype">void</span> *pointer;</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</span>&#160;        <span class="keywordflow">return</span> pointer;</div><div class="line"><a name="l01907"></a><span class="lineno"> 1907</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;}</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;<span class="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160;</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</span>&#160;</div><div class="line"><a name="l01934"></a><span class="lineno"> 1934</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;<span class="preprocessor">#ifndef VMA_MIN</span></div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;<span class="preprocessor">#ifndef VMA_MAX</span></div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;   <span class="comment">/*</span></div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;<span class="comment">   } while(false)</span></div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;<span class="comment">   */</span></div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint32ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint32_t num)</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;   {</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;       snprintf(outStr, strLen, <span class="stringliteral">&quot;%u&quot;</span>, static_cast&lt;unsigned int&gt;(num));</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;   }</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint64ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint64_t num)</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;   {</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;       snprintf(outStr, strLen, <span class="stringliteral">&quot;%llu&quot;</span>, static_cast&lt;unsigned long long&gt;(num));</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;   }</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPtrToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, <span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;   {</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</span>&#160;       snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</div><div class="line"><a name="l01989"></a><span class="lineno"> 1989</span>&#160;   }</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;   <span class="keyword">class </span>VmaMutex</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;   {</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;   <span class="keyword">public</span>:</div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160;       VmaMutex() { }</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;       ~VmaMutex() { }</div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;       <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;       <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;   <span class="keyword">private</span>:</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;       std::mutex m_Mutex;</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;   };</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;<span class="preprocessor">   #define VMA_MUTEX VmaMutex</span></div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;</div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;<span class="comment">If providing your own implementation, you need to implement a subset of std::atomic:</span></div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;<span class="comment">- Constructor(uint32_t desired)</span></div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;<span class="comment">- uint32_t load() const</span></div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160;<span class="comment">- void store(uint32_t desired)</span></div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</span>&#160;<span class="comment">- bool compare_exchange_weak(uint32_t&amp; expected, uint32_t desired)</span></div><div class="line"><a name="l02013"></a><span class="lineno"> 2013</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;<span class="preprocessor">   #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160;</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;<span class="preprocessor">#ifndef VMA_BEST_FIT</span></div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;<span class="preprocessor">   #define VMA_BEST_FIT (1)</span></div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_ALIGNMENT (1)</span></div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_MARGIN (0)</span></div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;<span class="comment">END OF CONFIGURATION</span></div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;<span class="comment">// Returns number of bits set to 1 in (v).</span></div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;{</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div><div class="line"><a name="l02098"></a><span class="lineno"> 2098</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160;    <span class="keywordflow">return</span> c;</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;}</div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;<span class="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;{</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;    <span class="keywordflow">return</span> (val + align - 1) / align * align;</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;}</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;<span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;{</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;}</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160;</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;{</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;    Iterator centerValue = end; --centerValue;</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;    Iterator insertIndex = beg;</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;    {</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;        {</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;            {</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;                VMA_SWAP(*memTypeIndex, *insertIndex);</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;            }</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;            ++insertIndex;</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;        }</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;    }</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;    <span class="keywordflow">if</span>(insertIndex != centerValue)</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;    {</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;    }</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;    <span class="keywordflow">return</span> insertIndex;</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;}</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;{</div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;    {</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;    }</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;}</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_SORT</span></div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;<span class="comment">Algorithm is based on &quot;Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)&quot;</span></div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;<span class="comment">chapter 11.6 &quot;Resource Memory Association&quot;, paragraph &quot;Buffer-Image Granularity&quot;.</span></div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;    VkDeviceSize resourceAOffset,</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;    VkDeviceSize resourceASize,</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;    VkDeviceSize resourceBOffset,</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;    VkDeviceSize pageSize)</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;{</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;}</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;<span class="keyword">enum</span> VmaSuballocationType</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;{</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160;};</div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160;<span class="comment">or linear image and another one is optimal image. If type is unknown, behave</span></div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160;<span class="comment">conservatively.</span></div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160;    VmaSuballocationType suballocType1,</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;    VmaSuballocationType suballocType2)</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;{</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;    <span class="keywordflow">if</span>(suballocType1 &gt; suballocType2)</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;    {</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;        VMA_SWAP(suballocType1, suballocType2);</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;    }</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;    </div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160;    {</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;    }</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;}</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;<span class="comment">// Helper RAII class to lock a mutex in constructor and unlock it in destructor (at the end of scope).</span></div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;<span class="keyword">struct </span>VmaMutexLock</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;{</div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;    {</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;        {</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;            m_pMutex-&gt;Lock();</div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;        }</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;    }</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;    </div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;    ~VmaMutexLock()</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;    {</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;        {</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;            m_pMutex-&gt;Unlock();</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;        }</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;    }</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;    VMA_MUTEX* m_pMutex;</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;};</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;<span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;<span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;<span class="comment">Returned value is the found element, if present in the collection or place where</span></div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> CmpT&gt;</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, CmpT cmp)</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;{</div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;   <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160;   <span class="keywordflow">while</span>(down &lt; up)</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160;   {</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160;      <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160;      <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160;      {</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160;         down = mid + 1;</div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160;      }</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160;      <span class="keywordflow">else</span></div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160;      {</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160;         up = mid;</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160;      }</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160;   }</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160;   <span class="keywordflow">return</span> beg + down;</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160;}</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;<span class="comment">// Memory allocation</span></div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160;</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;{</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;    {</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;        <span class="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160;            size,</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160;            alignment,</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160;    }</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160;    {</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;        <span class="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;    }</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160;}</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160;{</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160;    {</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160;    }</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160;    {</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160;        VMA_SYSTEM_FREE(ptr);</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160;    }</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160;}</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160;</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>&#160;{</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;}</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;</div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160;{</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;}</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160;</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;<span class="preprocessor">#define vma_new_array(allocator, type, count)   new(VmaAllocateArray&lt;type&gt;((allocator), (count)))(type)</span></div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160;</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr)</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;{</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160;    ptr-&gt;~T();</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;}</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;{</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;    {</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;        {</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160;        }</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>&#160;        VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>&#160;    }</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160;}</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160;</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;<span class="comment">// STL-compatible allocator.</span></div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;<span class="keyword">class </span>VmaStlAllocator</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;{</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160;    </div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; src) : m_pCallbacks(src.m_pCallbacks) { }</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160;</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;    T* allocate(<span class="keywordtype">size_t</span> n) { <span class="keywordflow">return</span> VmaAllocateArray&lt;T&gt;(m_pCallbacks, n); }</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;    <span class="keywordtype">void</span> deallocate(T* p, <span class="keywordtype">size_t</span> n) { VmaFree(m_pCallbacks, p); }</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160;</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;    <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160;    }</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160;    <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;    }</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>&#160;};</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160;</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>&#160;</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160;<span class="preprocessor">#define VmaVector std::vector</span></div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160;</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;{</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>&#160;    vec.insert(vec.begin() + index, item);</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>&#160;}</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</span>&#160;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;{</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;    vec.erase(vec.begin() + index);</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;}</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160;</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160;</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;<span class="comment">T must be POD because constructors and destructors are not called and memcpy is</span></div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;<span class="comment">used for these objects. */</span></div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;<span class="keyword">class </span>VmaVector</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;{</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02417"></a><span class="lineno"> 2417</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;</div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;        m_pArray(VMA_NULL),</div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160;        m_Count(0),</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</span>&#160;        m_Capacity(0)</div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160;    {</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;    }</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160;</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l02428"></a><span class="lineno"> 2428</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;        m_Count(count),</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;        m_Capacity(count)</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160;    {</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;    }</div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;    </div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;        m_Allocator(src.m_Allocator),</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;        m_pArray(src.m_Count ? (T*)VmaAllocateArray&lt;T&gt;(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160;        m_Count(src.m_Count),</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;        m_Capacity(src.m_Count)</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160;    {</div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160;        <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160;        {</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;        }</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;    }</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160;    </div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160;    ~VmaVector()</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160;    {</div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>&#160;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>&#160;    }</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160;</div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160;    {</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160;        {</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160;            resize(rhs.m_Count);</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160;            {</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160;            }</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160;        }</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;    }</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160;    </div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;    <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160;    </div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160;    {</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160;    }</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160;    <span class="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>&#160;    }</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160;</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160;    T&amp; front()</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160;    {</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160;    }</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;    }</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160;    T&amp; back()</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160;    {</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>&#160;    }</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>&#160;    }</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>&#160;</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>&#160;    <span class="keywordtype">void</span> reserve(<span class="keywordtype">size_t</span> newCapacity, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160;    {</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160;        </div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160;        {</div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>&#160;            newCapacity = m_Capacity;</div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>&#160;        }</div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160;        </div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160;        {</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;            {</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160;            }</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;        }</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;    }</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;    <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;    {</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;        {</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;            newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;        }</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;        {</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160;            newCapacity = newCount;</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;        }</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;        {</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;</div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> elementsToCopy = VMA_MIN(m_Count, newCount);</div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;            {</div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;            }</div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160;        }</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160;</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;        m_Count = newCount;</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;    }</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;    <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;    {</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160;        resize(0, freeMemory);</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160;    }</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160;    {</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160;        resize(oldCount + 1);</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160;        {</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;        }</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;        m_pArray[index] = src;</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;    }</div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160;</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;    <span class="keywordtype">void</span> <span class="keyword">remove</span>(<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160;    {</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;        {</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;            memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160;        }</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>&#160;        resize(oldCount - 1);</div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>&#160;    }</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160;</div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160;    {</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;        resize(newIndex + 1);</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;        m_pArray[newIndex] = src;</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>&#160;    }</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>&#160;</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;    <span class="keywordtype">void</span> pop_back()</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;    {</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160;        resize(size() - 1);</div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;    }</div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160;</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>&#160;    {</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;        insert(0, src);</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;    }</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160;</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;    <span class="keywordtype">void</span> pop_front()</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;    {</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>&#160;        <span class="keyword">remove</span>(0);</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>&#160;    }</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>&#160;</div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;</div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>&#160;    AllocatorT m_Allocator;</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>&#160;    T* m_pArray;</div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;};</div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;</div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160;{</div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;    vec.insert(index, item);</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;}</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;</div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;{</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>&#160;    vec.remove(index);</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160;}</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160;<span class="keywordtype">size_t</span> VmaVectorInsertSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160;{</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>&#160;        vector.data(),</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>&#160;        value,</div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>&#160;        CmpLess()) - vector.data();</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>&#160;}</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>&#160;</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>&#160;<span class="keywordtype">bool</span> VmaVectorRemoveSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>&#160;{</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>&#160;        vector.begin(),</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>&#160;        vector.end(),</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>&#160;        value,</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>&#160;        comparator);</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>&#160;    <span class="keywordflow">if</span>((it != vector.end()) &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>&#160;    {</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>&#160;    }</div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160;}</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160;</div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;<span class="keywordtype">size_t</span> VmaVectorFindSorted(<span class="keyword">const</span> VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>&#160;{</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>&#160;        vector.data(),</div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>&#160;        value,</div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160;        comparator);</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;    <span class="keywordflow">if</span>(it != vector.size() &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>&#160;    {</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>&#160;        <span class="keywordflow">return</span> it - vector.begin();</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;    }</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160;    {</div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>&#160;        <span class="keywordflow">return</span> vector.size();</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160;    }</div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>&#160;}</div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>&#160;</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;<span class="comment">// class VmaPoolAllocator</span></div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>&#160;</div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>&#160;<span class="comment">Allocator for objects of type T using a list of arrays (pools) to speed up</span></div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>&#160;{</div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock);</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>&#160;    ~VmaPoolAllocator();</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>&#160;    T* Alloc();</div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160;</div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>&#160;    <span class="keyword">union </span>Item</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>&#160;    {</div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160;        uint32_t NextFreeIndex;</div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>&#160;        T Value;</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>&#160;    };</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>&#160;</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>&#160;    <span class="keyword">struct </span>ItemBlock</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>&#160;    {</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>&#160;        Item* pItems;</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>&#160;        uint32_t FirstFreeIndex;</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160;    };</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160;    </div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>&#160;    <span class="keywordtype">size_t</span> m_ItemsPerBlock;</div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>&#160;</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>&#160;    ItemBlock&amp; CreateNewBlock();</div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>&#160;};</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>&#160;</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>&#160;VmaPoolAllocator&lt;T&gt;::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock) :</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>&#160;    m_ItemsPerBlock(itemsPerBlock),</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>&#160;{</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>&#160;    VMA_ASSERT(itemsPerBlock &gt; 0);</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>&#160;}</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;{</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160;    Clear();</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>&#160;}</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>&#160;</div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Clear()</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>&#160;{</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemsPerBlock);</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>&#160;    m_ItemBlocks.clear();</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>&#160;}</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>&#160;</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>&#160;T* VmaPoolAllocator&lt;T&gt;::Alloc()</div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>&#160;{</div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>&#160;    {</div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>&#160;        {</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>&#160;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>&#160;            <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>&#160;        }</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>&#160;    }</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>&#160;</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>&#160;    <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>&#160;}</div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>&#160;</div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>&#160;{</div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>&#160;    <span class="comment">// Search all memory blocks to find ptr.</span></div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_ItemBlocks.size(); ++i)</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>&#160;    {</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>&#160;        </div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>&#160;        <span class="comment">// Casting to union.</span></div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>&#160;        Item* pItemPtr;</div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>&#160;        </div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>&#160;        <span class="comment">// Check if pItemPtr is in address range of this block.</span></div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160;        <span class="keywordflow">if</span>((pItemPtr &gt;= block.pItems) &amp;&amp; (pItemPtr &lt; block.pItems + m_ItemsPerBlock))</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160;        {</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>&#160;            <span class="keyword">const</span> uint32_t index = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(pItemPtr - block.pItems);</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>&#160;            block.FirstFreeIndex = index;</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>&#160;        }</div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>&#160;    }</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pointer doesn&#39;t belong to this memory pool.&quot;</span>);</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>&#160;}</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160;</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;{</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;    ItemBlock newBlock = {</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, m_ItemsPerBlock), 0 };</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>&#160;</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160;    m_ItemBlocks.push_back(newBlock);</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>&#160;</div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160;    <span class="comment">// Setup singly-linked list of all free items in this block.</span></div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; m_ItemsPerBlock - 1; ++i)</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>&#160;    newBlock.pItems[m_ItemsPerBlock - 1].NextFreeIndex = UINT32_MAX;</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>&#160;}</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>&#160;</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160;</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;<span class="preprocessor">#define VmaList std::list</span></div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160;</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>&#160;</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;<span class="keyword">struct </span>VmaListItem</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>&#160;{</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160;    VmaListItem* pPrev;</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;    VmaListItem* pNext;</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;    T Value;</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>&#160;};</div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>&#160;</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>&#160;<span class="comment">// Doubly linked list.</span></div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160;<span class="keyword">class </span>VmaRawList</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>&#160;{</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>&#160;</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>&#160;    ~VmaRawList();</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>&#160;</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;    <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;    <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;    <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160;</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>&#160;    ItemType* PushBack();</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160;    ItemType* PushFront();</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160;    <span class="keywordtype">void</span> PopBack();</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>&#160;    <span class="keywordtype">void</span> PopFront();</div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>&#160;    </div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>&#160;    <span class="comment">// Item can be null - it means PushBack.</span></div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>&#160;</div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>&#160;    <span class="keywordtype">void</span> Remove(ItemType* pItem);</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>&#160;    ItemType* m_pFront;</div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>&#160;    ItemType* m_pBack;</div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>&#160;</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160;    <span class="comment">// Declared not defined, to block copy constructor and assignment operator.</span></div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>&#160;    VmaRawList(<span class="keyword">const</span> VmaRawList&lt;T&gt;&amp; src);</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>&#160;    VmaRawList&lt;T&gt;&amp; operator=(<span class="keyword">const</span> VmaRawList&lt;T&gt;&amp; rhs);</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>&#160;};</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>&#160;</div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;    m_pFront(VMA_NULL),</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160;    m_pBack(VMA_NULL),</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160;    m_Count(0)</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160;{</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160;}</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>&#160;{</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;}</div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;{</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;    {</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;        ItemType* pItem = m_pBack;</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;        {</div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160;            m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;            pItem = pPrevItem;</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;        }</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>&#160;        m_pFront = VMA_NULL;</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;        m_pBack = VMA_NULL;</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;        m_Count = 0;</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>&#160;    }</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>&#160;}</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>&#160;</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;{</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>&#160;    {</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;        m_Count = 1;</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>&#160;    }</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160;    {</div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>&#160;        pNewItem-&gt;pPrev = m_pBack;</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;        ++m_Count;</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;    }</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160;}</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160;{</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>&#160;    {</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>&#160;        m_Count = 1;</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>&#160;    }</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>&#160;    {</div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160;        ++m_Count;</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>&#160;    }</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>&#160;}</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>&#160;</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack(<span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;{</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;}</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>&#160;</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront(<span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;{</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160;}</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160;</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;{</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;    {</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160;        pPrevItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160;    }</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>&#160;    m_pBack = pPrevItem;</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>&#160;    m_ItemAllocator.Free(pBackItem);</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160;    --m_Count;</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>&#160;}</div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160;</div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160;{</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;    {</div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;    }</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;    m_pFront = pNextItem;</div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>&#160;    --m_Count;</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>&#160;}</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160;</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;{</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;</div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>&#160;    {</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>&#160;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>&#160;    }</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;    {</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;        m_pFront = pItem-&gt;pNext;</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;    }</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160;</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>&#160;    {</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>&#160;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>&#160;    }</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>&#160;    {</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>&#160;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160;        m_pBack = pItem-&gt;pPrev;</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>&#160;    }</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160;</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>&#160;    m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>&#160;    --m_Count;</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>&#160;}</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>&#160;</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160;{</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>&#160;    {</div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160;        newItem-&gt;pPrev = prevItem;</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>&#160;        newItem-&gt;pNext = pItem;</div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160;        pItem-&gt;pPrev = newItem;</div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;        {</div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160;            prevItem-&gt;pNext = newItem;</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160;        }</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>&#160;        {</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;            m_pFront = newItem;</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160;        }</div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;        ++m_Count;</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;    }</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160;        <span class="keywordflow">return</span> PushBack();</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>&#160;}</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160;</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;{</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>&#160;    {</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;        newItem-&gt;pNext = nextItem;</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;        newItem-&gt;pPrev = pItem;</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;        pItem-&gt;pNext = newItem;</div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;        {</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160;            nextItem-&gt;pPrev = newItem;</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160;        }</div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;        {</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160;            m_pBack = newItem;</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;        }</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160;        ++m_Count;</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;    }</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;        <span class="keywordflow">return</span> PushFront();</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>&#160;}</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>&#160;</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>&#160;{</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160;}</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;{</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;}</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;<span class="keyword">class </span>VmaList</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;{</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>&#160;    <span class="keyword">class </span>iterator</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>&#160;    {</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>&#160;        iterator() :</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;        {</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;        }</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;        T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;        }</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160;        T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;        }</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;        iterator&amp; operator++()</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;        {</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;        }</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;        iterator&amp; operator--()</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;        {</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;            {</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;            }</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;            {</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>&#160;            }</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>&#160;        }</div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>&#160;</div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>&#160;        {</div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>&#160;        }</div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160;        {</div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160;        }</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>&#160;</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;        }</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;        }</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;        </div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160;</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;            m_pList(pList),</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;        {</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;        }</div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;    };</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;    <span class="keyword">class </span>const_iterator</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;    {</div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;        const_iterator() :</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>&#160;        {</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;        }</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160;</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;            m_pList(src.m_pList),</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160;            m_pItem(src.m_pItem)</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>&#160;        {</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;        }</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160;        </div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;        }</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;        <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;        }</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160;        const_iterator&amp; operator++()</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;        {</div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;        }</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;        const_iterator&amp; operator--()</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;        {</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;            {</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160;            }</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;            {</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160;            }</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;        }</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160;        {</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>&#160;        }</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160;        const_iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>&#160;        {</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;        }</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160;</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;        }</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;        }</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;        </div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>&#160;        const_iterator(<span class="keyword">const</span> VmaRawList&lt;T&gt;* pList, <span class="keyword">const</span> VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>&#160;            m_pList(pList),</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>&#160;        {</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160;        }</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;    };</div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>&#160;</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.IsEmpty(); }</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.GetCount(); }</div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>&#160;</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>&#160;</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;    const_iterator cbegin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;    const_iterator cend()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, VMA_NULL); }</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; value) { m_RawList.PushBack(value); }</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;    iterator insert(iterator it, <span class="keyword">const</span> T&amp; value) { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;</div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;};</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160;</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160;</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;<span class="comment">// class VmaMap</span></div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;<span class="comment">// Unused in this version.</span></div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;<span class="preprocessor">#if 0</span></div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;</div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160;<span class="preprocessor">#define VmaPair std::pair</span></div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>&#160;</div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;<span class="preprocessor">    std::unordered_map&lt; KeyT, ValueT, std::hash&lt;KeyT&gt;, std::equal_to&lt;KeyT&gt;, VmaStlAllocator&lt; std::pair&lt;KeyT, ValueT&gt; &gt; &gt;</span></div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>&#160;</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;<span class="keyword">struct </span>VmaPair</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;{</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160;    T1 first;</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;    T2 second;</div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160;</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;    VmaPair() : first(), second() { }</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;    VmaPair(<span class="keyword">const</span> T1&amp; firstSrc, <span class="keyword">const</span> T2&amp; secondSrc) : first(firstSrc), second(secondSrc) { }</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;};</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;<span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;<span class="keyword">class </span>VmaMap</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160;{</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>&#160;</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>&#160;</div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>&#160;    </div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;};</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160;</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> FirstT, <span class="keyword">typename</span> SecondT&gt;</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;{</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>&#160;    }</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> FirstT&amp; rhsFirst)<span class="keyword"> const</span></div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>&#160;    }</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;};</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::insert(<span class="keyword">const</span> PairType&amp; pair)</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;{</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;        pair,</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;}</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;</div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;VmaPair&lt;KeyT, ValueT&gt;* VmaMap&lt;KeyT, ValueT&gt;::find(<span class="keyword">const</span> KeyT&amp; key)</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;{</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;        key,</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;    {</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;        <span class="keywordflow">return</span> it;</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;    }</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;    {</div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>&#160;    }</div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>&#160;}</div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>&#160;</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;{</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160;}</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;<span class="preprocessor">#endif // #if 0</span></div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>&#160;</div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock;</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>&#160;</div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160;<span class="keyword">struct </span>VmaAllocation_T</div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;{</div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> uint8_t MAP_COUNT_FLAG_PERSISTENT_MAP = 0x80;</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;    <span class="keyword">enum</span> FLAGS</div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;    {</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;        FLAG_USER_DATA_STRING = 0x01,</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;    };</div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>&#160;</div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>&#160;    {</div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>&#160;        ALLOCATION_TYPE_NONE,</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>&#160;        ALLOCATION_TYPE_BLOCK,</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>&#160;    };</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>&#160;</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>&#160;    VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;        m_Alignment(1),</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160;        m_Size(0),</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>&#160;        m_pUserData(VMA_NULL),</div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>&#160;        m_LastUseFrameIndex(currentFrameIndex),</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;        m_Type((uint8_t)ALLOCATION_TYPE_NONE),</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;        m_SuballocationType((uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN),</div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;        m_MapCount(0),</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160;        m_Flags(userDataString ? (uint8_t)FLAG_USER_DATA_STRING : 0)</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;    {</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;    }</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;    ~VmaAllocation_T()</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;    {</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>&#160;        VMA_ASSERT((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) == 0 &amp;&amp; <span class="stringliteral">&quot;Allocation was not unmapped before destruction.&quot;</span>);</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160;</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>&#160;    }</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;</div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>&#160;    <span class="keywordtype">void</span> InitBlockAllocation(</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>&#160;        VmaPool hPool,</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160;        <span class="keywordtype">bool</span> mapped,</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;    {</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;        m_Alignment = alignment;</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;        m_Size = size;</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;        m_BlockAllocation.m_hPool = hPool;</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;        m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;        m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160;    }</div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>&#160;</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160;    <span class="keywordtype">void</span> InitLost()</div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160;    {</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;        m_BlockAllocation.m_hPool = VK_NULL_HANDLE;</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;        m_BlockAllocation.m_Offset = 0;</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160;    }</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160;</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>&#160;        VmaAllocator hAllocator,</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;        VkDeviceSize offset);</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;    <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;        VkDeviceMemory hMemory,</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>&#160;        VkDeviceSize size)</div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>&#160;    {</div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>&#160;        m_Alignment = 0;</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;        m_Size = size;</div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;        m_DedicatedAllocation.m_MemoryTypeIndex = memoryTypeIndex;</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>&#160;    }</div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>&#160;</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>&#160;    ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>&#160;    <span class="keywordtype">bool</span> IsUserDataString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_Flags &amp; FLAG_USER_DATA_STRING) != 0; }</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>&#160;    <span class="keywordtype">void</span>* GetUserData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pUserData; }</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>&#160;    <span class="keywordtype">void</span> SetUserData(VmaAllocator hAllocator, <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>&#160;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>&#160;    }</div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;    uint32_t GetMemoryTypeIndex() <span class="keyword">const</span>;</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160;    <span class="keywordtype">bool</span> IsPersistentMap()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_MapCount &amp; MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }</div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;    VmaPool GetPool() <span class="keyword">const</span>;</div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>&#160;    </div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160;    }</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;    <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>&#160;    {</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>&#160;    }</div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;<span class="comment">      makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.</span></div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;<span class="comment">    - Else, returns false.</span></div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160;<span class="comment">    </span></div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>&#160;</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;    {</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = m_Size;</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>&#160;    }</div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>&#160;</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;    <span class="keywordtype">void</span> BlockAllocMap();</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>&#160;    VkResult DedicatedAllocMap(VmaAllocator hAllocator, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocUnmap(VmaAllocator hAllocator);</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160;    VkDeviceSize m_Alignment;</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>&#160;    <span class="comment">// Bit 0x80 is set when allocation was created with VMA_ALLOCATION_CREATE_MAPPED_BIT.</span></div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div><div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>&#160;    uint8_t m_MapCount;</div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160;</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160;    <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160;    {</div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;        VmaPool m_hPool; <span class="comment">// Null if belongs to general memory.</span></div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>&#160;        VkDeviceSize m_Offset;</div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>&#160;    };</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>&#160;</div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;    {</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>&#160;        uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>&#160;        VkDeviceMemory m_hMemory;</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>&#160;        <span class="keywordtype">void</span>* m_pMappedData; <span class="comment">// Not null means memory is mapped.</span></div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>&#160;    };</div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>&#160;</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;    <span class="keyword">union</span></div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>&#160;    {</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;        BlockAllocation m_BlockAllocation;</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>&#160;    };</div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>&#160;</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;    <span class="keywordtype">void</span> FreeUserDataString(VmaAllocator hAllocator);</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>&#160;};</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>&#160;</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>&#160;<span class="comment">allocated memory block or free.</span></div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>&#160;<span class="keyword">struct </span>VmaSuballocation</div><div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>&#160;{</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>&#160;    VkDeviceSize size;</div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>&#160;    VmaAllocation hAllocation;</div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;    VmaSuballocationType type;</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;};</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>&#160;</div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160;<span class="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;<span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>&#160;</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>&#160;<span class="comment">- itemsToMakeLostCount is the number of VmaAllocations that need to be made lost for</span></div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;{</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;    VkDeviceSize sumItemSize; <span class="comment">// Sum size of items to make lost that overlap with proposed allocation.</span></div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160;    VmaSuballocationList::iterator item;</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160;</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>&#160;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160;    }</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>&#160;};</div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>&#160;</div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;{</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;    VmaBlockMetadata(VmaAllocator hAllocator);</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;    ~VmaBlockMetadata();</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>&#160;    <span class="keywordtype">void</span> Init(VkDeviceSize size);</div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>&#160;</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;    <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Suballocations.size() - m_FreeCount; }</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;    VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;    VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;    <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160;</div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>&#160;    <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;    <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160;</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160;</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;    <span class="comment">// Creates trivial request for case when block is empty.</span></div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;    <span class="keywordtype">void</span> CreateFirstAllocationRequest(VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>&#160;</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;    <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>&#160;    <span class="comment">// If failed, returns false.</span></div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>&#160;</div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>&#160;    <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>&#160;</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>&#160;    uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160;</div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>&#160;    <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>&#160;    <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>&#160;        VmaAllocation hAllocation);</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>&#160;</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>&#160;    <span class="keywordtype">void</span> Free(<span class="keyword">const</span> VmaAllocation allocation);</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>&#160;    <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>&#160;</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>&#160;    uint32_t m_FreeCount;</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160;    VmaSuballocationList m_Suballocations;</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>&#160;</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>&#160;</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>&#160;    <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>&#160;        VkDeviceSize* pOffset,</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>&#160;        VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160;    <span class="comment">// Given free suballocation, it merges it with following one, which must also be free.</span></div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>&#160;};</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;<span class="comment">// Helper class that represents mapped memory. Synchronized internally.</span></div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryMapping</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160;{</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03724"></a><span class="lineno"> 3724</span>&#160;    VmaDeviceMemoryMapping();</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160;    ~VmaDeviceMemoryMapping();</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160;    <span class="keywordtype">void</span>* GetMappedData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pMappedData; }</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;    <span class="comment">// ppData can be null.</span></div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;    VkResult Map(VmaAllocator hAllocator, VkDeviceMemory hMemory, uint32_t count, <span class="keywordtype">void</span> **ppData);</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;    <span class="keywordtype">void</span> Unmap(VmaAllocator hAllocator, VkDeviceMemory hMemory, uint32_t count);</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>&#160;</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>&#160;    uint32_t m_MapCount;</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>&#160;};</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;<span class="comment">data about its regions (aka suballocations, `VmaAllocation`), assigned and free.</span></div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>&#160;{</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160;    uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>&#160;    VkDeviceMemory m_hMemory;</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;    VmaDeviceMemoryMapping m_Mapping;    </div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;    VmaBlockMetadata m_Metadata;</div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>&#160;</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;    VmaDeviceMemoryBlock(VmaAllocator hAllocator);</div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;</div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;    ~VmaDeviceMemoryBlock()</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;    {</div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>&#160;    }</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160;    <span class="comment">// Always call after construction.</span></div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>&#160;    <span class="keywordtype">void</span> Init(</div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>&#160;        uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>&#160;        VkDeviceMemory newMemory,</div><div class="line"><a name="l03764"></a><span class="lineno"> 3764</span>&#160;        VkDeviceSize newSize);</div><div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>&#160;    <span class="comment">// Always call before destruction.</span></div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160;    <span class="keywordtype">void</span> Destroy(VmaAllocator allocator);</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;    </div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>&#160;</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>&#160;    <span class="comment">// ppData can be null.</span></div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>&#160;    VkResult Map(VmaAllocator hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>&#160;    <span class="keywordtype">void</span> Unmap(VmaAllocator hAllocator, uint32_t count);</div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160;};</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160;</div><div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>&#160;<span class="keyword">struct </span>VmaPointerLess</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;{</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <span class="keywordtype">void</span>* lhs, <span class="keyword">const</span> <span class="keywordtype">void</span>* rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</div><div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>&#160;    }</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160;};</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160;<span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;<span class="comment">Vulkan memory type.</span></div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160;<span class="keyword">struct </span>VmaBlockVector</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>&#160;{</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160;    VmaBlockVector(</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;        VmaAllocator hAllocator,</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;        VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>&#160;        <span class="keywordtype">bool</span> isCustomPool);</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;    ~VmaBlockVector();</div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160;</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>&#160;    VkResult CreateMinBlocks();</div><div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>&#160;</div><div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160;</div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.empty(); }</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160;</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160;    VkResult Allocate(</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>&#160;        VmaPool hCurrentPool,</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>&#160;        VmaAllocation* pAllocation);</div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>&#160;</div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>&#160;    <span class="keywordtype">void</span> Free(</div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>&#160;        VmaAllocation hAllocation);</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>&#160;</div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160;    <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;    <span class="keywordtype">void</span> AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>&#160;</div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160;</div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>&#160;</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;    VmaDefragmentator* EnsureDefragmentator(</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;        VmaAllocator hAllocator,</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160;</div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;        VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160;        uint32_t&amp; maxAllocationsToMove);</div><div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>&#160;</div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;    <span class="keywordtype">void</span> DestroyDefragmentator();</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;</div><div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160;</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>&#160;    <span class="keyword">const</span> VmaAllocator m_hAllocator;</div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_IsCustomPool;</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty - a</span></div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160;<span class="comment">    hysteresis to avoid pessimistic case of alternating creation and destruction</span></div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;<span class="comment">    of a VkDeviceMemory. */</span></div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;    VmaDefragmentator* m_pDefragmentator;</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160;</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;    <span class="keywordtype">size_t</span> CalcMaxBlockSize() <span class="keyword">const</span>;</div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;</div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;</div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;    <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div><div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>&#160;    <span class="comment">// after this call.</span></div><div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</div><div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160;</div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>&#160;};</div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>&#160;</div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>&#160;<span class="keyword">struct </span>VmaPool_T</div><div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>&#160;{</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;    VmaBlockVector m_BlockVector;</div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>&#160;</div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160;    <span class="comment">// Takes ownership.</span></div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;    VmaPool_T(</div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160;        VmaAllocator hAllocator,</div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo);</div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160;    ~VmaPool_T();</div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160;</div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;    VmaBlockVector&amp; GetBlockVector() { <span class="keywordflow">return</span> m_BlockVector; }</div><div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>&#160;</div><div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>&#160;};</div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160;</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>&#160;<span class="keyword">class </span>VmaDefragmentator</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160;{</div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160;    <span class="keyword">const</span> VmaAllocator m_hAllocator;</div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160;    uint32_t m_CurrentFrameIndex;</div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160;    VkDeviceSize m_BytesMoved;</div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160;    uint32_t m_AllocationsMoved;</div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>&#160;</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160;    <span class="keyword">struct </span>AllocationInfo</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;    {</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;        VmaAllocation m_hAllocation;</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;        VkBool32* m_pChanged;</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;        AllocationInfo() :</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;            m_pChanged(VMA_NULL)</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;        {</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;        }</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;    };</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;    <span class="keyword">struct </span>AllocationInfoSizeGreater</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160;    {</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo&amp; lhs, <span class="keyword">const</span> AllocationInfo&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;        }</div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160;    };</div><div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>&#160;</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>&#160;    <span class="comment">// Used between AddAllocation and Defragment.</span></div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>&#160;    VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>&#160;</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;    <span class="keyword">struct </span>BlockInfo</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160;    {</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160;            m_pBlock(VMA_NULL),</div><div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>&#160;            m_HasNonMovableAllocations(true),</div><div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>&#160;            m_Allocations(pAllocationCallbacks),</div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;            m_pMappedDataForDefragmentation(VMA_NULL)</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;        {</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;        }</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;        {</div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock-&gt;m_Metadata.GetAllocationCount();</div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160;        }</div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;</div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160;        <span class="keywordtype">void</span> SortAllocationsBySizeDescecnding()</div><div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>&#160;        {</div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div><div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>&#160;        }</div><div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>&#160;</div><div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>&#160;        VkResult EnsureMapping(VmaAllocator hAllocator, <span class="keywordtype">void</span>** ppMappedData);</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;        <span class="keywordtype">void</span> Unmap(VmaAllocator hAllocator);</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160;</div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160;        <span class="comment">// Not null if mapped for defragmentation only, not originally mapped.</span></div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;        <span class="keywordtype">void</span>* m_pMappedDataForDefragmentation;</div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160;    };</div><div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>&#160;</div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;    <span class="keyword">struct </span>BlockPointerLess</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;    {</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> VmaDeviceMemoryBlock* pRhsBlock)<span class="keyword"> const</span></div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;        }</div><div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div><div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div><div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>&#160;        }</div><div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>&#160;    };</div><div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;</div><div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>&#160;    <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div><div class="line"><a name="l03977"></a><span class="lineno"> 3977</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div><div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>&#160;    {</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div><div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;            {</div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>&#160;            }</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>&#160;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160;            {</div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160;            }</div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_pBlock-&gt;m_Metadata.GetSumFreeSize() &lt; pRhsBlockInfo-&gt;m_pBlock-&gt;m_Metadata.GetSumFreeSize())</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;            {</div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160;            }</div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>&#160;        }</div><div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160;    };</div><div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>&#160;</div><div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;    BlockInfoVector m_Blocks;</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;</div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;    VkResult DefragmentRound(</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;</div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;    VmaDefragmentator(</div><div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160;        VmaAllocator hAllocator,</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>&#160;</div><div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>&#160;    ~VmaDefragmentator();</div><div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>&#160;</div><div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>&#160;    VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div><div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;    uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;</div><div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>&#160;    <span class="keywordtype">void</span> AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged);</div><div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>&#160;</div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160;};</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;<span class="comment">// Main allocator object.</span></div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;{</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation;</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;    VkDevice m_hDevice;</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div><div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>&#160;    </div><div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>&#160;    <span class="comment">// Number of bytes free out of limit, or VK_WHOLE_SIZE if not limit for that heap.</span></div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;    VkDeviceSize m_HeapSizeLimit[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;    VMA_MUTEX m_HeapSizeLimitMutex;</div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;    <span class="comment">// Default pools.</span></div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160;    <span class="comment">// Each vector is sorted by memory (handle value).</span></div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;    VMA_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;</div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160;    VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;    ~VmaAllocator_T();</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;    }</div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&amp; GetVulkanFunctions()<span class="keyword"> const</span></div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</div><div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>&#160;    }</div><div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>&#160;</div><div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160;            static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;    }</div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;</div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;</div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div><div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>&#160;    }</div><div class="line"><a name="l04079"></a><span class="lineno"> 4079</span>&#160;</div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;        VkImage hImage,</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;    <span class="comment">// Main allocation function.</span></div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;    VkResult AllocateMemory(</div><div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;        VmaAllocation* pAllocation);</div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160;</div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>&#160;    <span class="comment">// Main deallocation function.</span></div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160;    <span class="keywordtype">void</span> FreeMemory(<span class="keyword">const</span> VmaAllocation allocation);</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160;    <span class="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;</div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>&#160;</div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;        VmaAllocation* pAllocations,</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;        VkBool32* pAllocationsChanged,</div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* pDefragmentationInfo,</div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160;</div><div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>&#160;    <span class="keywordtype">void</span> GetAllocationInfo(VmaAllocation hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;    <span class="keywordtype">bool</span> TouchAllocation(VmaAllocation hAllocation);</div><div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>&#160;</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160;    VkResult CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, VmaPool* pPool);</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;    <span class="keywordtype">void</span> DestroyPool(VmaPool pool);</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(VmaPool pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;        VmaPool hPool,</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;</div><div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>&#160;    <span class="keywordtype">void</span> CreateLostAllocation(VmaAllocation* pAllocation);</div><div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>&#160;</div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>&#160;</div><div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>&#160;    VkResult Map(VmaAllocation hAllocation, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;    <span class="keywordtype">void</span> Unmap(VmaAllocation hAllocation);</div><div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160;</div><div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l04141"></a><span class="lineno"> 4141</span>&#160;</div><div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>&#160;    VkPhysicalDevice m_PhysicalDevice;</div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div><div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>&#160;    </div><div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>&#160;    VMA_MUTEX m_PoolsMutex;</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div><div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>&#160;</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160;</div><div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160;</div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160;    VkResult AllocateMemoryOfType(</div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160;        VmaAllocation* pAllocation);</div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;</div><div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for single allocation.</span></div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>&#160;    VkResult AllocateDedicatedMemory(</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;        <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>&#160;        VmaAllocation* pAllocation);</div><div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>&#160;</div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;    <span class="comment">// Tries to free pMemory as Dedicated Memory. Returns true if found and freed.</span></div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;    <span class="keywordtype">void</span> FreeDedicatedMemory(VmaAllocation allocation);</div><div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>&#160;};</div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;</div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160;</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(VmaAllocator hAllocator, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;{</div><div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</div><div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>&#160;}</div><div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>&#160;</div><div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(VmaAllocator hAllocator, <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>&#160;{</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160;}</div><div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>&#160;</div><div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;<span class="keyword">static</span> T* VmaAllocate(VmaAllocator hAllocator)</div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160;{</div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;}</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;</div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(VmaAllocator hAllocator, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;{</div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div><div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>&#160;}</div><div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>&#160;</div><div class="line"><a name="l04206"></a><span class="lineno"> 4206</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(VmaAllocator hAllocator, T* ptr)</div><div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>&#160;{</div><div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160;    {</div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;        ptr-&gt;~T();</div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;    }</div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;}</div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(VmaAllocator hAllocator, T* ptr, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160;{</div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;    {</div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>&#160;    }</div><div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160;}</div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;<span class="comment">// VmaStringBuilder</span></div><div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>&#160;</div><div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160;</div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160;<span class="keyword">class </span>VmaStringBuilder</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;{</div><div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160;    VmaStringBuilder(VmaAllocator alloc) : m_Data(VmaStlAllocator&lt;char&gt;(alloc-&gt;GetAllocationCallbacks())) { }</div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;    <span class="keywordtype">size_t</span> GetLength()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.size(); }</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* GetData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.data(); }</div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160;</div><div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keywordtype">char</span> ch) { m_Data.push_back(ch); }</div><div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div><div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div><div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160;    <span class="keywordtype">void</span> AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>&#160;</div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;};</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;</div><div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>&#160;{</div><div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</div><div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;    {</div><div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div><div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>&#160;        m_Data.resize(oldCount + strLen);</div><div class="line"><a name="l04257"></a><span class="lineno"> 4257</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</div><div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>&#160;    }</div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;}</div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;</div><div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div><div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160;{</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;    <span class="keywordtype">char</span> buf[11];</div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;    VmaUint32ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;    Add(buf);</div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;}</div><div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160;</div><div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div><div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>&#160;{</div><div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;    VmaUint64ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;    Add(buf);</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;}</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;</div><div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>&#160;{</div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div><div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;    Add(buf);</div><div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;}</div><div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>&#160;</div><div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>&#160;</div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;<span class="comment">// VmaJsonWriter</span></div><div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>&#160;</div><div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>&#160;</div><div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;{</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;    ~VmaJsonWriter();</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160;</div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;    <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160;    <span class="keywordtype">void</span> EndObject();</div><div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>&#160;    </div><div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>&#160;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;    <span class="keywordtype">void</span> EndArray();</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160;    </div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;    <span class="keywordtype">void</span> BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>&#160;    <span class="keywordtype">void</span> ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;    <span class="keywordtype">void</span> ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>&#160;    <span class="keywordtype">void</span> EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div><div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>&#160;    </div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div><div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>&#160;    <span class="keywordtype">void</span> WriteNull();</div><div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>&#160;</div><div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> INDENT;</div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>&#160;</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;    {</div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;        COLLECTION_TYPE_OBJECT,</div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;        COLLECTION_TYPE_ARRAY,</div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160;    };</div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;    <span class="keyword">struct </span>StackItem</div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160;    {</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160;        COLLECTION_TYPE type;</div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;        uint32_t valueCount;</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</div><div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160;    };</div><div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>&#160;</div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>&#160;    VmaStringBuilder&amp; m_SB;</div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;</div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;    <span class="keywordtype">void</span> WriteIndent(<span class="keywordtype">bool</span> oneLess = <span class="keyword">false</span>);</div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;};</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;</div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> VmaJsonWriter::INDENT = <span class="stringliteral">&quot;  &quot;</span>;</div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;</div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div><div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160;    m_SB(sb),</div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160;    m_InsideString(false)</div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;{</div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>&#160;}</div><div class="line"><a name="l04345"></a><span class="lineno"> 4345</span>&#160;</div><div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>&#160;VmaJsonWriter::~VmaJsonWriter()</div><div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>&#160;{</div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;    VMA_ASSERT(m_Stack.empty());</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160;}</div><div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>&#160;</div><div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160;{</div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160;</div><div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</div><div class="line"><a name="l04358"></a><span class="lineno"> 4358</span>&#160;</div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>&#160;    StackItem item;</div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div><div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>&#160;}</div><div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>&#160;</div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;{</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>&#160;</div><div class="line"><a name="l04370"></a><span class="lineno"> 4370</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l04371"></a><span class="lineno"> 4371</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</div><div class="line"><a name="l04372"></a><span class="lineno"> 4372</span>&#160;</div><div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div><div class="line"><a name="l04374"></a><span class="lineno"> 4374</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;}</div><div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>&#160;</div><div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>&#160;{</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div><div class="line"><a name="l04383"></a><span class="lineno"> 4383</span>&#160;</div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>&#160;    StackItem item;</div><div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160;}</div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div><div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>&#160;{</div><div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;</div><div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div><div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>&#160;</div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>&#160;}</div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160;</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160;{</div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;    BeginString(pStr);</div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>&#160;    EndString();</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>&#160;}</div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;</div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>&#160;{</div><div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160;</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;    BeginValue(<span class="keyword">true</span>);</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160;    {</div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;    }</div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;}</div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;</div><div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160;{</div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160;</div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; strLen; ++i)</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160;    {</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\&#39;&#39;</span>)</div><div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>&#160;        {</div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</div><div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>&#160;        }</div><div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;&quot;&#39;</span>)</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160;        {</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</div><div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160;        }</div><div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</div><div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160;        {</div><div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160;            m_SB.Add(ch);</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>&#160;        }</div><div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160;        {</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div><div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;        }</div><div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>&#160;    }</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;}</div><div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160;</div><div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div><div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>&#160;{</div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;}</div><div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160;</div><div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160;{</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>&#160;}</div><div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160;</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>&#160;{</div><div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;    m_SB.AddPointer(ptr);</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160;}</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;</div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;{</div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160;    {</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;    }</div><div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>&#160;    m_InsideString = <span class="keyword">false</span>;</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160;}</div><div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>&#160;</div><div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;{</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160;}</div><div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>&#160;</div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;{</div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>&#160;}</div><div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>&#160;</div><div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div><div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>&#160;{</div><div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;    m_SB.Add(b ? <span class="stringliteral">&quot;true&quot;</span> : <span class="stringliteral">&quot;false&quot;</span>);</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;}</div><div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>&#160;</div><div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</div><div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160;{</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;}</div><div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160;</div><div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div><div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160;{</div><div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty())</div><div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160;    {</div><div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160;        StackItem&amp; currItem = m_Stack.back();</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;            currItem.valueCount % 2 == 0)</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;        {</div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;            VMA_ASSERT(isString);</div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;        }</div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160;</div><div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160;            currItem.valueCount % 2 != 0)</div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160;        {</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;        }</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160;        {</div><div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div><div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160;            WriteIndent();</div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;        }</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>&#160;        {</div><div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>&#160;            WriteIndent();</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160;        }</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;        ++currItem.valueCount;</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;    }</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;}</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;{</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;    {</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;        m_SB.AddNewLine();</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;        </div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</div><div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>&#160;        {</div><div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>&#160;            --count;</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;        }</div><div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</div><div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160;        {</div><div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>&#160;            m_SB.Add(INDENT);</div><div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160;        }</div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160;    }</div><div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160;}</div><div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160;</div><div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::SetUserData(VmaAllocator hAllocator, <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;{</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;    {</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div><div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;</div><div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;        FreeUserDataString(hAllocator);</div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;</div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;        {</div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrSrc = (<span class="keywordtype">char</span>*)pUserData;</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> newStrLen = strlen(newStrSrc);</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;            <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrDst = vma_new_array(hAllocator, <span class="keywordtype">char</span>, newStrLen + 1);</div><div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;            memcpy(newStrDst, newStrSrc, newStrLen + 1);</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;            m_pUserData = newStrDst;</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;        }</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160;    }</div><div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;    {</div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;        m_pUserData = pUserData;</div><div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>&#160;    }</div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;}</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;</div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;    VmaAllocator hAllocator,</div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;    VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;    VkDeviceSize offset)</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160;{</div><div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>&#160;    VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;    {</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div><div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;            ++mapRefCount;</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160;    }</div><div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>&#160;</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;    m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160;    m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160;}</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;    {</div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;    }</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;}</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160;</div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160;    {</div><div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;m_hMemory;</div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160;    }</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160;}</div><div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;uint32_t VmaAllocation_T::GetMemoryTypeIndex()<span class="keyword"> const</span></div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;    {</div><div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;m_MemoryTypeIndex;</div><div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_MemoryTypeIndex;</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160;        <span class="keywordflow">return</span> UINT32_MAX;</div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>&#160;    }</div><div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;}</div><div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>&#160;</div><div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;    {</div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>&#160;        {</div><div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;m_Mapping.GetMappedData();</div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;        }</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160;        {</div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;            <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;        }</div><div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;    }</div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;}</div><div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>&#160;</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>&#160;    {</div><div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div><div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;    }</div><div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>&#160;}</div><div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>&#160;</div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;VmaPool VmaAllocation_T::GetPool()<span class="keyword"> const</span></div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;    <span class="keywordflow">return</span> m_BlockAllocation.m_hPool;</div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;}</div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;</div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>&#160;{</div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160;    VMA_ASSERT(CanBecomeLost());</div><div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160;</div><div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;    {</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;        {</div><div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;        }</div><div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</div><div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160;        {</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160;        }</div><div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>&#160;        {</div><div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>&#160;            <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;            {</div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;                <span class="comment">// Setting hAllocation.LastUseFrameIndex atomic to VMA_FRAME_INDEX_LOST is enough to mark it as LOST.</span></div><div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04731"></a><span class="lineno"> 4731</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160;            }</div><div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>&#160;        }</div><div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>&#160;    }</div><div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>&#160;}</div><div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>&#160;</div><div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(VmaAllocator hAllocator)</div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;{</div><div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>&#160;    VMA_ASSERT(IsUserDataString());</div><div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>&#160;    {</div><div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>&#160;        <span class="keywordtype">char</span>* <span class="keyword">const</span> oldStr = (<span class="keywordtype">char</span>*)m_pUserData;</div><div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldStrLen = strlen(oldStr);</div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;        vma_delete_array(hAllocator, oldStr, oldStrLen + 1);</div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;        m_pUserData = VMA_NULL;</div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160;    }</div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;}</div><div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160;</div><div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;{</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160;    {</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;        ++m_MapCount;</div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;    }</div><div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160;    {</div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160;    }</div><div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>&#160;}</div><div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>&#160;</div><div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div><div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160;{</div><div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;    {</div><div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160;        --m_MapCount;</div><div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160;    }</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;    {</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;    }</div><div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160;}</div><div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160;</div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;VkResult VmaAllocation_T::DedicatedAllocMap(VmaAllocator hAllocator, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;{</div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;</div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;    {</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;        <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160;        {</div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>&#160;            ++m_MapCount;</div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160;        }</div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;        {</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;        }</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;    }</div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160;    {</div><div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;            m_DedicatedAllocation.m_hMemory,</div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;            ppData);</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>&#160;        {</div><div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>&#160;            m_DedicatedAllocation.m_pMappedData = *ppData;</div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;            m_MapCount = 1;</div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160;        }</div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;    }</div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;}</div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;</div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(VmaAllocator hAllocator)</div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;{</div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;    {</div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;        --m_MapCount;</div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;        {</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160;                hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;                m_DedicatedAllocation.m_hMemory);</div><div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160;        }</div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;    }</div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160;    {</div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>&#160;    }</div><div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>&#160;}</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;</div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_SUBALLOCATION_TYPE_NAMES[] = {</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;};</div><div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160;</div><div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPrintStatInfo(VmaJsonWriter&amp; json, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; stat)</div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;{</div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;    json.BeginObject();</div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;</div><div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div><div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;</div><div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>&#160;</div><div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;</div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div><div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;</div><div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;</div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 1)</div><div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;    {</div><div class="line"><a name="l04868"></a><span class="lineno"> 4868</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div><div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;        json.EndObject();</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;    }</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 1)</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;    {</div><div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;        json.EndObject();</div><div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160;    }</div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160;    json.EndObject();</div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>&#160;}</div><div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>&#160;</div><div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160;</div><div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;{</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;    }</div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div><div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160;    }</div><div class="line"><a name="l04911"></a><span class="lineno"> 4911</span>&#160;};</div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160;</div><div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>&#160;<span class="comment">// class VmaBlockMetadata</span></div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160;</div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160;VmaBlockMetadata::VmaBlockMetadata(VmaAllocator hAllocator) :</div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;    m_Size(0),</div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;    m_FreeCount(0),</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160;{</div><div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>&#160;}</div><div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>&#160;</div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;VmaBlockMetadata::~VmaBlockMetadata()</div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160;{</div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160;}</div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160;</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Init(VkDeviceSize size)</div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;{</div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;    m_Size = size;</div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160;    m_FreeCount = 1;</div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160;    m_SumFreeSize = size;</div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;</div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;    VmaSuballocation suballoc = {};</div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;    suballoc.offset = 0;</div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160;    suballoc.size = size;</div><div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;</div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;    m_Suballocations.push_back(suballoc);</div><div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div><div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>&#160;    --suballocItem;</div><div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</div><div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160;}</div><div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>&#160;</div><div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;    <span class="keywordflow">if</span>(m_Suballocations.empty())</div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160;    {</div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;    }</div><div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160;    </div><div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;    <span class="comment">// Expected offset of new suballocation as calculates from previous ones.</span></div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;    VkDeviceSize calculatedOffset = 0;</div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;    uint32_t calculatedFreeCount = 0;</div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;    <span class="comment">// True if previous visisted suballocation was free.</span></div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;        ++suballocItem)</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;    {</div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;        </div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160;        <span class="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;        <span class="keywordflow">if</span>(subAlloc.offset != calculatedOffset)</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;        {</div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;        }</div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;</div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;        <span class="keywordflow">if</span>(prevFree &amp;&amp; currFree)</div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;        {</div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;        }</div><div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160;</div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160;        <span class="keywordflow">if</span>(currFree != (subAlloc.hAllocation == VK_NULL_HANDLE))</div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;        {</div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;        }</div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;</div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;        <span class="keywordflow">if</span>(currFree)</div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;        {</div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;            calculatedSumFreeSize += subAlloc.size;</div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;            ++calculatedFreeCount;</div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;            {</div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;                ++freeSuballocationsToRegister;</div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;            }</div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;        }</div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;        {</div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;            <span class="keywordflow">if</span>(subAlloc.hAllocation-&gt;GetOffset() != subAlloc.offset)</div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160;            {</div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;            }</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;            <span class="keywordflow">if</span>(subAlloc.hAllocation-&gt;GetSize() != subAlloc.size)</div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;            {</div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;            }</div><div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160;        }</div><div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160;</div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160;        calculatedOffset += subAlloc.size;</div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;        prevFree = currFree;</div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;    }</div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;</div><div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div><div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>&#160;    <span class="comment">// match expected one.</span></div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160;    <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.size() != freeSuballocationsToRegister)</div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>&#160;    {</div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;    }</div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;</div><div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_FreeSuballocationsBySize.size(); ++i)</div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;    {</div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;        </div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;        <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;        {</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;        }</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;size &lt; lastSize)</div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160;        {</div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;        }</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;</div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;        lastSize = suballocItem-&gt;size;</div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;    }</div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;</div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;    <span class="comment">// Check if totals match calculacted values.</span></div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;    <span class="keywordflow">if</span>(!ValidateFreeSuballocationList() ||</div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;        (calculatedOffset != m_Size) ||</div><div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160;        (calculatedSumFreeSize != m_SumFreeSize) ||</div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;        (calculatedFreeCount != m_FreeCount))</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;    {</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;    }</div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;</div><div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>&#160;}</div><div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160;</div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;VkDeviceSize VmaBlockMetadata::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;    {</div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;        <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;    }</div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;    {</div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160;    }</div><div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>&#160;}</div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::IsEmpty()<span class="keyword"> const</span></div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;}</div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div><div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>&#160;    </div><div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div><div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>&#160;</div><div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>&#160;</div><div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>&#160;    {</div><div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;        {</div><div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div><div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div><div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;        }</div><div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;        {</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, suballoc.size);</div><div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, suballoc.size);</div><div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160;        }</div><div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>&#160;    }</div><div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>&#160;}</div><div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;</div><div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;</div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += m_Size;</div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div><div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>&#160;}</div><div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>&#160;</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;</div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;    json.BeginObject();</div><div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;</div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;    json.WriteNumber(m_Size);</div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;</div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;    json.WriteNumber(m_SumFreeSize);</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160;</div><div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>&#160;    json.WriteNumber((uint64_t)m_Suballocations.size() - m_FreeCount);</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160;</div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160;    json.WriteNumber(m_FreeCount);</div><div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160;</div><div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;    json.BeginArray();</div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;    <span class="keywordtype">size_t</span> i = 0;</div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;        ++suballocItem, ++i)</div><div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;    {</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;        </div><div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;        json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[suballocItem-&gt;type]);</div><div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>&#160;</div><div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160;        json.WriteNumber(suballocItem-&gt;size);</div><div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160;</div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;        json.WriteNumber(suballocItem-&gt;offset);</div><div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160;</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;        {</div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData = suballocItem-&gt;hAllocation-&gt;GetUserData();</div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;            <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;            {</div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;                json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160;                <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;IsUserDataString())</div><div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160;                {</div><div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160;                    json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData);</div><div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160;                }</div><div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160;                {</div><div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160;                    json.BeginString();</div><div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160;                    json.ContinueString_Pointer(pUserData);</div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;                    json.EndString();</div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;                }</div><div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160;            }</div><div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160;        }</div><div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160;</div><div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160;        json.EndObject();</div><div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;    }</div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;    json.EndArray();</div><div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160;</div><div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;    json.EndObject();</div><div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160;}</div><div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160;</div><div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160;<span class="comment">How many suitable free suballocations to analyze before choosing best one.</span></div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;<span class="comment">- Set to 1 to use First-Fit algorithm - first suitable free suballocation will</span></div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;<span class="comment">  be chosen.</span></div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;<span class="comment">- Set to UINT32_MAX to use Best-Fit/Worst-Fit algorithm - all suitable free</span></div><div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160;<span class="comment">  suballocations will be analized and best one will be chosen.</span></div><div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;<span class="comment">- Any other value is also acceptable.</span></div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160;<span class="comment">//static const uint32_t MAX_SUITABLE_SUBALLOCATIONS_TO_CHECK = 8;</span></div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;</div><div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::CreateFirstAllocationRequest(VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160;{</div><div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160;    VMA_ASSERT(IsEmpty());</div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;    pAllocationRequest-&gt;offset = 0;</div><div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;    pAllocationRequest-&gt;sumFreeSize = m_SumFreeSize;</div><div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;    pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;    pAllocationRequest-&gt;item = m_Suballocations.begin();</div><div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;    pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;}</div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::CreateAllocationRequest(</div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160;{</div><div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160;</div><div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>&#160;    <span class="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div><div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp; m_SumFreeSize &lt; allocSize)</div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160;    {</div><div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;    }</div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;</div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;    <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div><div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</div><div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160;    {</div><div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;        <span class="keywordflow">if</span>(VMA_BEST_FIT)</div><div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>&#160;        {</div><div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>&#160;            <span class="comment">// Find first free suballocation with size not less than allocSize.</span></div><div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;                m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div><div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;                allocSize,</div><div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;                VmaSuballocationItemSizeLess());</div><div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</div><div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160;            {</div><div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;                    allocSize,</div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;                    allocAlignment,</div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;                    allocType,</div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>&#160;                {</div><div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160;                }</div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;            }</div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;        }</div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;        {</div><div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>&#160;            <span class="comment">// Search staring from biggest suballocations.</span></div><div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div><div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>&#160;            {</div><div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>&#160;                    allocSize,</div><div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160;                    allocAlignment,</div><div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160;                    allocType,</div><div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>&#160;                {</div><div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;                }</div><div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160;            }</div><div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;        }</div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;    }</div><div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;</div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;    {</div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;        <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;</div><div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;        pAllocationRequest-&gt;sumFreeSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;        pAllocationRequest-&gt;sumItemSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;</div><div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div><div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;            suballocIt != m_Suballocations.end();</div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;            ++suballocIt)</div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;        {</div><div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;            <span class="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div><div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;            {</div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;                    allocSize,</div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;                    allocAlignment,</div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;                    allocType,</div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;                    suballocIt,</div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;                    &amp;tmpAllocRequest.offset,</div><div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div><div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;                {</div><div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;                    tmpAllocRequest.item = suballocIt;</div><div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>&#160;</div><div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160;                    <span class="keywordflow">if</span>(tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost())</div><div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;                    {</div><div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;                    }</div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;                }</div><div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160;            }</div><div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160;        }</div><div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>&#160;</div><div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;sumItemSize != VK_WHOLE_SIZE)</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160;        {</div><div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>&#160;        }</div><div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160;    }</div><div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>&#160;</div><div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160;}</div><div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>&#160;</div><div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::MakeRequestedAllocationsLost(</div><div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;{</div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;    <span class="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;    {</div><div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;        {</div><div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160;            ++pAllocationRequest-&gt;item;</div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160;        }</div><div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;        {</div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div><div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;        }</div><div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;        {</div><div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>&#160;        }</div><div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>&#160;    }</div><div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>&#160;</div><div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;    </div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>&#160;}</div><div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>&#160;</div><div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160;uint32_t VmaBlockMetadata::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160;{</div><div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;        ++it)</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;    {</div><div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;        {</div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;            it = FreeSuballocation(it);</div><div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>&#160;            ++lostAllocationCount;</div><div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>&#160;        }</div><div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160;    }</div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;}</div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;</div><div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Alloc(</div><div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160;    VmaAllocation hAllocation)</div><div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160;{</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div><div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div><div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div><div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div><div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div><div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div><div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;</div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;    <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;    <span class="comment">// it to become used.</span></div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;    UnregisterFreeSuballocation(request.item);</div><div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160;</div><div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>&#160;    suballoc.offset = request.offset;</div><div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160;    suballoc.size = allocSize;</div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;    suballoc.type = type;</div><div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;    suballoc.hAllocation = hAllocation;</div><div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>&#160;</div><div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;    <span class="comment">// If there are any free bytes remaining at the end, insert new free suballocation after current one.</span></div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</div><div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;    {</div><div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div><div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;        paddingSuballoc.size = paddingEnd;</div><div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;        VmaSuballocationList::iterator next = request.item;</div><div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;        ++next;</div><div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div><div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div><div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</div><div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>&#160;    }</div><div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;</div><div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160;    <span class="comment">// If there are any free bytes remaining at the beginning, insert new free suballocation before current one.</span></div><div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div><div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;    {</div><div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div><div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>&#160;        paddingSuballoc.size = paddingBegin;</div><div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div><div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div><div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</div><div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;    }</div><div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160;</div><div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>&#160;    m_FreeCount = m_FreeCount - 1;</div><div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</div><div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160;    {</div><div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>&#160;    }</div><div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>&#160;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</div><div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;    {</div><div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;    }</div><div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;}</div><div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;</div><div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Free(<span class="keyword">const</span> VmaAllocation allocation)</div><div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;{</div><div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;    {</div><div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div><div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>&#160;        {</div><div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160;        }</div><div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;    }</div><div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;}</div><div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>&#160;</div><div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::FreeAtOffset(VkDeviceSize offset)</div><div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;{</div><div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>&#160;    {</div><div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</div><div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;        {</div><div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160;        }</div><div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;    }</div><div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;}</div><div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;</div><div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::ValidateFreeSuballocationList()<span class="keyword"> const</span></div><div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_FreeSuballocationsBySize.size(); i &lt; count; ++i)</div><div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;    {</div><div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;</div><div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>&#160;        {</div><div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>&#160;        }</div><div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>&#160;        <span class="keywordflow">if</span>(it-&gt;size &lt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>&#160;        {</div><div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>&#160;        }</div><div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;        <span class="keywordflow">if</span>(it-&gt;size &lt; lastSize)</div><div class="line"><a name="l05493"></a><span class="lineno"> 5493</span>&#160;        {</div><div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;        }</div><div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;</div><div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>&#160;        lastSize = it-&gt;size;</div><div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>&#160;    }</div><div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;}</div><div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>&#160;</div><div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::CheckAllocation(</div><div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;    VkDeviceSize* pOffset,</div><div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>&#160;    VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l05515"></a><span class="lineno"> 5515</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div><div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div><div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</div><div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;    </div><div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;    *itemsToMakeLostCount = 0;</div><div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>&#160;    *pSumFreeSize = 0;</div><div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>&#160;    *pSumItemSize = 0;</div><div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>&#160;</div><div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>&#160;    {</div><div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;        {</div><div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>&#160;            *pSumFreeSize = suballocItem-&gt;size;</div><div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>&#160;        }</div><div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>&#160;        {</div><div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>&#160;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>&#160;            {</div><div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>&#160;                ++*itemsToMakeLostCount;</div><div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</div><div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;            }</div><div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160;            {</div><div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>&#160;            }</div><div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>&#160;        }</div><div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;</div><div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div><div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;        <span class="keywordflow">if</span>(m_Size - suballocItem-&gt;offset &lt; allocSize)</div><div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>&#160;        {</div><div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;        }</div><div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;</div><div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>&#160;        *pOffset = suballocItem-&gt;offset;</div><div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>&#160;    </div><div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>&#160;        <span class="keywordflow">if</span>((VMA_DEBUG_MARGIN &gt; 0) &amp;&amp; suballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160;        {</div><div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;        }</div><div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>&#160;    </div><div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = VMA_MAX(allocAlignment, static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_ALIGNMENT));</div><div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;        *pOffset = VmaAlignUp(*pOffset, alignment);</div><div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>&#160;</div><div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160;        {</div><div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;            {</div><div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;                {</div><div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>&#160;                    {</div><div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;                    }</div><div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160;                }</div><div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160;            }</div><div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;            {</div><div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l05590"></a><span class="lineno"> 5590</span>&#160;            }</div><div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>&#160;        }</div><div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>&#160;    </div><div class="line"><a name="l05593"></a><span class="lineno"> 5593</span>&#160;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div><div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;        <span class="comment">// If yes, return false - this function should be called for another suballocItem as starting point.</span></div><div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</div><div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;        {</div><div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05598"></a><span class="lineno"> 5598</span>&#160;        }</div><div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>&#160;    </div><div class="line"><a name="l05600"></a><span class="lineno"> 5600</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div><div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>&#160;</div><div class="line"><a name="l05603"></a><span class="lineno"> 5603</span>&#160;        <span class="comment">// Calculate required margin at the end if this is not last suballocation.</span></div><div class="line"><a name="l05604"></a><span class="lineno"> 5604</span>&#160;        VmaSuballocationList::const_iterator next = suballocItem;</div><div class="line"><a name="l05605"></a><span class="lineno"> 5605</span>&#160;        ++next;</div><div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin =</div><div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>&#160;            (next != m_Suballocations.cend()) ? VMA_DEBUG_MARGIN : 0;</div><div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>&#160;</div><div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>&#160;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div><div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>&#160;        <span class="comment">// Another early return check.</span></div><div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; m_Size)</div><div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>&#160;        {</div><div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>&#160;        }</div><div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>&#160;</div><div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div><div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div><div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div><div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</div><div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;        {</div><div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>&#160;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div><div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</div><div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160;            {</div><div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;                ++lastSuballocItem;</div><div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div><div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;                {</div><div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>&#160;                }</div><div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>&#160;                {</div><div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>&#160;                    *pSumFreeSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>&#160;                }</div><div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;                {</div><div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>&#160;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;                    {</div><div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;                        ++*itemsToMakeLostCount;</div><div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;                    }</div><div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>&#160;                    {</div><div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;                    }</div><div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;                }</div><div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div><div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div><div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>&#160;            }</div><div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>&#160;        }</div><div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;</div><div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;        {</div><div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div><div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;            {</div><div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;                {</div><div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;                    {</div><div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;                        {</div><div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;                            ++*itemsToMakeLostCount;</div><div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;                        }</div><div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>&#160;                        {</div><div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>&#160;                        }</div><div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>&#160;                    }</div><div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;                }</div><div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>&#160;                {</div><div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;                }</div><div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>&#160;            }</div><div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;        }</div><div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;    }</div><div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;    {</div><div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>&#160;</div><div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;        *pSumFreeSize = suballoc.size;</div><div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;</div><div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div><div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</div><div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;        {</div><div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;        }</div><div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>&#160;</div><div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;        *pOffset = suballoc.offset;</div><div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;    </div><div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;        <span class="keywordflow">if</span>((VMA_DEBUG_MARGIN &gt; 0) &amp;&amp; suballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>&#160;        {</div><div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160;        }</div><div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;    </div><div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = VMA_MAX(allocAlignment, static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_ALIGNMENT));</div><div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;        *pOffset = VmaAlignUp(*pOffset, alignment);</div><div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;    </div><div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;        {</div><div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;            {</div><div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;                {</div><div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;                    {</div><div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;                    }</div><div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;                }</div><div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160;            }</div><div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;            {</div><div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;            }</div><div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>&#160;        }</div><div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>&#160;    </div><div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div><div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>&#160;</div><div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>&#160;        <span class="comment">// Calculate required margin at the end if this is not last suballocation.</span></div><div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;        VmaSuballocationList::const_iterator next = suballocItem;</div><div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;        ++next;</div><div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin =</div><div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;            (next != m_Suballocations.cend()) ? VMA_DEBUG_MARGIN : 0;</div><div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160;</div><div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>&#160;        <span class="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div><div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div><div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;        {</div><div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;        }</div><div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160;</div><div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>&#160;        {</div><div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div><div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;            {</div><div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;                {</div><div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;                    {</div><div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;                    }</div><div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>&#160;                }</div><div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>&#160;                {</div><div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;                }</div><div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>&#160;            }</div><div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160;        }</div><div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;    }</div><div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;</div><div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;    <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div><div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>&#160;}</div><div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>&#160;</div><div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::MergeFreeWithNext(VmaSuballocationList::iterator item)</div><div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>&#160;{</div><div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div><div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>&#160;    </div><div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>&#160;    VmaSuballocationList::iterator nextItem = item;</div><div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;    ++nextItem;</div><div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div><div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;</div><div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;    item-&gt;size += nextItem-&gt;size;</div><div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;    m_Suballocations.erase(nextItem);</div><div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160;}</div><div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;</div><div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160;VmaSuballocationList::iterator VmaBlockMetadata::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div><div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>&#160;{</div><div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;    <span class="comment">// Change this suballocation to be marked as free.</span></div><div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>&#160;    </div><div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;    m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>&#160;</div><div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>&#160;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div><div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div><div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div><div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;    </div><div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div><div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>&#160;    ++nextItem;</div><div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>&#160;    <span class="keywordflow">if</span>((nextItem != m_Suballocations.end()) &amp;&amp; (nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE))</div><div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;    {</div><div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</div><div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>&#160;    }</div><div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>&#160;</div><div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160;    VmaSuballocationList::iterator prevItem = suballocItem;</div><div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div><div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160;    {</div><div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>&#160;        --prevItem;</div><div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;        {</div><div class="line"><a name="l05828"></a><span class="lineno"> 5828</span>&#160;            mergeWithPrev = <span class="keyword">true</span>;</div><div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>&#160;        }</div><div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160;    }</div><div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;</div><div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</div><div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160;    {</div><div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>&#160;        UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160;        MergeFreeWithNext(suballocItem);</div><div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;    }</div><div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;</div><div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</div><div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>&#160;    {</div><div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>&#160;        UnregisterFreeSuballocation(prevItem);</div><div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;        MergeFreeWithNext(prevItem);</div><div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;        RegisterFreeSuballocation(prevItem);</div><div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>&#160;        <span class="keywordflow">return</span> prevItem;</div><div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>&#160;    }</div><div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>&#160;    {</div><div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>&#160;        RegisterFreeSuballocation(suballocItem);</div><div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160;        <span class="keywordflow">return</span> suballocItem;</div><div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;    }</div><div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160;}</div><div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;</div><div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;{</div><div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>&#160;</div><div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>&#160;</div><div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;    {</div><div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;        <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</div><div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;        {</div><div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;            m_FreeSuballocationsBySize.push_back(item);</div><div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;        }</div><div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>&#160;        {</div><div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</div><div class="line"><a name="l05870"></a><span class="lineno"> 5870</span>&#160;        }</div><div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>&#160;    }</div><div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;</div><div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>&#160;}</div><div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>&#160;</div><div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>&#160;</div><div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;{</div><div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;</div><div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160;</div><div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160;    {</div><div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>&#160;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>&#160;            m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div><div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>&#160;            item,</div><div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160;            VmaSuballocationItemSizeLess());</div><div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;            ++index)</div><div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>&#160;        {</div><div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;            <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div><div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;            {</div><div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div><div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>&#160;            }</div><div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>&#160;            VMA_ASSERT((m_FreeSuballocationsBySize[index]-&gt;size == item-&gt;size) &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div><div class="line"><a name="l05903"></a><span class="lineno"> 5903</span>&#160;        }</div><div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div><div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;    }</div><div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>&#160;</div><div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>&#160;}</div><div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>&#160;</div><div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160;<span class="comment">// class VmaDeviceMemoryMapping</span></div><div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;</div><div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>&#160;VmaDeviceMemoryMapping::VmaDeviceMemoryMapping() :</div><div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>&#160;    m_MapCount(0),</div><div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>&#160;    m_pMappedData(VMA_NULL)</div><div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;{</div><div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>&#160;}</div><div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>&#160;</div><div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>&#160;VmaDeviceMemoryMapping::~VmaDeviceMemoryMapping()</div><div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>&#160;{</div><div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>&#160;    VMA_ASSERT(m_MapCount == 0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being destroyed while it is still mapped.&quot;</span>);</div><div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>&#160;}</div><div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>&#160;</div><div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>&#160;VkResult VmaDeviceMemoryMapping::Map(VmaAllocator hAllocator, VkDeviceMemory hMemory, uint32_t count, <span class="keywordtype">void</span> **ppData)</div><div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>&#160;{</div><div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>&#160;    {</div><div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>&#160;    }</div><div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>&#160;</div><div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>&#160;    {</div><div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;        m_MapCount += count;</div><div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div><div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>&#160;        {</div><div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>&#160;            *ppData = m_pMappedData;</div><div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>&#160;        }</div><div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>&#160;    }</div><div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>&#160;    {</div><div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;            hMemory,</div><div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;            &amp;m_pMappedData);</div><div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>&#160;        {</div><div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>&#160;            {</div><div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>&#160;                *ppData = m_pMappedData;</div><div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>&#160;            }</div><div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>&#160;            m_MapCount = count;</div><div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>&#160;        }</div><div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;    }</div><div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;}</div><div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;</div><div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryMapping::Unmap(VmaAllocator hAllocator, VkDeviceMemory hMemory, uint32_t count)</div><div class="line"><a name="l05964"></a><span class="lineno"> 5964</span>&#160;{</div><div class="line"><a name="l05965"></a><span class="lineno"> 5965</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>&#160;    {</div><div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;    }</div><div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>&#160;</div><div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</div><div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;    {</div><div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;        m_MapCount -= count;</div><div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>&#160;        {</div><div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>&#160;            m_pMappedData = VMA_NULL;</div><div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, hMemory);</div><div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;        }</div><div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160;    }</div><div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>&#160;    {</div><div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being unmapped while it was not previously mapped.&quot;</span>);</div><div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>&#160;    }</div><div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>&#160;}</div><div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>&#160;</div><div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></div><div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;</div><div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(VmaAllocator hAllocator) :</div><div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div><div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div><div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>&#160;    m_Metadata(hAllocator)</div><div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>&#160;{</div><div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>&#160;}</div><div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>&#160;</div><div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div><div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;    uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>&#160;    VkDeviceMemory newMemory,</div><div class="line"><a name="l05999"></a><span class="lineno"> 5999</span>&#160;    VkDeviceSize newSize)</div><div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>&#160;{</div><div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>&#160;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>&#160;</div><div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div><div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>&#160;    m_hMemory = newMemory;</div><div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>&#160;</div><div class="line"><a name="l06006"></a><span class="lineno"> 6006</span>&#160;    m_Metadata.Init(newSize);</div><div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;}</div><div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>&#160;</div><div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Destroy(VmaAllocator allocator)</div><div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;{</div><div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div><div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div><div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160;    VMA_ASSERT(m_Metadata.IsEmpty() &amp;&amp; <span class="stringliteral">&quot;Some allocations were not freed before destruction of this memory block!&quot;</span>);</div><div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;    </div><div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_Metadata.GetSize(), m_hMemory);</div><div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;}</div><div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160;</div><div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>&#160;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160;    <span class="keywordflow">if</span>((m_hMemory == VK_NULL_HANDLE) ||</div><div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>&#160;        (m_Metadata.GetSize() == 0))</div><div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>&#160;    {</div><div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>&#160;    }</div><div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>&#160;    </div><div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>&#160;    <span class="keywordflow">return</span> m_Metadata.Validate();</div><div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>&#160;}</div><div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>&#160;</div><div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;VkResult VmaDeviceMemoryBlock::Map(VmaAllocator hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>&#160;{</div><div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>&#160;    <span class="keywordflow">return</span> m_Mapping.Map(hAllocator, m_hMemory, count, ppData);</div><div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>&#160;}</div><div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;</div><div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Unmap(VmaAllocator hAllocator, uint32_t count)</div><div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>&#160;{</div><div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>&#160;    m_Mapping.Unmap(hAllocator, m_hMemory, count);</div><div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>&#160;}</div><div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>&#160;</div><div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> InitStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div><div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>&#160;{</div><div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div><div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;}</div><div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>&#160;</div><div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>&#160;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div><div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaAddStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; srcInfo)</div><div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>&#160;{</div><div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;}</div><div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>&#160;</div><div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPostprocessCalcStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo)</div><div class="line"><a name="l06063"></a><span class="lineno"> 6063</span>&#160;{</div><div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 0) ?</div><div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>) : 0;</div><div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 0) ?</div><div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>) : 0;</div><div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;}</div><div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>&#160;</div><div class="line"><a name="l06070"></a><span class="lineno"> 6070</span>&#160;VmaPool_T::VmaPool_T(</div><div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>&#160;    VmaAllocator hAllocator,</div><div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo) :</div><div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;    m_BlockVector(</div><div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;        hAllocator,</div><div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;        createInfo.memoryTypeIndex,</div><div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;        createInfo.blockSize,</div><div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>&#160;        createInfo.minBlockCount,</div><div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>&#160;        createInfo.maxBlockCount,</div><div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;        (createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a>) != 0 ? 1 : hAllocator-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;        createInfo.frameInUseCount,</div><div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;        true) <span class="comment">// isCustomPool</span></div><div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160;{</div><div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160;}</div><div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>&#160;</div><div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>&#160;VmaPool_T::~VmaPool_T()</div><div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>&#160;{</div><div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>&#160;}</div><div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;</div><div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>&#160;</div><div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>&#160;</div><div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;VmaBlockVector::VmaBlockVector(</div><div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;    VmaAllocator hAllocator,</div><div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;    VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;    <span class="keywordtype">bool</span> isCustomPool) :</div><div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div><div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div><div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;    m_MinBlockCount(minBlockCount),</div><div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160;    m_MaxBlockCount(maxBlockCount),</div><div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div><div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160;    m_FrameInUseCount(frameInUseCount),</div><div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;    m_IsCustomPool(isCustomPool),</div><div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>&#160;    m_HasEmptyBlock(false),</div><div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;    m_pDefragmentator(VMA_NULL)</div><div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;{</div><div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;}</div><div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;</div><div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;VmaBlockVector::~VmaBlockVector()</div><div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>&#160;{</div><div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>&#160;    VMA_ASSERT(m_pDefragmentator == VMA_NULL);</div><div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;</div><div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>&#160;    {</div><div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>&#160;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;    }</div><div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;}</div><div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>&#160;</div><div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div><div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>&#160;{</div><div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_MinBlockCount; ++i)</div><div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;    {</div><div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div><div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>&#160;        {</div><div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>&#160;        }</div><div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;    }</div><div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;}</div><div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;</div><div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats)</div><div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>&#160;{</div><div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div><div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div><div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div><div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div><div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>&#160;</div><div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;</div><div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;    {</div><div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;        pBlock-&gt;m_Metadata.AddPoolStats(*pStats);</div><div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>&#160;    }</div><div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>&#160;}</div><div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>&#160;</div><div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div><div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;</div><div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>&#160;VkResult VmaBlockVector::Allocate(</div><div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>&#160;    VmaPool hCurrentPool,</div><div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>&#160;    VmaAllocation* pAllocation)</div><div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;{</div><div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div><div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0;</div><div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;</div><div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>&#160;</div><div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;    <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div><div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;    <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div><div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div><div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;    {</div><div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160;        VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>&#160;        VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>&#160;        <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>&#160;            currentFrameIndex,</div><div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;            m_FrameInUseCount,</div><div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160;            m_BufferImageGranularity,</div><div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;            vkMemReq.size,</div><div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;            vkMemReq.alignment,</div><div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>&#160;            suballocType,</div><div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>&#160;            <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>&#160;            &amp;currRequest))</div><div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>&#160;        {</div><div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;            <span class="comment">// Allocate from pCurrBlock.</span></div><div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;            VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;</div><div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;            <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>&#160;            {</div><div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>&#160;                VkResult res = pCurrBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>&#160;                {</div><div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>&#160;                }</div><div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>&#160;            }</div><div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>&#160;            </div><div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;            <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;            <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160;            {</div><div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>&#160;            }</div><div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>&#160;            </div><div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>&#160;            *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>&#160;            pCurrBlock-&gt;m_Metadata.Alloc(currRequest, suballocType, vkMemReq.size, *pAllocation);</div><div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>&#160;            (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>&#160;                hCurrentPool,</div><div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160;                pCurrBlock,</div><div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;                currRequest.offset,</div><div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;                suballocType,</div><div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;                mapped,</div><div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;                (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;            VMA_HEAVY_ASSERT(pCurrBlock-&gt;Validate());</div><div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing allocation #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>&#160;            (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;        }</div><div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>&#160;    }</div><div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>&#160;</div><div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div><div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0) &amp;&amp;</div><div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount);</div><div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160;</div><div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;    <span class="comment">// 2. Try to create new block.</span></div><div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;    <span class="keywordflow">if</span>(canCreateNewBlock)</div><div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>&#160;    {</div><div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>&#160;        <span class="comment">// Calculate optimal size for new block.</span></div><div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;        VkDeviceSize newBlockSize = m_PreferredBlockSize;</div><div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;        uint32_t newBlockSizeShift = 0;</div><div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;        <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div><div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160;</div><div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;        <span class="comment">// Allocating blocks of other sizes is allowed only in default pools.</span></div><div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;        <span class="comment">// In custom pools block size is fixed.</span></div><div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;        <span class="keywordflow">if</span>(m_IsCustomPool == <span class="keyword">false</span>)</div><div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160;        {</div><div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;            <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div><div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;            <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div><div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160;            <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div><div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>&#160;            {</div><div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>&#160;                <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;                <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= vkMemReq.size * 2)</div><div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>&#160;                {</div><div class="line"><a name="l06250"></a><span class="lineno"> 6250</span>&#160;                    newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>&#160;                    ++newBlockSizeShift;</div><div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>&#160;                }</div><div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;                {</div><div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>&#160;                }</div><div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>&#160;            }</div><div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>&#160;        }</div><div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>&#160;</div><div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;        <span class="keywordtype">size_t</span> newBlockIndex = 0;</div><div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;        VkResult res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160;        <span class="comment">// Allocation of this size failed? Try 1/2, 1/4, 1/8 of m_PreferredBlockSize.</span></div><div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;        <span class="keywordflow">if</span>(m_IsCustomPool == <span class="keyword">false</span>)</div><div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>&#160;        {</div><div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>&#160;            <span class="keywordflow">while</span>(res &lt; 0 &amp;&amp; newBlockSizeShift &lt; NEW_BLOCK_SIZE_SHIFT_MAX)</div><div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>&#160;            {</div><div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>&#160;                <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;                <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= vkMemReq.size)</div><div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;                {</div><div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;                    newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>&#160;                    ++newBlockSizeShift;</div><div class="line"><a name="l06272"></a><span class="lineno"> 6272</span>&#160;                    res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>&#160;                }</div><div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06275"></a><span class="lineno"> 6275</span>&#160;                {</div><div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;                }</div><div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>&#160;            }</div><div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>&#160;        }</div><div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;</div><div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>&#160;        {</div><div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div><div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160;            VMA_ASSERT(pBlock-&gt;m_Metadata.GetSize() &gt;= vkMemReq.size);</div><div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>&#160;</div><div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160;            <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l06287"></a><span class="lineno"> 6287</span>&#160;            {</div><div class="line"><a name="l06288"></a><span class="lineno"> 6288</span>&#160;                res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160;                {</div><div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>&#160;                }</div><div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>&#160;            }</div><div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>&#160;</div><div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>&#160;            <span class="comment">// Allocate from pBlock. Because it is empty, dstAllocRequest can be trivially filled.</span></div><div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;            VmaAllocationRequest allocRequest;</div><div class="line"><a name="l06297"></a><span class="lineno"> 6297</span>&#160;            pBlock-&gt;m_Metadata.CreateFirstAllocationRequest(&amp;allocRequest);</div><div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;            *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160;            pBlock-&gt;m_Metadata.Alloc(allocRequest, suballocType, vkMemReq.size, *pAllocation);</div><div class="line"><a name="l06300"></a><span class="lineno"> 6300</span>&#160;            (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>&#160;                hCurrentPool,</div><div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>&#160;                pBlock,</div><div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>&#160;                allocRequest.offset,</div><div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;                suballocType,</div><div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;                mapped,</div><div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;                (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>&#160;            VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l06310"></a><span class="lineno"> 6310</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new allocation Size=%llu&quot;</span>, allocInfo.allocationSize);</div><div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>&#160;            (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;        }</div><div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>&#160;    }</div><div class="line"><a name="l06315"></a><span class="lineno"> 6315</span>&#160;</div><div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canMakeOtherLost = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>) != 0;</div><div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;</div><div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div><div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>&#160;    {</div><div class="line"><a name="l06321"></a><span class="lineno"> 6321</span>&#160;        uint32_t tryIndex = 0;</div><div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div><div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;        {</div><div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div><div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;            VmaAllocationRequest bestRequest = {};</div><div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div><div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>&#160;</div><div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>&#160;            <span class="comment">// 1. Search existing allocations.</span></div><div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;            <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div><div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div><div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>&#160;            {</div><div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;                VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160;                VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>&#160;                <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>&#160;                    m_BufferImageGranularity,</div><div class="line"><a name="l06339"></a><span class="lineno"> 6339</span>&#160;                    vkMemReq.size,</div><div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>&#160;                    vkMemReq.alignment,</div><div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>&#160;                    suballocType,</div><div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l06343"></a><span class="lineno"> 6343</span>&#160;                    &amp;currRequest))</div><div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>&#160;                {</div><div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>&#160;                    <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160;                        currRequestCost &lt; bestRequestCost)</div><div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>&#160;                    {</div><div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>&#160;                        pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;                        bestRequest = currRequest;</div><div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160;                        bestRequestCost = currRequestCost;</div><div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>&#160;</div><div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>&#160;                        <span class="keywordflow">if</span>(bestRequestCost == 0)</div><div class="line"><a name="l06354"></a><span class="lineno"> 6354</span>&#160;                        {</div><div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>&#160;                        }</div><div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>&#160;                    }</div><div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>&#160;                }</div><div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;            }</div><div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;</div><div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div><div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>&#160;            {</div><div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>&#160;                <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;                {</div><div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>&#160;                    {</div><div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>&#160;                        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>&#160;                    }</div><div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>&#160;                }</div><div class="line"><a name="l06371"></a><span class="lineno"> 6371</span>&#160;</div><div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>&#160;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_Metadata.MakeRequestedAllocationsLost(</div><div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>&#160;                    &amp;bestRequest))</div><div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160;                {</div><div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;                    <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;                    {</div><div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;                        m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>&#160;                    }</div><div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div><div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>&#160;                    *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>&#160;                    pBestRequestBlock-&gt;m_Metadata.Alloc(bestRequest, suballocType, vkMemReq.size, *pAllocation);</div><div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;                        pBestRequestBlock,</div><div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;                        bestRequest.offset,</div><div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;                        vkMemReq.alignment,</div><div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;                        vkMemReq.size,</div><div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>&#160;                        suballocType,</div><div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>&#160;                        mapped,</div><div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div><div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing allocation #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160;                    (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>&#160;                }</div><div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>&#160;                <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div><div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;            }</div><div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>&#160;            {</div><div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div><div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>&#160;            }</div><div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>&#160;        }</div><div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div><div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div><div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div><div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div><div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;        {</div><div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div><div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;        }</div><div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>&#160;    }</div><div class="line"><a name="l06415"></a><span class="lineno"> 6415</span>&#160;</div><div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>&#160;}</div><div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;</div><div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Free(</div><div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;    VmaAllocation hAllocation)</div><div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;{</div><div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div><div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;</div><div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;    <span class="comment">// Scope for lock.</span></div><div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;    {</div><div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;        VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;</div><div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>&#160;</div><div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</div><div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;        {</div><div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;            pBlock-&gt;m_Mapping.Unmap(m_hAllocator, pBlock-&gt;m_hMemory, 1);</div><div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>&#160;        }</div><div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>&#160;</div><div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>&#160;        pBlock-&gt;m_Metadata.Free(hAllocation);</div><div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;</div><div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;</div><div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div><div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;        {</div><div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;            <span class="comment">// Already has empty Allocation. We don&#39;t want to have two, so delete this one.</span></div><div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;            <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;            {</div><div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;                pBlockToDelete = pBlock;</div><div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160;                Remove(pBlock);</div><div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;            }</div><div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>&#160;            <span class="comment">// We now have first empty Allocation.</span></div><div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;            {</div><div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>&#160;            }</div><div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>&#160;        }</div><div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>&#160;        <span class="comment">// pBlock didn&#39;t become empty, but we have another empty block - find and free that one.</span></div><div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div><div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock)</div><div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>&#160;        {</div><div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>&#160;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div><div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;            <span class="keywordflow">if</span>(pLastBlock-&gt;m_Metadata.IsEmpty() &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>&#160;            {</div><div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>&#160;                pBlockToDelete = pLastBlock;</div><div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>&#160;                m_Blocks.pop_back();</div><div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>&#160;            }</div><div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>&#160;        }</div><div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>&#160;</div><div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>&#160;        IncrementallySortBlocks();</div><div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;    }</div><div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>&#160;</div><div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>&#160;    <span class="comment">// Destruction of a free Allocation. Deferred until this point, outside of mutex</span></div><div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>&#160;    <span class="comment">// lock, for performance reason.</span></div><div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div><div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>&#160;    {</div><div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty allocation&quot;</span>);</div><div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div><div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>&#160;    }</div><div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>&#160;}</div><div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>&#160;</div><div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>&#160;<span class="keywordtype">size_t</span> VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div><div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div><div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>&#160;    {</div><div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>&#160;        result = VMA_MAX((uint64_t)result, (uint64_t)m_Blocks[i]-&gt;m_Metadata.GetSize());</div><div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</div><div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>&#160;        {</div><div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;        }</div><div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160;    }</div><div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>&#160;}</div><div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>&#160;</div><div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div><div class="line"><a name="l06496"></a><span class="lineno"> 6496</span>&#160;{</div><div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>&#160;    {</div><div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div><div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;        {</div><div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;        }</div><div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>&#160;    }</div><div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>&#160;    VMA_ASSERT(0);</div><div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>&#160;}</div><div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>&#160;</div><div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div><div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>&#160;{</div><div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>&#160;    <span class="comment">// Bubble sort only until first swap.</span></div><div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 1; i &lt; m_Blocks.size(); ++i)</div><div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>&#160;    {</div><div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[i - 1]-&gt;m_Metadata.GetSumFreeSize() &gt; m_Blocks[i]-&gt;m_Metadata.GetSumFreeSize())</div><div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>&#160;        {</div><div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>&#160;            VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div><div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;        }</div><div class="line"><a name="l06518"></a><span class="lineno"> 6518</span>&#160;    }</div><div class="line"><a name="l06519"></a><span class="lineno"> 6519</span>&#160;}</div><div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;</div><div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div><div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>&#160;{</div><div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>&#160;    allocInfo.allocationSize = blockSize;</div><div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div><div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div><div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>&#160;    {</div><div class="line"><a name="l06530"></a><span class="lineno"> 6530</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160;    }</div><div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;</div><div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div><div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;</div><div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div><div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div><div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>&#160;    pBlock-&gt;Init(</div><div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;        m_MemoryTypeIndex,</div><div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;        mem,</div><div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;        allocInfo.allocationSize);</div><div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;</div><div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;    m_Blocks.push_back(pBlock);</div><div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div><div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>&#160;    {</div><div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>&#160;        *pNewBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;    }</div><div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>&#160;</div><div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>&#160;}</div><div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>&#160;</div><div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>&#160;</div><div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div><div class="line"><a name="l06554"></a><span class="lineno"> 6554</span>&#160;{</div><div class="line"><a name="l06555"></a><span class="lineno"> 6555</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;</div><div class="line"><a name="l06557"></a><span class="lineno"> 6557</span>&#160;    json.BeginObject();</div><div class="line"><a name="l06558"></a><span class="lineno"> 6558</span>&#160;</div><div class="line"><a name="l06559"></a><span class="lineno"> 6559</span>&#160;    <span class="keywordflow">if</span>(m_IsCustomPool)</div><div class="line"><a name="l06560"></a><span class="lineno"> 6560</span>&#160;    {</div><div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div><div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</div><div class="line"><a name="l06563"></a><span class="lineno"> 6563</span>&#160;</div><div class="line"><a name="l06564"></a><span class="lineno"> 6564</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div><div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l06566"></a><span class="lineno"> 6566</span>&#160;</div><div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div><div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div><div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;        {</div><div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div><div class="line"><a name="l06573"></a><span class="lineno"> 6573</span>&#160;        }</div><div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div><div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;        {</div><div class="line"><a name="l06576"></a><span class="lineno"> 6576</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div><div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;        }</div><div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div><div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div><div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>&#160;        json.EndObject();</div><div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>&#160;</div><div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</div><div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;        {</div><div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div><div class="line"><a name="l06586"></a><span class="lineno"> 6586</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div><div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>&#160;        }</div><div class="line"><a name="l06588"></a><span class="lineno"> 6588</span>&#160;    }</div><div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;    {</div><div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div><div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l06593"></a><span class="lineno"> 6593</span>&#160;    }</div><div class="line"><a name="l06594"></a><span class="lineno"> 6594</span>&#160;</div><div class="line"><a name="l06595"></a><span class="lineno"> 6595</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l06596"></a><span class="lineno"> 6596</span>&#160;    json.BeginArray();</div><div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div><div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>&#160;    {</div><div class="line"><a name="l06599"></a><span class="lineno"> 6599</span>&#160;        m_Blocks[i]-&gt;m_Metadata.PrintDetailedMap(json);</div><div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>&#160;    }</div><div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>&#160;    json.EndArray();</div><div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;</div><div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;    json.EndObject();</div><div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;}</div><div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>&#160;</div><div class="line"><a name="l06606"></a><span class="lineno"> 6606</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;</div><div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160;VmaDefragmentator* VmaBlockVector::EnsureDefragmentator(</div><div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;    VmaAllocator hAllocator,</div><div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;    uint32_t currentFrameIndex)</div><div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>&#160;{</div><div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>&#160;    {</div><div class="line"><a name="l06614"></a><span class="lineno"> 6614</span>&#160;        m_pDefragmentator = vma_new(m_hAllocator, VmaDefragmentator)(</div><div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;            hAllocator,</div><div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>&#160;            currentFrameIndex);</div><div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>&#160;    }</div><div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>&#160;</div><div class="line"><a name="l06620"></a><span class="lineno"> 6620</span>&#160;    <span class="keywordflow">return</span> m_pDefragmentator;</div><div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>&#160;}</div><div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>&#160;</div><div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>&#160;VkResult VmaBlockVector::Defragment(</div><div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;    VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;    uint32_t&amp; maxAllocationsToMove)</div><div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;{</div><div class="line"><a name="l06628"></a><span class="lineno"> 6628</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>&#160;    {</div><div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06631"></a><span class="lineno"> 6631</span>&#160;    }</div><div class="line"><a name="l06632"></a><span class="lineno"> 6632</span>&#160;</div><div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06634"></a><span class="lineno"> 6634</span>&#160;</div><div class="line"><a name="l06635"></a><span class="lineno"> 6635</span>&#160;    <span class="comment">// Defragment.</span></div><div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;    VkResult result = m_pDefragmentator-&gt;Defragment(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>&#160;</div><div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>&#160;    <span class="comment">// Accumulate statistics.</span></div><div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>&#160;    {</div><div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;        <span class="keyword">const</span> VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> = m_pDefragmentator-&gt;GetBytesMoved();</div><div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;        <span class="keyword">const</span> uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> = m_pDefragmentator-&gt;GetAllocationsMoved();</div><div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;        VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div><div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;        VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div><div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;        maxBytesToMove -= <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;        maxAllocationsToMove -= <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>&#160;    }</div><div class="line"><a name="l06650"></a><span class="lineno"> 6650</span>&#160;    </div><div class="line"><a name="l06651"></a><span class="lineno"> 6651</span>&#160;    <span class="comment">// Free empty blocks.</span></div><div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>&#160;    {</div><div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>&#160;        {</div><div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;            {</div><div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;                {</div><div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;                    pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock-&gt;m_Metadata.GetSize();</div><div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;                }</div><div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;</div><div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;                vma_delete(m_hAllocator, pBlock);</div><div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>&#160;            }</div><div class="line"><a name="l06670"></a><span class="lineno"> 6670</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;            {</div><div class="line"><a name="l06672"></a><span class="lineno"> 6672</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l06673"></a><span class="lineno"> 6673</span>&#160;            }</div><div class="line"><a name="l06674"></a><span class="lineno"> 6674</span>&#160;        }</div><div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;    }</div><div class="line"><a name="l06676"></a><span class="lineno"> 6676</span>&#160;</div><div class="line"><a name="l06677"></a><span class="lineno"> 6677</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160;}</div><div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>&#160;</div><div class="line"><a name="l06680"></a><span class="lineno"> 6680</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DestroyDefragmentator()</div><div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;{</div><div class="line"><a name="l06682"></a><span class="lineno"> 6682</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator != VMA_NULL)</div><div class="line"><a name="l06683"></a><span class="lineno"> 6683</span>&#160;    {</div><div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;        vma_delete(m_hAllocator, m_pDefragmentator);</div><div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>&#160;        m_pDefragmentator = VMA_NULL;</div><div class="line"><a name="l06686"></a><span class="lineno"> 6686</span>&#160;    }</div><div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;}</div><div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>&#160;</div><div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div><div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;{</div><div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div><div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>&#160;    {</div><div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;        lostAllocationCount += pBlock-&gt;m_Metadata.MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div><div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;    }</div><div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div><div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;    {</div><div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div><div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;    }</div><div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;}</div><div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>&#160;</div><div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;{</div><div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;</div><div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;</div><div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160;    {</div><div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>&#160;        pBlock-&gt;m_Metadata.CalcAllocationStatInfo(allocationStatInfo);</div><div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;    }</div><div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>&#160;}</div><div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>&#160;</div><div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160;<span class="comment">// VmaDefragmentator members definition</span></div><div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;</div><div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160;VmaDefragmentator::VmaDefragmentator(</div><div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;    VmaAllocator hAllocator,</div><div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>&#160;    uint32_t currentFrameIndex) :</div><div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;    m_pBlockVector(pBlockVector),</div><div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;    m_CurrentFrameIndex(currentFrameIndex),</div><div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;    m_BytesMoved(0),</div><div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;    m_AllocationsMoved(0),</div><div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocationInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>&#160;{</div><div class="line"><a name="l06742"></a><span class="lineno"> 6742</span>&#160;}</div><div class="line"><a name="l06743"></a><span class="lineno"> 6743</span>&#160;</div><div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>&#160;VmaDefragmentator::~VmaDefragmentator()</div><div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>&#160;{</div><div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;    {</div><div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;    }</div><div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>&#160;}</div><div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>&#160;</div><div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>&#160;<span class="keywordtype">void</span> VmaDefragmentator::AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged)</div><div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>&#160;{</div><div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>&#160;    AllocationInfo allocInfo;</div><div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    allocInfo.m_hAllocation = hAlloc;</div><div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;    allocInfo.m_pChanged = pChanged;</div><div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>&#160;    m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>&#160;}</div><div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;</div><div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>&#160;VkResult VmaDefragmentator::BlockInfo::EnsureMapping(VmaAllocator hAllocator, <span class="keywordtype">void</span>** ppMappedData)</div><div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>&#160;{</div><div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>&#160;    <span class="comment">// It has already been mapped for defragmentation.</span></div><div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation)</div><div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;    {</div><div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160;        *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160;    }</div><div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;            </div><div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;    <span class="comment">// It is originally mapped.</span></div><div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160;    <span class="keywordflow">if</span>(m_pBlock-&gt;m_Mapping.GetMappedData())</div><div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;    {</div><div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>&#160;        *ppMappedData = m_pBlock-&gt;m_Mapping.GetMappedData();</div><div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;    }</div><div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>&#160;            </div><div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>&#160;    <span class="comment">// Map on first usage.</span></div><div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>&#160;    VkResult res = m_pBlock-&gt;Map(hAllocator, 1, &amp;m_pMappedDataForDefragmentation);</div><div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>&#160;    *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;}</div><div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;</div><div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;<span class="keywordtype">void</span> VmaDefragmentator::BlockInfo::Unmap(VmaAllocator hAllocator)</div><div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;{</div><div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation != VMA_NULL)</div><div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;    {</div><div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;        m_pBlock-&gt;Unmap(hAllocator, 1);</div><div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160;    }</div><div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>&#160;}</div><div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>&#160;</div><div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;VkResult VmaDefragmentator::DefragmentRound(</div><div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;{</div><div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div><div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;    {</div><div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>&#160;    }</div><div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;</div><div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;    {</div><div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160;        <span class="comment">// 1. Find next allocation to move.</span></div><div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>&#160;        <span class="comment">// 1.1. Start from last to first m_Blocks - they are sorted from most &quot;destination&quot; to most &quot;source&quot;.</span></div><div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>&#160;        <span class="comment">// 1.2. Then start from last to first m_Allocations - they are sorted from largest to smallest.</span></div><div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</div><div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160;        {</div><div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div><div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;            {</div><div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div><div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == 0)</div><div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;                {</div><div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>&#160;                }</div><div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;                {</div><div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>&#160;                    --srcBlockIndex;</div><div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>&#160;                    srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>&#160;                }</div><div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>&#160;            }</div><div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;            {</div><div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</div><div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>&#160;            }</div><div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>&#160;        }</div><div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>&#160;        </div><div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>&#160;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div><div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div><div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>&#160;</div><div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div><div class="line"><a name="l06832"></a><span class="lineno"> 6832</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div><div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div><div class="line"><a name="l06834"></a><span class="lineno"> 6834</span>&#160;</div><div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>&#160;        <span class="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div><div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstBlockIndex = 0; dstBlockIndex &lt;= srcBlockIndex; ++dstBlockIndex)</div><div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>&#160;        {</div><div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div><div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160;            VmaAllocationRequest dstAllocRequest;</div><div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>&#160;                m_CurrentFrameIndex,</div><div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div><div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;                size,</div><div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;                alignment,</div><div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>&#160;                suballocType,</div><div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div><div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;            MoveMakesSense(</div><div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div><div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>&#160;            {</div><div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;</div><div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div><div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div><div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</div><div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>&#160;                {</div><div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;                    <span class="keywordflow">return</span> VK_INCOMPLETE;</div><div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;                }</div><div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160;</div><div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;                <span class="keywordtype">void</span>* pDstMappedData = VMA_NULL;</div><div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;                VkResult res = pDstBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pDstMappedData);</div><div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;                {</div><div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>&#160;                }</div><div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>&#160;</div><div class="line"><a name="l06868"></a><span class="lineno"> 6868</span>&#160;                <span class="keywordtype">void</span>* pSrcMappedData = VMA_NULL;</div><div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>&#160;                res = pSrcBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pSrcMappedData);</div><div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;                {</div><div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;                }</div><div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>&#160;                </div><div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>&#160;                <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div><div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;                memcpy(</div><div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>&#160;                    reinterpret_cast&lt;char*&gt;(pDstMappedData) + dstAllocRequest.offset,</div><div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>&#160;                    reinterpret_cast&lt;char*&gt;(pSrcMappedData) + srcOffset,</div><div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;                    static_cast&lt;size_t&gt;(size));</div><div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;                </div><div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>&#160;                pDstBlockInfo-&gt;m_pBlock-&gt;m_Metadata.Alloc(dstAllocRequest, suballocType, size, allocInfo.m_hAllocation);</div><div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>&#160;                pSrcBlockInfo-&gt;m_pBlock-&gt;m_Metadata.FreeAtOffset(srcOffset);</div><div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>&#160;                </div><div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>&#160;                allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div><div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>&#160;</div><div class="line"><a name="l06886"></a><span class="lineno"> 6886</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div><div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>&#160;                {</div><div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</div><div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>&#160;                }</div><div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>&#160;</div><div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;                ++m_AllocationsMoved;</div><div class="line"><a name="l06892"></a><span class="lineno"> 6892</span>&#160;                m_BytesMoved += size;</div><div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>&#160;</div><div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div><div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>&#160;</div><div class="line"><a name="l06896"></a><span class="lineno"> 6896</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;            }</div><div class="line"><a name="l06898"></a><span class="lineno"> 6898</span>&#160;        }</div><div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>&#160;</div><div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;        <span class="comment">// If not processed, this allocInfo remains in pBlockInfo-&gt;m_Allocations for next round.</span></div><div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;</div><div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div><div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>&#160;        {</div><div class="line"><a name="l06904"></a><span class="lineno"> 6904</span>&#160;            --srcAllocIndex;</div><div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>&#160;        }</div><div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;        {</div><div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div><div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;            {</div><div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>&#160;                --srcBlockIndex;</div><div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>&#160;                srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>&#160;            }</div><div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06914"></a><span class="lineno"> 6914</span>&#160;            {</div><div class="line"><a name="l06915"></a><span class="lineno"> 6915</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;            }</div><div class="line"><a name="l06917"></a><span class="lineno"> 6917</span>&#160;        }</div><div class="line"><a name="l06918"></a><span class="lineno"> 6918</span>&#160;    }</div><div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;}</div><div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>&#160;</div><div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>&#160;VkResult VmaDefragmentator::Defragment(</div><div class="line"><a name="l06922"></a><span class="lineno"> 6922</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>&#160;{</div><div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>&#160;    <span class="keywordflow">if</span>(m_Allocations.empty())</div><div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160;    {</div><div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;    }</div><div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;</div><div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;    <span class="comment">// Create block info for each block.</span></div><div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;m_Blocks.size();</div><div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l06933"></a><span class="lineno"> 6933</span>&#160;    {</div><div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div><div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160;        m_Blocks.push_back(pBlockInfo);</div><div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;    }</div><div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>&#160;</div><div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>&#160;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div><div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div><div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>&#160;</div><div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>&#160;    <span class="comment">// Move allocation infos from m_Allocations to appropriate m_Blocks[memTypeIndex].m_Allocations.</span></div><div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0, allocCount = m_Allocations.size(); blockIndex &lt; allocCount; ++blockIndex)</div><div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;    {</div><div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;        AllocationInfo&amp; allocInfo = m_Allocations[blockIndex];</div><div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;        <span class="comment">// Now as we are inside VmaBlockVector::m_Mutex, we can make final check if this allocation was not lost.</span></div><div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160;        <span class="keywordflow">if</span>(allocInfo.m_hAllocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;        {</div><div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160;            VmaDeviceMemoryBlock* pBlock = allocInfo.m_hAllocation-&gt;GetBlock();</div><div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160;            BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div><div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>&#160;            <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div><div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;            {</div><div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>&#160;                (*it)-&gt;m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;            }</div><div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06956"></a><span class="lineno"> 6956</span>&#160;            {</div><div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;                VMA_ASSERT(0);</div><div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;            }</div><div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>&#160;        }</div><div class="line"><a name="l06960"></a><span class="lineno"> 6960</span>&#160;    }</div><div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;    m_Allocations.clear();</div><div class="line"><a name="l06962"></a><span class="lineno"> 6962</span>&#160;</div><div class="line"><a name="l06963"></a><span class="lineno"> 6963</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160;    {</div><div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div><div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div><div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>&#160;        pBlockInfo-&gt;SortAllocationsBySizeDescecnding();</div><div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>&#160;    }</div><div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>&#160;</div><div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;    <span class="comment">// Sort m_Blocks this time by the main criterium, from most &quot;destination&quot; to most &quot;source&quot; blocks.</span></div><div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div><div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160;</div><div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div><div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> round = 0; (round &lt; 2) &amp;&amp; (result == VK_SUCCESS); ++round)</div><div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>&#160;    {</div><div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>&#160;        result = DefragmentRound(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;    }</div><div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;</div><div class="line"><a name="l06980"></a><span class="lineno"> 6980</span>&#160;    <span class="comment">// Unmap blocks that were mapped for defragmentation.</span></div><div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>&#160;    {</div><div class="line"><a name="l06983"></a><span class="lineno"> 6983</span>&#160;        m_Blocks[blockIndex]-&gt;Unmap(m_hAllocator);</div><div class="line"><a name="l06984"></a><span class="lineno"> 6984</span>&#160;    }</div><div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>&#160;</div><div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l06987"></a><span class="lineno"> 6987</span>&#160;}</div><div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160;</div><div class="line"><a name="l06989"></a><span class="lineno"> 6989</span>&#160;<span class="keywordtype">bool</span> VmaDefragmentator::MoveMakesSense(</div><div class="line"><a name="l06990"></a><span class="lineno"> 6990</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div><div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>&#160;{</div><div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</div><div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>&#160;    {</div><div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>&#160;    }</div><div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div><div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>&#160;    {</div><div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>&#160;    }</div><div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</div><div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;    {</div><div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;    }</div><div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;}</div><div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;</div><div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160;<span class="comment">// VmaAllocator_T</span></div><div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160;</div><div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160;VmaAllocator_T::VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo) :</div><div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;    m_UseMutex((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a>) == 0),</div><div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;    m_UseKhrDedicatedAllocation((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0),</div><div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div><div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div><div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div><div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div><div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div><div class="line"><a name="l07019"></a><span class="lineno"> 7019</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div><div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>&#160;    m_CurrentFrameIndex(0),</div><div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;    m_Pools(VmaStlAllocator&lt;VmaPool&gt;(GetAllocationCallbacks()))</div><div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>&#160;{</div><div class="line"><a name="l07023"></a><span class="lineno"> 7023</span>&#160;    VMA_ASSERT(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> &amp;&amp; pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>);    </div><div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>&#160;</div><div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div><div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div><div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div><div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>&#160;        </div><div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div><div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div><div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;</div><div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;    {</div><div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160;        m_HeapSizeLimit[i] = VK_WHOLE_SIZE;</div><div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;    }</div><div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;</div><div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a> != VMA_NULL)</div><div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>&#160;    {</div><div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div><div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div><div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;    }</div><div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;</div><div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div><div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>&#160;</div><div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div><div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</div><div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;</div><div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160;    m_PreferredLargeHeapBlockSize = (pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> != 0) ?</div><div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>&#160;        pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> : static_cast&lt;VkDeviceSize&gt;(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div><div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>&#160;</div><div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a> != VMA_NULL)</div><div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>&#160;    {</div><div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>&#160;        {</div><div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>&#160;            <span class="keyword">const</span> VkDeviceSize limit = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>[heapIndex];</div><div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div><div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;            {</div><div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160;                m_HeapSizeLimit[heapIndex] = limit;</div><div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div><div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>&#160;                {</div><div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div><div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;                }</div><div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;            }</div><div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;        }</div><div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>&#160;    }</div><div class="line"><a name="l07066"></a><span class="lineno"> 7066</span>&#160;</div><div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;    {</div><div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div><div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;</div><div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div><div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;            memTypeIndex,</div><div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;            preferredBlockSize,</div><div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;            0,</div><div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;            SIZE_MAX,</div><div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;            GetBufferImageGranularity(),</div><div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div><div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;            <span class="keyword">false</span>); <span class="comment">// isCustomPool</span></div><div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div><div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div><div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</div><div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>&#160;    }</div><div class="line"><a name="l07084"></a><span class="lineno"> 7084</span>&#160;}</div><div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>&#160;</div><div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div><div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>&#160;{</div><div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>&#160;    VMA_ASSERT(m_Pools.empty());</div><div class="line"><a name="l07089"></a><span class="lineno"> 7089</span>&#160;</div><div class="line"><a name="l07090"></a><span class="lineno"> 7090</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div><div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;    {</div><div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div><div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div><div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;    }</div><div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>&#160;}</div><div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>&#160;</div><div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions)</div><div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>&#160;{</div><div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = &amp;vkGetPhysicalDeviceProperties;</div><div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = &amp;vkGetPhysicalDeviceMemoryProperties;</div><div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>&#160;    m_VulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</div><div class="line"><a name="l07103"></a><span class="lineno"> 7103</span>&#160;    m_VulkanFunctions.vkFreeMemory = &amp;vkFreeMemory;</div><div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>&#160;    m_VulkanFunctions.vkMapMemory = &amp;vkMapMemory;</div><div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;    m_VulkanFunctions.vkUnmapMemory = &amp;vkUnmapMemory;</div><div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = &amp;vkBindBufferMemory;</div><div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>&#160;    m_VulkanFunctions.vkBindImageMemory = &amp;vkBindImageMemory;</div><div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = &amp;vkGetBufferMemoryRequirements;</div><div class="line"><a name="l07109"></a><span class="lineno"> 7109</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = &amp;vkGetImageMemoryRequirements;</div><div class="line"><a name="l07110"></a><span class="lineno"> 7110</span>&#160;    m_VulkanFunctions.vkCreateBuffer = &amp;vkCreateBuffer;</div><div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = &amp;vkDestroyBuffer;</div><div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>&#160;    m_VulkanFunctions.vkCreateImage = &amp;vkCreateImage;</div><div class="line"><a name="l07113"></a><span class="lineno"> 7113</span>&#160;    m_VulkanFunctions.vkDestroyImage = &amp;vkDestroyImage;</div><div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160;    {</div><div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div><div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>&#160;            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div><div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;    }</div><div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>&#160;</div><div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>&#160;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div><div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div><div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>&#160;</div><div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div><div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>&#160;    {</div><div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div><div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160;        VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div><div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div><div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;        VMA_COPY_IF_NOT_NULL(vkMapMemory);</div><div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>&#160;        VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div><div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div><div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div><div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div><div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div><div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div><div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div><div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateImage);</div><div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div><div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div><div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div><div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>&#160;    }</div><div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>&#160;</div><div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div><div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>&#160;</div><div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>&#160;    <span class="comment">// If these asserts are hit, you must either #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>&#160;    <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div><div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div><div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div><div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div><div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div><div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div><div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div><div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div><div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div><div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div><div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div><div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div><div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>&#160;    {</div><div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;    }</div><div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160;}</div><div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>&#160;</div><div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div><div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>&#160;{</div><div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div><div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isSmallHeap = heapSize &lt;= VMA_SMALL_HEAP_MAX_SIZE;</div><div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160;    <span class="keywordflow">return</span> isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160;}</div><div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;</div><div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div><div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;    VmaAllocation* pAllocation)</div><div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;{</div><div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;    VMA_ASSERT(pAllocation != VMA_NULL);</div><div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  AllocateMemory: MemoryTypeIndex=%u, Size=%llu&quot;</span>, memTypeIndex, vkMemReq.size);</div><div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>&#160;</div><div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div><div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160;</div><div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div><div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;    {</div><div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>&#160;    }</div><div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;</div><div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;    VMA_ASSERT(blockVector);</div><div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>&#160;</div><div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div><div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div><div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div><div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160;        dedicatedAllocation ||</div><div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;        <span class="comment">// Heuristics: Allocate dedicated memory if requested size if greater than half of preferred block size.</span></div><div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>&#160;        vkMemReq.size &gt; preferredBlockSize / 2;</div><div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;</div><div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div><div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;        (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0 &amp;&amp;</div><div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> == VK_NULL_HANDLE)</div><div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160;    {</div><div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>;</div><div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>&#160;    }</div><div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>&#160;</div><div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0)</div><div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>&#160;    {</div><div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160;        {</div><div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>&#160;        }</div><div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;        {</div><div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div><div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>&#160;                suballocType,</div><div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>&#160;                memTypeIndex,</div><div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div><div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div><div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l07233"></a><span class="lineno"> 7233</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>&#160;                dedicatedImage,</div><div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>&#160;                pAllocation);</div><div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>&#160;        }</div><div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>&#160;    }</div><div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>&#160;    {</div><div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div><div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hCurrentPool</span></div><div class="line"><a name="l07242"></a><span class="lineno"> 7242</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l07243"></a><span class="lineno"> 7243</span>&#160;            vkMemReq,</div><div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;            finalCreateInfo,</div><div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;            suballocType,</div><div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160;            pAllocation);</div><div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;        {</div><div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;        }</div><div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>&#160;</div><div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div><div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;        {</div><div class="line"><a name="l07255"></a><span class="lineno"> 7255</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>&#160;        }</div><div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>&#160;        {</div><div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;            res = AllocateDedicatedMemory(</div><div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>&#160;                suballocType,</div><div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>&#160;                memTypeIndex,</div><div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div><div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div><div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;                finalCreateInfo.pUserData,</div><div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;                dedicatedImage,</div><div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;                pAllocation);</div><div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;            {</div><div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div><div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div><div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>&#160;            }</div><div class="line"><a name="l07275"></a><span class="lineno"> 7275</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>&#160;            {</div><div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div><div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;            }</div><div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;        }</div><div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>&#160;    }</div><div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>&#160;}</div><div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;</div><div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div><div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;    <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;    VmaAllocation* pAllocation)</div><div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;{</div><div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>&#160;    VMA_ASSERT(pAllocation);</div><div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>&#160;</div><div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>&#160;    allocInfo.allocationSize = size;</div><div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;</div><div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div><div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;    {</div><div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div><div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;        {</div><div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div><div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div><div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;        }</div><div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div><div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>&#160;        {</div><div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div><div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>&#160;        }</div><div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>&#160;    }</div><div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;</div><div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160;    <span class="comment">// Allocate VkDeviceMemory.</span></div><div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div><div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>&#160;    {</div><div class="line"><a name="l07323"></a><span class="lineno"> 7323</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>&#160;    }</div><div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>&#160;</div><div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div><div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;    <span class="keywordflow">if</span>(map)</div><div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>&#160;    {</div><div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div><div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160;            m_hDevice,</div><div class="line"><a name="l07332"></a><span class="lineno"> 7332</span>&#160;            hMemory,</div><div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>&#160;            0,</div><div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>&#160;            0,</div><div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;            &amp;pMappedData);</div><div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;        {</div><div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div><div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div><div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160;        }</div><div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>&#160;    }</div><div class="line"><a name="l07344"></a><span class="lineno"> 7344</span>&#160;</div><div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(m_CurrentFrameIndex.load(), isUserDataString);</div><div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div><div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div><div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>&#160;</div><div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160;    <span class="comment">// Register it in m_pDedicatedAllocations.</span></div><div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;    {</div><div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;        AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, *pAllocation);</div><div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>&#160;    }</div><div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;</div><div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory MemoryTypeIndex=#%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;</div><div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;}</div><div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160;</div><div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div><div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160;    {</div><div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;        memReqInfo.buffer = hBuffer;</div><div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>&#160;</div><div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>&#160;</div><div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;</div><div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;</div><div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160;    }</div><div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160;    {</div><div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div><div class="line"><a name="l07387"></a><span class="lineno"> 7387</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>&#160;    }</div><div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>&#160;}</div><div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>&#160;</div><div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div><div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>&#160;    VkImage hImage,</div><div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>&#160;    {</div><div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;        memReqInfo.image = hImage;</div><div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>&#160;</div><div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;</div><div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>&#160;</div><div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>&#160;</div><div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;    }</div><div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>&#160;    {</div><div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div><div class="line"><a name="l07417"></a><span class="lineno"> 7417</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;    }</div><div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>&#160;}</div><div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160;</div><div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div><div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>&#160;    VmaAllocation* pAllocation)</div><div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>&#160;{</div><div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160;    {</div><div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense.&quot;</span>);</div><div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160;    }</div><div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0)</div><div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>&#160;    {</div><div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_MAPPED_BIT together with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT is invalid.&quot;</span>);</div><div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>&#160;    }</div><div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div><div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;    {</div><div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>&#160;        <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>&#160;        {</div><div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT specified while dedicated allocation is required.&quot;</span>);</div><div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>&#160;        }</div><div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>&#160;        <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div><div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>&#160;        {</div><div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pool specified while dedicated allocation is required.&quot;</span>);</div><div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>&#160;        }</div><div class="line"><a name="l07456"></a><span class="lineno"> 7456</span>&#160;    }</div><div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE) &amp;&amp;</div><div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; (<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>)) != 0))</div><div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>&#160;    {</div><div class="line"><a name="l07460"></a><span class="lineno"> 7460</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT when pool != null is invalid.&quot;</span>);</div><div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;    }</div><div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;</div><div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;    <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div><div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;    {</div><div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;        <span class="keywordflow">return</span> createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.Allocate(</div><div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;            createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;            vkMemReq,</div><div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;            createInfo,</div><div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160;            suballocType,</div><div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;            pAllocation);</div><div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;    }</div><div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>&#160;    {</div><div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div><div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div><div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div><div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;        VkResult res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div><div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;        {</div><div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>&#160;            res = AllocateMemoryOfType(</div><div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>&#160;                vkMemReq,</div><div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>&#160;                dedicatedImage,</div><div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>&#160;                createInfo,</div><div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>&#160;                memTypeIndex,</div><div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;                suballocType,</div><div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;                pAllocation);</div><div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;            <span class="comment">// Succeeded on first try.</span></div><div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>&#160;            {</div><div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07495"></a><span class="lineno"> 7495</span>&#160;            }</div><div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div><div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;            {</div><div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;                <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l07500"></a><span class="lineno"> 7500</span>&#160;                {</div><div class="line"><a name="l07501"></a><span class="lineno"> 7501</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div><div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div><div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div><div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>&#160;                    res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div><div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>&#160;                    {</div><div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>&#160;                        res = AllocateMemoryOfType(</div><div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;                            vkMemReq,</div><div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>&#160;                            dedicatedBuffer,</div><div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;                            dedicatedImage,</div><div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>&#160;                            createInfo,</div><div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>&#160;                            memTypeIndex,</div><div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;                            suballocType,</div><div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;                            pAllocation);</div><div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div><div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;                        {</div><div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;                            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>&#160;                        }</div><div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;                        <span class="comment">// else: Allocation from this memory type failed. Try next one - next loop iteration.</span></div><div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;                    }</div><div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div><div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>&#160;                    {</div><div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>&#160;                        <span class="comment">// Not returning res, which is VK_ERROR_FEATURE_NOT_PRESENT, because we already failed to allocate once.</span></div><div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;                    }</div><div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>&#160;                }</div><div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>&#160;            }</div><div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>&#160;        }</div><div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>&#160;        <span class="comment">// Can&#39;t find any single memory type maching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.</span></div><div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07534"></a><span class="lineno"> 7534</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;    }</div><div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>&#160;}</div><div class="line"><a name="l07537"></a><span class="lineno"> 7537</span>&#160;</div><div class="line"><a name="l07538"></a><span class="lineno"> 7538</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(<span class="keyword">const</span> VmaAllocation allocation)</div><div class="line"><a name="l07539"></a><span class="lineno"> 7539</span>&#160;{</div><div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>&#160;    VMA_ASSERT(allocation);</div><div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>&#160;</div><div class="line"><a name="l07542"></a><span class="lineno"> 7542</span>&#160;    <span class="keywordflow">if</span>(allocation-&gt;CanBecomeLost() == <span class="keyword">false</span> ||</div><div class="line"><a name="l07543"></a><span class="lineno"> 7543</span>&#160;        allocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;    {</div><div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;        <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div><div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160;        {</div><div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>&#160;            {</div><div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>&#160;                VmaBlockVector* pBlockVector = VMA_NULL;</div><div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160;                VmaPool hPool = allocation-&gt;GetPool();</div><div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160;                <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div><div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>&#160;                {</div><div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>&#160;                    pBlockVector = &amp;hPool-&gt;m_BlockVector;</div><div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>&#160;                }</div><div class="line"><a name="l07555"></a><span class="lineno"> 7555</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07556"></a><span class="lineno"> 7556</span>&#160;                {</div><div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>&#160;                    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;                    pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>&#160;                }</div><div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>&#160;                pBlockVector-&gt;Free(allocation);</div><div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>&#160;            }</div><div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;            FreeDedicatedMemory(allocation);</div><div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07566"></a><span class="lineno"> 7566</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>&#160;        }</div><div class="line"><a name="l07569"></a><span class="lineno"> 7569</span>&#160;    }</div><div class="line"><a name="l07570"></a><span class="lineno"> 7570</span>&#160;</div><div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;    allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div><div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;    vma_delete(<span class="keyword">this</span>, allocation);</div><div class="line"><a name="l07573"></a><span class="lineno"> 7573</span>&#160;}</div><div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>&#160;</div><div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;{</div><div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;    <span class="comment">// Initialize.</span></div><div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l07579"></a><span class="lineno"> 7579</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_TYPES; ++i)</div><div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l07583"></a><span class="lineno"> 7583</span>&#160;    </div><div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>&#160;    {</div><div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>&#160;        VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div><div class="line"><a name="l07590"></a><span class="lineno"> 7590</span>&#160;    }</div><div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>&#160;</div><div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;    {</div><div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>&#160;        {</div><div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>&#160;            m_Pools[poolIndex]-&gt;GetBlockVector().AddStats(pStats);</div><div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>&#160;        }</div><div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>&#160;    }</div><div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>&#160;</div><div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div><div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>&#160;    {</div><div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0, allocCount = pDedicatedAllocVector-&gt;size(); allocIndex &lt; allocCount; ++allocIndex)</div><div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>&#160;        {</div><div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div><div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>&#160;        }</div><div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>&#160;    }</div><div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>&#160;</div><div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>&#160;    <span class="comment">// Postprocess.</span></div><div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryTypeCount(); ++i)</div><div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryHeapCount(); ++i)</div><div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;}</div><div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;</div><div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_VENDOR_ID_AMD = 4098;</div><div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;</div><div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;VkResult VmaAllocator_T::Defragment(</div><div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;    VmaAllocation* pAllocations,</div><div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* pDefragmentationInfo,</div><div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;{</div><div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;    <span class="keywordflow">if</span>(pAllocationsChanged != VMA_NULL)</div><div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>&#160;    {</div><div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>&#160;        memset(pAllocationsChanged, 0, <span class="keyword">sizeof</span>(*pAllocationsChanged));</div><div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>&#160;    }</div><div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>&#160;    {</div><div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;        memset(pDefragmentationStats, 0, <span class="keyword">sizeof</span>(*pDefragmentationStats));</div><div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;    }</div><div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>&#160;</div><div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>&#160;    <span class="keyword">const</span> uint32_t currentFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>&#160;</div><div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>&#160;    VmaMutexLock poolsLock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l07647"></a><span class="lineno"> 7647</span>&#160;</div><div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>&#160;</div><div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them in BlockVectors when necessary.</span></div><div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div><div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>&#160;    {</div><div class="line"><a name="l07653"></a><span class="lineno"> 7653</span>&#160;        VmaAllocation hAlloc = pAllocations[allocIndex];</div><div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160;        VMA_ASSERT(hAlloc);</div><div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160;        <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div><div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div><div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>&#160;            <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>&#160;            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0) &amp;&amp;</div><div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div><div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;        {</div><div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;            VmaBlockVector* pAllocBlockVector = VMA_NULL;</div><div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;</div><div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;            <span class="keyword">const</span> VmaPool hAllocPool = hAlloc-&gt;GetPool();</div><div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div><div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div><div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>&#160;            {</div><div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>&#160;                pAllocBlockVector = &amp;hAllocPool-&gt;GetBlockVector();</div><div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>&#160;            }</div><div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>&#160;            <span class="comment">// This allocation belongs to general pool.</span></div><div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07673"></a><span class="lineno"> 7673</span>&#160;            {</div><div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>&#160;                pAllocBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;            }</div><div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>&#160;</div><div class="line"><a name="l07677"></a><span class="lineno"> 7677</span>&#160;            VmaDefragmentator* <span class="keyword">const</span> pDefragmentator = pAllocBlockVector-&gt;EnsureDefragmentator(<span class="keyword">this</span>, currentFrameIndex);</div><div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;</div><div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>&#160;            VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div><div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>&#160;                &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div><div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;            pDefragmentator-&gt;AddAllocation(hAlloc, pChanged);</div><div class="line"><a name="l07682"></a><span class="lineno"> 7682</span>&#160;        }</div><div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>&#160;    }</div><div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>&#160;</div><div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l07686"></a><span class="lineno"> 7686</span>&#160;</div><div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>&#160;    <span class="comment">// ======== Main processing.</span></div><div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160;</div><div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;    VkDeviceSize maxBytesToMove = SIZE_MAX;</div><div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;    uint32_t maxAllocationsToMove = UINT32_MAX;</div><div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div><div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;    {</div><div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160;        maxBytesToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>&#160;        maxAllocationsToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;    }</div><div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;</div><div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div><div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;        (memTypeIndex &lt; GetMemoryTypeCount()) &amp;&amp; (result == VK_SUCCESS);</div><div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;        ++memTypeIndex)</div><div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>&#160;    {</div><div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>&#160;        <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;        <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;        {</div><div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>&#160;            result = m_pBlockVectors[memTypeIndex]-&gt;Defragment(</div><div class="line"><a name="l07706"></a><span class="lineno"> 7706</span>&#160;                pDefragmentationStats,</div><div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>&#160;                maxBytesToMove,</div><div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;                maxAllocationsToMove);</div><div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160;        }</div><div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;    }</div><div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;</div><div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; (poolIndex &lt; poolCount) &amp;&amp; (result == VK_SUCCESS); ++poolIndex)</div><div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;    {</div><div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;        result = m_Pools[poolIndex]-&gt;GetBlockVector().Defragment(</div><div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;            pDefragmentationStats,</div><div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;            maxBytesToMove,</div><div class="line"><a name="l07718"></a><span class="lineno"> 7718</span>&#160;            maxAllocationsToMove);</div><div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>&#160;    }</div><div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;</div><div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160;    <span class="comment">// ========  Destroy defragmentators.</span></div><div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;</div><div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = poolCount; poolIndex--; )</div><div class="line"><a name="l07725"></a><span class="lineno"> 7725</span>&#160;    {</div><div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;        m_Pools[poolIndex]-&gt;GetBlockVector().DestroyDefragmentator();</div><div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160;    }</div><div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;</div><div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )</div><div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>&#160;    {</div><div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>&#160;        <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;        {</div><div class="line"><a name="l07734"></a><span class="lineno"> 7734</span>&#160;            m_pBlockVectors[memTypeIndex]-&gt;DestroyDefragmentator();</div><div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>&#160;        }</div><div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>&#160;    }</div><div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>&#160;</div><div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160;}</div><div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>&#160;</div><div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetAllocationInfo(VmaAllocation hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;{</div><div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>&#160;    {</div><div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>&#160;        {</div><div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;            {</div><div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div><div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = VK_NULL_HANDLE;</div><div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div><div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;            }</div><div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l07764"></a><span class="lineno"> 7764</span>&#160;            {</div><div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l07767"></a><span class="lineno"> 7767</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>&#160;            }</div><div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>&#160;            {</div><div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>&#160;                {</div><div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l07778"></a><span class="lineno"> 7778</span>&#160;                }</div><div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>&#160;            }</div><div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160;        }</div><div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;    }</div><div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>&#160;    {</div><div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = hAllocation-&gt;GetMappedData();</div><div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;    }</div><div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>&#160;}</div><div class="line"><a name="l07792"></a><span class="lineno"> 7792</span>&#160;</div><div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;<span class="keywordtype">bool</span> VmaAllocator_T::TouchAllocation(VmaAllocation hAllocation)</div><div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>&#160;{</div><div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div><div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;    {</div><div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160;        {</div><div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l07803"></a><span class="lineno"> 7803</span>&#160;            {</div><div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07805"></a><span class="lineno"> 7805</span>&#160;            }</div><div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;            {</div><div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>&#160;            }</div><div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>&#160;            {</div><div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>&#160;                {</div><div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>&#160;                }</div><div class="line"><a name="l07816"></a><span class="lineno"> 7816</span>&#160;            }</div><div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>&#160;        }</div><div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>&#160;    }</div><div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>&#160;    {</div><div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;    }</div><div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;}</div><div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160;</div><div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>&#160;VkResult VmaAllocator_T::CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, VmaPool* pPool)</div><div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>&#160;{</div><div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  CreatePool: MemoryTypeIndex=%u&quot;</span>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>&#160;</div><div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div><div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>&#160;</div><div class="line"><a name="l07831"></a><span class="lineno"> 7831</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> == 0)</div><div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>&#160;    {</div><div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div><div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>&#160;    }</div><div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a> == 0)</div><div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>&#160;    {</div><div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a> = CalcPreferredBlockSize(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>&#160;    }</div><div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;</div><div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;    *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo);</div><div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>&#160;</div><div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div><div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>&#160;    {</div><div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div><div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;        *pPool = VMA_NULL;</div><div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>&#160;    }</div><div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>&#160;</div><div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>&#160;    <span class="comment">// Add to m_Pools.</span></div><div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>&#160;    {</div><div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div><div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;    }</div><div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>&#160;</div><div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160;}</div><div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;</div><div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::DestroyPool(VmaPool pool)</div><div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>&#160;{</div><div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div><div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>&#160;    {</div><div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div><div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div><div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>&#160;    }</div><div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160;</div><div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div><div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>&#160;}</div><div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160;</div><div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetPoolStats(VmaPool pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>&#160;{</div><div class="line"><a name="l07873"></a><span class="lineno"> 7873</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div><div class="line"><a name="l07874"></a><span class="lineno"> 7874</span>&#160;}</div><div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>&#160;</div><div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div><div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>&#160;{</div><div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div><div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160;}</div><div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160;</div><div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div><div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>&#160;    VmaPool hPool,</div><div class="line"><a name="l07883"></a><span class="lineno"> 7883</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l07884"></a><span class="lineno"> 7884</span>&#160;{</div><div class="line"><a name="l07885"></a><span class="lineno"> 7885</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div><div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>&#160;        m_CurrentFrameIndex.load(),</div><div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>&#160;        pLostAllocationCount);</div><div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160;}</div><div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>&#160;</div><div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CreateLostAllocation(VmaAllocation* pAllocation)</div><div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;{</div><div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div><div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>&#160;    (*pAllocation)-&gt;InitLost();</div><div class="line"><a name="l07894"></a><span class="lineno"> 7894</span>&#160;}</div><div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>&#160;</div><div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div><div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>&#160;{</div><div class="line"><a name="l07898"></a><span class="lineno"> 7898</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div><div class="line"><a name="l07899"></a><span class="lineno"> 7899</span>&#160;</div><div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>&#160;    VkResult res;</div><div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>&#160;    {</div><div class="line"><a name="l07903"></a><span class="lineno"> 7903</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l07904"></a><span class="lineno"> 7904</span>&#160;        <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] &gt;= pAllocateInfo-&gt;allocationSize)</div><div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>&#160;        {</div><div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>&#160;            res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>&#160;            {</div><div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>&#160;                m_HeapSizeLimit[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div><div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>&#160;            }</div><div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>&#160;        }</div><div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;        {</div><div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;            res = VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;        }</div><div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>&#160;    }</div><div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;    {</div><div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>&#160;        res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;    }</div><div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>&#160;</div><div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS &amp;&amp; m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> != VMA_NULL)</div><div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>&#160;    {</div><div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>)(<span class="keyword">this</span>, pAllocateInfo-&gt;memoryTypeIndex, *pMemory, pAllocateInfo-&gt;allocationSize);</div><div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>&#160;    }</div><div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>&#160;</div><div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;}</div><div class="line"><a name="l07929"></a><span class="lineno"> 7929</span>&#160;</div><div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div><div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;{</div><div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;    <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> != VMA_NULL)</div><div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;    {</div><div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>)(<span class="keyword">this</span>, memoryType, hMemory, size);</div><div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;    }</div><div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>&#160;</div><div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div><div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;</div><div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);</div><div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;    {</div><div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>&#160;        m_HeapSizeLimit[heapIndex] += size;</div><div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>&#160;    }</div><div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160;}</div><div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>&#160;</div><div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>&#160;VkResult VmaAllocator_T::Map(VmaAllocation hAllocation, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>&#160;{</div><div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;    {</div><div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>&#160;    }</div><div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>&#160;</div><div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;    {</div><div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;        {</div><div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div><div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;            VkResult res = pBlock-&gt;Map(<span class="keyword">this</span>, 1, (<span class="keywordtype">void</span>**)&amp;pBytes);</div><div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07962"></a><span class="lineno"> 7962</span>&#160;            {</div><div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div><div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;                hAllocation-&gt;BlockAllocMap();</div><div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;            }</div><div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>&#160;        }</div><div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div><div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l07971"></a><span class="lineno"> 7971</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160;    }</div><div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;}</div><div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;</div><div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::Unmap(VmaAllocation hAllocation)</div><div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>&#160;{</div><div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160;    {</div><div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;        {</div><div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div><div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div><div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;        }</div><div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div><div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;    }</div><div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;}</div><div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>&#160;</div><div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeDedicatedMemory(VmaAllocation allocation)</div><div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;{</div><div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160;</div><div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>&#160;    {</div><div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div><div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>&#160;        VMA_ASSERT(success);</div><div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;    }</div><div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>&#160;</div><div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div><div class="line"><a name="l08009"></a><span class="lineno"> 8009</span>&#160;    </div><div class="line"><a name="l08010"></a><span class="lineno"> 8010</span>&#160;    <span class="keywordflow">if</span>(allocation-&gt;GetMappedData() != VMA_NULL)</div><div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;    {</div><div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</div><div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;    }</div><div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>&#160;    </div><div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div><div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>&#160;</div><div class="line"><a name="l08017"></a><span class="lineno"> 8017</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;}</div><div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;</div><div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>&#160;</div><div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div><div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;{</div><div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;    {</div><div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div><div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>&#160;        {</div><div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>&#160;            {</div><div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div><div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;                json.BeginObject();</div><div class="line"><a name="l08037"></a><span class="lineno"> 8037</span>&#160;            }</div><div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>&#160;</div><div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>&#160;            json.ContinueString(memTypeIndex);</div><div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>&#160;            json.EndString();</div><div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;                </div><div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160;            json.BeginArray();</div><div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160;</div><div class="line"><a name="l08045"></a><span class="lineno"> 8045</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; pDedicatedAllocVector-&gt;size(); ++i)</div><div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;            {</div><div class="line"><a name="l08047"></a><span class="lineno"> 8047</span>&#160;                <span class="keyword">const</span> VmaAllocation hAlloc = (*pDedicatedAllocVector)[i];</div><div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;                    </div><div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;                json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[hAlloc-&gt;GetSuballocationType()]);</div><div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;</div><div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;                json.WriteNumber(hAlloc-&gt;GetSize());</div><div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;</div><div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>&#160;                <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData = hAlloc-&gt;GetUserData();</div><div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>&#160;                <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l08058"></a><span class="lineno"> 8058</span>&#160;                {</div><div class="line"><a name="l08059"></a><span class="lineno"> 8059</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;                    <span class="keywordflow">if</span>(hAlloc-&gt;IsUserDataString())</div><div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>&#160;                    {</div><div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;                        json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData);</div><div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;                    }</div><div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;                    {</div><div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;                        json.BeginString();</div><div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160;                        json.ContinueString_Pointer(pUserData);</div><div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;                        json.EndString();</div><div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;                    }</div><div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;                }</div><div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>&#160;</div><div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;                json.EndObject();</div><div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>&#160;            }</div><div class="line"><a name="l08074"></a><span class="lineno"> 8074</span>&#160;</div><div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>&#160;            json.EndArray();</div><div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;        }</div><div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;    }</div><div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div><div class="line"><a name="l08079"></a><span class="lineno"> 8079</span>&#160;    {</div><div class="line"><a name="l08080"></a><span class="lineno"> 8080</span>&#160;        json.EndObject();</div><div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;    }</div><div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;</div><div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160;    {</div><div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;        {</div><div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;            {</div><div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;                {</div><div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div><div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>&#160;                }</div><div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;</div><div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l08097"></a><span class="lineno"> 8097</span>&#160;                json.ContinueString(memTypeIndex);</div><div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>&#160;                json.EndString();</div><div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;</div><div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>&#160;            }</div><div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>&#160;        }</div><div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div><div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>&#160;        {</div><div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>&#160;            json.EndObject();</div><div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160;        }</div><div class="line"><a name="l08107"></a><span class="lineno"> 8107</span>&#160;    }</div><div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>&#160;</div><div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>&#160;    {</div><div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08111"></a><span class="lineno"> 8111</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div><div class="line"><a name="l08113"></a><span class="lineno"> 8113</span>&#160;        {</div><div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div><div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;            json.BeginArray();</div><div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l08117"></a><span class="lineno"> 8117</span>&#160;            {</div><div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div><div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>&#160;            }</div><div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>&#160;            json.EndArray();</div><div class="line"><a name="l08121"></a><span class="lineno"> 8121</span>&#160;        }</div><div class="line"><a name="l08122"></a><span class="lineno"> 8122</span>&#160;    }</div><div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;}</div><div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;</div><div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160;</div><div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;<span class="keyword">static</span> VkResult AllocateMemoryForImage(</div><div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>&#160;    VkImage image,</div><div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160;    VmaAllocation* pAllocation)</div><div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;{</div><div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>&#160;    VMA_ASSERT(allocator &amp;&amp; (image != VK_NULL_HANDLE) &amp;&amp; pAllocationCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;    </div><div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l08137"></a><span class="lineno"> 8137</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div><div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l08141"></a><span class="lineno"> 8141</span>&#160;</div><div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;AllocateMemory(</div><div class="line"><a name="l08143"></a><span class="lineno"> 8143</span>&#160;        vkMemReq,</div><div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;        image, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;        *pAllocationCreateInfo,</div><div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160;        suballocType,</div><div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>&#160;        pAllocation);</div><div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;}</div><div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>&#160;</div><div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>&#160;<span class="comment">// Public interface</span></div><div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160;</div><div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;    VmaAllocator* pAllocator)</div><div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>&#160;{</div><div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div><div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div><div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>&#160;    *pAllocator = vma_new(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>, VmaAllocator_T)(pCreateInfo);</div><div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>&#160;}</div><div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;</div><div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div><div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>&#160;    VmaAllocator allocator)</div><div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;{</div><div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div><div class="line"><a name="l08170"></a><span class="lineno"> 8170</span>&#160;    {</div><div class="line"><a name="l08171"></a><span class="lineno"> 8171</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div><div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div><div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div><div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>&#160;    }</div><div class="line"><a name="l08175"></a><span class="lineno"> 8175</span>&#160;}</div><div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;</div><div class="line"><a name="l08177"></a><span class="lineno"> 8177</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div><div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div><div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;{</div><div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div><div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div><div class="line"><a name="l08183"></a><span class="lineno"> 8183</span>&#160;}</div><div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>&#160;</div><div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div><div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div><div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>&#160;{</div><div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div><div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160;}</div><div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>&#160;</div><div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div><div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;    VkMemoryPropertyFlags* pFlags)</div><div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;{</div><div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div><div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div><div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div><div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>&#160;}</div><div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>&#160;</div><div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div><div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>&#160;    uint32_t frameIndex)</div><div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>&#160;{</div><div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160;</div><div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>&#160;</div><div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div><div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>&#160;}</div><div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>&#160;</div><div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div><div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;{</div><div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div><div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;    allocator-&gt;CalculateStats(pStats);</div><div class="line"><a name="l08222"></a><span class="lineno"> 8222</span>&#160;}</div><div class="line"><a name="l08223"></a><span class="lineno"> 8223</span>&#160;</div><div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;</div><div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div><div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>&#160;    VkBool32 detailedMap)</div><div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>&#160;{</div><div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div><div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08233"></a><span class="lineno"> 8233</span>&#160;</div><div class="line"><a name="l08234"></a><span class="lineno"> 8234</span>&#160;    VmaStringBuilder sb(allocator);</div><div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;    {</div><div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div><div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;        json.BeginObject();</div><div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;</div><div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div><div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div><div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>&#160;</div><div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div><div class="line"><a name="l08243"></a><span class="lineno"> 8243</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l08244"></a><span class="lineno"> 8244</span>&#160;    </div><div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l08246"></a><span class="lineno"> 8246</span>&#160;        {</div><div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div><div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>&#160;            json.ContinueString(heapIndex);</div><div class="line"><a name="l08249"></a><span class="lineno"> 8249</span>&#160;            json.EndString();</div><div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;            json.BeginObject();</div><div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160;</div><div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div><div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>&#160;</div><div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160;            <span class="keywordflow">if</span>((allocator-&gt;m_MemProps.memoryHeaps[heapIndex].flags &amp; VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;            {</div><div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>&#160;            }</div><div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>&#160;            json.EndArray();</div><div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160;</div><div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;            <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div><div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;            {</div><div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div><div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;            }</div><div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160;</div><div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div><div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160;            {</div><div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div><div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>&#160;                {</div><div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;                    json.ContinueString(typeIndex);</div><div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>&#160;                    json.EndString();</div><div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>&#160;</div><div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;</div><div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l08280"></a><span class="lineno"> 8280</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l08281"></a><span class="lineno"> 8281</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div><div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>&#160;                    {</div><div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>&#160;                    }</div><div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;                    {</div><div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div><div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;                    }</div><div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div><div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>&#160;                    {</div><div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div><div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;                    }</div><div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div><div class="line"><a name="l08295"></a><span class="lineno"> 8295</span>&#160;                    {</div><div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div><div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>&#160;                    }</div><div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div><div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;                    {</div><div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div><div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;                    }</div><div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;                    json.EndArray();</div><div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;</div><div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160;                    <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div><div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160;                    {</div><div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div><div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>&#160;                    }</div><div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>&#160;</div><div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>&#160;                    json.EndObject();</div><div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>&#160;                }</div><div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160;            }</div><div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160;</div><div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;            json.EndObject();</div><div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>&#160;        }</div><div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div><div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;        {</div><div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160;        }</div><div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>&#160;</div><div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>&#160;        json.EndObject();</div><div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;    }</div><div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;</div><div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div><div class="line"><a name="l08325"></a><span class="lineno"> 8325</span>&#160;    <span class="keywordtype">char</span>* <span class="keyword">const</span> pChars = vma_new_array(allocator, <span class="keywordtype">char</span>, len + 1);</div><div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div><div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;    {</div><div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;        memcpy(pChars, sb.GetData(), len);</div><div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;    }</div><div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;    *ppStatsString = pChars;</div><div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>&#160;}</div><div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>&#160;</div><div class="line"><a name="l08334"></a><span class="lineno"> 8334</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div><div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;{</div><div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div><div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;    {</div><div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div><div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div><div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>&#160;    }</div><div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>&#160;}</div><div class="line"><a name="l08345"></a><span class="lineno"> 8345</span>&#160;</div><div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;</div><div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;<span class="comment">This function is not protected by any mutex because it just reads immutable data.</span></div><div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>&#160;{</div><div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;</div><div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>&#160;    <span class="keywordflow">if</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> != 0)</div><div class="line"><a name="l08362"></a><span class="lineno"> 8362</span>&#160;    {</div><div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;        memoryTypeBits &amp;= pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>&#160;    }</div><div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>&#160;    </div><div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160;    uint32_t requiredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>&#160;    uint32_t preferredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>&#160;</div><div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div><div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>&#160;    <span class="keywordflow">switch</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>)</div><div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160;    {</div><div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a>:</div><div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>:</div><div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>:</div><div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>:</div><div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a>:</div><div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>&#160;    }</div><div class="line"><a name="l08391"></a><span class="lineno"> 8391</span>&#160;</div><div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div><div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;    uint32_t minCost = UINT32_MAX;</div><div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div><div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div><div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div><div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>&#160;    {</div><div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div><div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>&#160;        {</div><div class="line"><a name="l08401"></a><span class="lineno"> 8401</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div><div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div><div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div><div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div><div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;            {</div><div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>&#160;                <span class="comment">// Calculate cost as number of bits from preferredFlags not present in this memory type.</span></div><div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags);</div><div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div><div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div><div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;                {</div><div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div><div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>&#160;                    {</div><div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08415"></a><span class="lineno"> 8415</span>&#160;                    }</div><div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>&#160;                    minCost = currCost;</div><div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;                }</div><div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>&#160;            }</div><div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>&#160;        }</div><div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>&#160;    }</div><div class="line"><a name="l08421"></a><span class="lineno"> 8421</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160;}</div><div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;</div><div class="line"><a name="l08424"></a><span class="lineno"> 8424</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l08425"></a><span class="lineno"> 8425</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;{</div><div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div><div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>&#160;</div><div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div><div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div><div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;    {</div><div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div><div class="line"><a name="l08443"></a><span class="lineno"> 8443</span>&#160;            hDev, hBuffer, &amp;memReq);</div><div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160;</div><div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>&#160;            allocator,</div><div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>&#160;</div><div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div><div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;    }</div><div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;}</div><div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;</div><div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;{</div><div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div><div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>&#160;</div><div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l08469"></a><span class="lineno"> 8469</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div><div class="line"><a name="l08470"></a><span class="lineno"> 8470</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div><div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div><div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;    {</div><div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div><div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;            hDev, hImage, &amp;memReq);</div><div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>&#160;</div><div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;            allocator,</div><div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l08482"></a><span class="lineno"> 8482</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>&#160;</div><div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div><div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>&#160;    }</div><div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>&#160;}</div><div class="line"><a name="l08489"></a><span class="lineno"> 8489</span>&#160;</div><div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>&#160;    VmaPool* pPool)</div><div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>&#160;{</div><div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div><div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>&#160;</div><div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div><div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;</div><div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>&#160;</div><div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CreatePool(pCreateInfo, pPool);</div><div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>&#160;}</div><div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>&#160;</div><div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div><div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;    VmaPool pool)</div><div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;{</div><div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l08509"></a><span class="lineno"> 8509</span>&#160;</div><div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div><div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;    {</div><div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>&#160;    }</div><div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>&#160;</div><div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div><div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>&#160;</div><div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>&#160;</div><div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>&#160;    allocator-&gt;DestroyPool(pool);</div><div class="line"><a name="l08520"></a><span class="lineno"> 8520</span>&#160;}</div><div class="line"><a name="l08521"></a><span class="lineno"> 8521</span>&#160;</div><div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div><div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;    VmaPool pool,</div><div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;{</div><div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div><div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160;</div><div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>&#160;</div><div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div><div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>&#160;}</div><div class="line"><a name="l08533"></a><span class="lineno"> 8533</span>&#160;</div><div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div><div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>&#160;    VmaPool pool,</div><div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>&#160;{</div><div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;</div><div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>&#160;</div><div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div><div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;}</div><div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;</div><div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>&#160;{</div><div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160;</div><div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div><div class="line"><a name="l08556"></a><span class="lineno"> 8556</span>&#160;</div><div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;</div><div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;        *pVkMemoryRequirements,</div><div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div><div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div><div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div><div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>&#160;        pAllocation);</div><div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>&#160;</div><div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>&#160;    {</div><div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;    }</div><div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160;</div><div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l08575"></a><span class="lineno"> 8575</span>&#160;}</div><div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>&#160;</div><div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l08580"></a><span class="lineno"> 8580</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08583"></a><span class="lineno"> 8583</span>&#160;{</div><div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>&#160;</div><div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div><div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160;</div><div class="line"><a name="l08588"></a><span class="lineno"> 8588</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08589"></a><span class="lineno"> 8589</span>&#160;</div><div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div><div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;        prefersDedicatedAllocation);</div><div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>&#160;</div><div class="line"><a name="l08597"></a><span class="lineno"> 8597</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;        vkMemReq,</div><div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160;        pAllocation);</div><div class="line"><a name="l08606"></a><span class="lineno"> 8606</span>&#160;</div><div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;    {</div><div class="line"><a name="l08609"></a><span class="lineno"> 8609</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>&#160;    }</div><div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;</div><div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>&#160;}</div><div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;</div><div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;    VkImage image,</div><div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;{</div><div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>&#160;</div><div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div><div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160;</div><div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>&#160;</div><div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>&#160;    VkResult result = AllocateMemoryForImage(</div><div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>&#160;        allocator,</div><div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>&#160;        image,</div><div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;        pCreateInfo,</div><div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div><div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160;        pAllocation);</div><div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;</div><div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>&#160;    {</div><div class="line"><a name="l08637"></a><span class="lineno"> 8637</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>&#160;    }</div><div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;</div><div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>&#160;}</div><div class="line"><a name="l08642"></a><span class="lineno"> 8642</span>&#160;</div><div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div><div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08645"></a><span class="lineno"> 8645</span>&#160;    VmaAllocation allocation)</div><div class="line"><a name="l08646"></a><span class="lineno"> 8646</span>&#160;{</div><div class="line"><a name="l08647"></a><span class="lineno"> 8647</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>&#160;</div><div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div><div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;</div><div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160;</div><div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160;    allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;}</div><div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;</div><div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div><div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>&#160;    VmaAllocation allocation,</div><div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;{</div><div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div><div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>&#160;</div><div class="line"><a name="l08663"></a><span class="lineno"> 8663</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>&#160;</div><div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div><div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160;}</div><div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>&#160;</div><div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;    VmaAllocation allocation)</div><div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160;{</div><div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l08673"></a><span class="lineno"> 8673</span>&#160;</div><div class="line"><a name="l08674"></a><span class="lineno"> 8674</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>&#160;</div><div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div><div class="line"><a name="l08677"></a><span class="lineno"> 8677</span>&#160;}</div><div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>&#160;</div><div class="line"><a name="l08679"></a><span class="lineno"> 8679</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div><div class="line"><a name="l08680"></a><span class="lineno"> 8680</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>&#160;    VmaAllocation allocation,</div><div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>&#160;{</div><div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>&#160;</div><div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;</div><div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div><div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>&#160;}</div><div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;</div><div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div><div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>&#160;    VmaAllocation* pAllocation)</div><div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>&#160;{</div><div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div><div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>&#160;</div><div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div><div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160;</div><div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div><div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>&#160;}</div><div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;</div><div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;    VmaAllocation allocation,</div><div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;    <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>&#160;{</div><div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div><div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>&#160;</div><div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>&#160;</div><div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;Map(allocation, ppData);</div><div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;}</div><div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160;</div><div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div><div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;    VmaAllocation allocation)</div><div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>&#160;{</div><div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>&#160;</div><div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>&#160;</div><div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>&#160;    allocator-&gt;Unmap(allocation);</div><div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;}</div><div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>&#160;</div><div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>&#160;    VmaAllocation* pAllocations,</div><div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l08729"></a><span class="lineno"> 8729</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div><div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>&#160;{</div><div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocations);</div><div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;</div><div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragment&quot;</span>);</div><div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>&#160;</div><div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>&#160;</div><div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;Defragment(pAllocations, allocationCount, pAllocationsChanged, pDefragmentationInfo, pDefragmentationStats);</div><div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;}</div><div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;</div><div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08744"></a><span class="lineno"> 8744</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l08745"></a><span class="lineno"> 8745</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>&#160;{</div><div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div><div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;    </div><div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div><div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>&#160;    </div><div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>&#160;</div><div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>&#160;</div><div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div><div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>&#160;        pBufferCreateInfo,</div><div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;        pBuffer);</div><div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>&#160;    {</div><div class="line"><a name="l08767"></a><span class="lineno"> 8767</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div><div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div><div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>&#160;</div><div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>&#160;         <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div><div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>&#160;         <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div><div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0)</div><div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>&#160;        {</div><div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div><div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;        }</div><div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div><div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>&#160;        {</div><div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div><div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160;        }</div><div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div><div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>&#160;        {</div><div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div><div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160;        }</div><div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>&#160;</div><div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div><div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;            vkMemReq,</div><div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;            pAllocation);</div><div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>&#160;        {</div><div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div><div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160;            res = (*allocator-&gt;GetVulkanFunctions().vkBindBufferMemory)(</div><div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;                allocator-&gt;m_hDevice,</div><div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;                *pBuffer,</div><div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;                (*pAllocation)-&gt;GetMemory(),</div><div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;                (*pAllocation)-&gt;GetOffset());</div><div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160;            {</div><div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>&#160;                {</div><div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>&#160;                }</div><div class="line"><a name="l08817"></a><span class="lineno"> 8817</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08818"></a><span class="lineno"> 8818</span>&#160;            }</div><div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08822"></a><span class="lineno"> 8822</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l08823"></a><span class="lineno"> 8823</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;        }</div><div class="line"><a name="l08825"></a><span class="lineno"> 8825</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>&#160;    }</div><div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08830"></a><span class="lineno"> 8830</span>&#160;}</div><div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>&#160;</div><div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div><div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>&#160;    VmaAllocation allocation)</div><div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>&#160;{</div><div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div><div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160;    {</div><div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;</div><div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div><div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>&#160;</div><div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>&#160;</div><div class="line"><a name="l08845"></a><span class="lineno"> 8845</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08846"></a><span class="lineno"> 8846</span>&#160;        </div><div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>&#160;    }</div><div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>&#160;}</div><div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;</div><div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;    VmaAllocation* pAllocation,</div><div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>&#160;{</div><div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div><div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;</div><div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div><div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>&#160;</div><div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08864"></a><span class="lineno"> 8864</span>&#160;</div><div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>&#160;    *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l08867"></a><span class="lineno"> 8867</span>&#160;</div><div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div><div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div><div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;        pImageCreateInfo,</div><div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;        pImage);</div><div class="line"><a name="l08874"></a><span class="lineno"> 8874</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>&#160;    {</div><div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div><div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div><div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div><div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;        </div><div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div><div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>&#160;        res = AllocateMemoryForImage(allocator, *pImage, pAllocationCreateInfo, suballocType, pAllocation);</div><div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>&#160;        {</div><div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div><div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>&#160;            res = (*allocator-&gt;GetVulkanFunctions().vkBindImageMemory)(</div><div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>&#160;                allocator-&gt;m_hDevice,</div><div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;                *pImage,</div><div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160;                (*pAllocation)-&gt;GetMemory(),</div><div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;                (*pAllocation)-&gt;GetOffset());</div><div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;            {</div><div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>&#160;                {</div><div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>&#160;                }</div><div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;            }</div><div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>&#160;            *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>&#160;        }</div><div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>&#160;        *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>&#160;    }</div><div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160;}</div><div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>&#160;</div><div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div><div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;    VmaAllocator allocator,</div><div class="line"><a name="l08914"></a><span class="lineno"> 8914</span>&#160;    VkImage image,</div><div class="line"><a name="l08915"></a><span class="lineno"> 8915</span>&#160;    VmaAllocation allocation)</div><div class="line"><a name="l08916"></a><span class="lineno"> 8916</span>&#160;{</div><div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div><div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>&#160;    {</div><div class="line"><a name="l08919"></a><span class="lineno"> 8919</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160;</div><div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div><div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>&#160;</div><div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>&#160;</div><div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;</div><div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;    }</div><div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;}</div><div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>&#160;</div><div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>&#160;<span class="preprocessor">#endif // #ifdef VMA_IMPLEMENTATION</span></div><div class="ttc" id="struct_vma_vulkan_functions_html_a77b7a74082823e865dd6546623468f96"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">VmaVulkanFunctions::vkGetPhysicalDeviceProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:896</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a></div><div class="ttdoc">Set this flag if the allocation should have its own memory block. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1150</div></div>
+<a href="vk__mem__alloc_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright (c) 2017-2018 Advanced Micro Devices, Inc. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">// Permission is hereby granted, free of charge, to any person obtaining a copy</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="comment">// of this software and associated documentation files (the &quot;Software&quot;), to deal</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="comment">// in the Software without restriction, including without limitation the rights</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="comment">// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="comment">// copies of the Software, and to permit persons to whom the Software is</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="comment">// furnished to do so, subject to the following conditions:</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="comment">// The above copyright notice and this permission notice shall be included in</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="comment">// all copies or substantial portions of the Software.</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="comment">// THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="comment">// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="comment">// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE</span></div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="comment">// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="comment">// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="comment">// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="comment">// THE SOFTWARE.</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#ifndef AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#define AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="keyword">extern</span> <span class="stringliteral">&quot;C&quot;</span> {</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;<span class="preprocessor">#include &lt;vulkan/vulkan.h&gt;</span></div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a>)(</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01094"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49"> 1094</a></span>&#160;<span class="keyword">typedef</span> void (VKAPI_PTR *<a class="code" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a>)(</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;</div><div class="line"><a name="l01107"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 1107</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> {</div><div class="line"><a name="l01109"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 1109</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a> <a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div><div class="line"><a name="l01111"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 1111</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a> <a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;</div><div class="line"><a name="l01115"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 1115</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a> {</div><div class="line"><a name="l01120"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 1120</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a> = 0x00000001,</div><div class="line"><a name="l01142"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 1142</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> = 0x00000002,</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;</div><div class="line"><a name="l01144"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 1144</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div><div class="line"><a name="l01146"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 1146</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a>;</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;</div><div class="line"><a name="l01152"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 1152</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> {</div><div class="line"><a name="l01153"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 1153</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div><div class="line"><a name="l01154"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 1154</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div><div class="line"><a name="l01155"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 1155</a></span>&#160;    PFN_vkAllocateMemory <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div><div class="line"><a name="l01156"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 1156</a></span>&#160;    PFN_vkFreeMemory <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div><div class="line"><a name="l01157"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 1157</a></span>&#160;    PFN_vkMapMemory <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div><div class="line"><a name="l01158"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 1158</a></span>&#160;    PFN_vkUnmapMemory <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div><div class="line"><a name="l01159"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 1159</a></span>&#160;    PFN_vkBindBufferMemory <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div><div class="line"><a name="l01160"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 1160</a></span>&#160;    PFN_vkBindImageMemory <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div><div class="line"><a name="l01161"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 1161</a></span>&#160;    PFN_vkGetBufferMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div><div class="line"><a name="l01162"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 1162</a></span>&#160;    PFN_vkGetImageMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div><div class="line"><a name="l01163"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 1163</a></span>&#160;    PFN_vkCreateBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div><div class="line"><a name="l01164"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 1164</a></span>&#160;    PFN_vkDestroyBuffer <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div><div class="line"><a name="l01165"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 1165</a></span>&#160;    PFN_vkCreateImage <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div><div class="line"><a name="l01166"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 1166</a></span>&#160;    PFN_vkDestroyImage <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div><div class="line"><a name="l01167"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a9d8d1b05d2b1e7e1d9b27f6f585acf9c"> 1167</a></span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR <a class="code" href="struct_vma_vulkan_functions.html#a9d8d1b05d2b1e7e1d9b27f6f585acf9c">vkGetBufferMemoryRequirements2KHR</a>;</div><div class="line"><a name="l01168"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a9cdcdc1e2b2ea7c571f7d27e30ba6875"> 1168</a></span>&#160;    PFN_vkGetImageMemoryRequirements2KHR <a class="code" href="struct_vma_vulkan_functions.html#a9cdcdc1e2b2ea7c571f7d27e30ba6875">vkGetImageMemoryRequirements2KHR</a>;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a>;</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;</div><div class="line"><a name="l01172"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 1172</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;{</div><div class="line"><a name="l01175"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 1175</a></span>&#160;    VmaAllocatorCreateFlags <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;</div><div class="line"><a name="l01178"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 1178</a></span>&#160;    VkPhysicalDevice <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;</div><div class="line"><a name="l01181"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 1181</a></span>&#160;    VkDevice <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;</div><div class="line"><a name="l01184"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 1184</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;</div><div class="line"><a name="l01187"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 1187</a></span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>;</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;</div><div class="line"><a name="l01190"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 1190</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a>* <a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01204"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 1204</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div><div class="line"><a name="l01228"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 1228</a></span>&#160;    <span class="keyword">const</span> VkDeviceSize* <a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>;</div><div class="line"><a name="l01240"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 1240</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* <a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>;</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a>;</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator);</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;</div><div class="line"><a name="l01249"></a><span class="lineno"> 1249</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties** ppPhysicalDeviceProperties);</div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div><div class="line"><a name="l01265"></a><span class="lineno"> 1265</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</span>&#160;</div><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;    VkMemoryPropertyFlags* pFlags);</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;    uint32_t frameIndex);</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;</div><div class="line"><a name="l01293"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 1293</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="line"><a name="l01294"></a><span class="lineno"> 1294</span>&#160;{</div><div class="line"><a name="l01296"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 1296</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l01298"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 1298</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l01300"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 1300</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l01302"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 1302</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l01304"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 1304</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l01305"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 1305</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocationSizeAvg, allocationSizeMax;</div><div class="line"><a name="l01306"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 1306</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSizeAvg, unusedRangeSizeMax;</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a>;</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;</div><div class="line"><a name="l01310"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 1310</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_stats.html">VmaStats</a></div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;{</div><div class="line"><a name="l01312"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 1312</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryType[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l01313"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 1313</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> memoryHeap[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l01314"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 1314</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>;</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a>;</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;</div><div class="line"><a name="l01322"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 1322</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;    VkBool32 detailedMap);</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;    <span class="keywordtype">char</span>* pStatsString);</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;</div><div class="line"><a name="l01350"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 1350</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;{</div><div class="line"><a name="l01355"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 1355</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a> = 0,</div><div class="line"><a name="l01372"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 1372</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a> = 1,</div><div class="line"><a name="l01382"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 1382</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a> = 2,</div><div class="line"><a name="l01389"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 1389</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a> = 3,</div><div class="line"><a name="l01398"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 1398</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a> = 4,</div><div class="line"><a name="l01399"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 1399</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;</div><div class="line"><a name="l01403"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 1403</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a> {</div><div class="line"><a name="l01415"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 1415</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a> = 0x00000001,</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;</div><div class="line"><a name="l01426"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 1426</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a> = 0x00000002,</div><div class="line"><a name="l01439"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 1439</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a> = 0x00000004,</div><div class="line"><a name="l01452"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 1452</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> = 0x00000008,</div><div class="line"><a name="l01459"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 1459</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a> = 0x00000010,</div><div class="line"><a name="l01465"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 1465</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a> = 0x00000020,</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;</div><div class="line"><a name="l01467"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 1467</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div><div class="line"><a name="l01469"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 1469</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a>;</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;</div><div class="line"><a name="l01471"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 1471</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;{</div><div class="line"><a name="l01474"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 1474</a></span>&#160;    VmaAllocationCreateFlags <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div><div class="line"><a name="l01480"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 1480</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a> <a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>;</div><div class="line"><a name="l01485"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 1485</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l01490"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 1490</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l01498"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 1498</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l01504"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 1504</a></span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> <a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>;</div><div class="line"><a name="l01511"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 1511</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>;</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a>;</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;</div><div class="line"><a name="l01573"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 1573</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a> {</div><div class="line"><a name="l01591"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 1591</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a> = 0x00000002,</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;</div><div class="line"><a name="l01593"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 1593</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div><div class="line"><a name="l01595"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 1595</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a>;</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;</div><div class="line"><a name="l01599"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 1599</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> {</div><div class="line"><a name="l01602"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 1602</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div><div class="line"><a name="l01605"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 1605</a></span>&#160;    VmaPoolCreateFlags <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div><div class="line"><a name="l01610"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 1610</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div><div class="line"><a name="l01615"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 1615</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>;</div><div class="line"><a name="l01623"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 1623</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>;</div><div class="line"><a name="l01637"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 1637</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a>;</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;</div><div class="line"><a name="l01642"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 1642</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a> {</div><div class="line"><a name="l01645"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 1645</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div><div class="line"><a name="l01648"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 1648</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div><div class="line"><a name="l01651"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 1651</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</div><div class="line"><a name="l01654"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 1654</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l01661"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 1661</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a>;</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;</div><div class="line"><a name="l01687"></a><span class="lineno"> 1687</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;</div><div class="line"><a name="l01731"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 1731</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div><div class="line"><a name="l01736"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 1736</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div><div class="line"><a name="l01745"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 1745</a></span>&#160;    VkDeviceMemory <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line"><a name="l01750"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 1750</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line"><a name="l01755"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 1755</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line"><a name="l01764"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 1764</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a>;</div><div class="line"><a name="l01769"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 1769</a></span>&#160;    <span class="keywordtype">void</span>* <a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a>;</div><div class="line"><a name="l01770"></a><span class="lineno"> 1770</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a>;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;    VkImage image,</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;</div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</span>&#160;</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</span>&#160;    <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div><div class="line"><a name="l01883"></a><span class="lineno"> 1883</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l01885"></a><span class="lineno"> 1885</span>&#160;</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;    <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;</div><div class="line"><a name="l01934"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 1934</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> {</div><div class="line"><a name="l01939"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 1939</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l01944"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 1944</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>;</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;</div><div class="line"><a name="l01948"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 1948</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> {</div><div class="line"><a name="l01950"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 1950</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l01952"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 1952</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div><div class="line"><a name="l01954"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 1954</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l01956"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 1956</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a>;</div><div class="line"><a name="l01958"></a><span class="lineno"> 1958</span>&#160;</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l02062"></a><span class="lineno"> 2062</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;    VkBuffer buffer);</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;    VkImage image);</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;    VkImage image,</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;<span class="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;}</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;<span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;<span class="preprocessor">#ifdef __INTELLISENSE__</span></div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;<span class="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;<span class="comment">Define some of these macros before each #include of this header or change them</span></div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;<span class="comment">Define this macro to 1 to make the library fetch pointers to Vulkan functions</span></div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;<span class="comment">internally, like:</span></div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160;<span class="comment">Define to 0 if you are going to provide you own pointers to Vulkan functions via</span></div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;<span class="comment">VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160;<span class="preprocessor">#define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160;</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;<span class="comment">// Define this macro to 1 to make the library use STL containers instead of its own implementation.</span></div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160;</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;<span class="comment">Set it to 0 or undefined to make the library using its own implementation of</span></div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;<span class="comment">the containers.</span></div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</span>&#160;<span class="comment">Following headers are used in this CONFIGURATION section only, so feel free to</span></div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;<span class="comment">remove them if not needed.</span></div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span> <span class="comment">// for std::mutex</span></div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;<span class="preprocessor">#include &lt;atomic&gt;</span> <span class="comment">// for std::atomic</span></div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;<span class="preprocessor">#if !defined(_WIN32) &amp;&amp; !defined(__APPLE__)</span></div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;<span class="preprocessor">    #include &lt;malloc.h&gt;</span> <span class="comment">// for aligned_alloc()</span></div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;   <span class="comment">// Value used as null pointer. Define it to e.g.: nullptr, NULL, 0, (void*)0.</span></div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;<span class="preprocessor">#if defined(__APPLE__) || defined(__ANDROID__)</span></div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;<span class="keywordtype">void</span> *aligned_alloc(<span class="keywordtype">size_t</span> alignment, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;{</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;    <span class="keywordflow">if</span>(alignment &lt; <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*))</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;    {</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;    }</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;    <span class="keywordtype">void</span> *pointer;</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;        <span class="keywordflow">return</span> pointer;</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;}</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;<span class="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160;</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160;</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160;</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160;<span class="preprocessor">#ifndef VMA_MIN</span></div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160;<span class="preprocessor">#ifndef VMA_MAX</span></div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160;</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160;</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_LOG</span></div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160;   <span class="comment">/*</span></div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160;<span class="comment">   } while(false)</span></div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160;<span class="comment">   */</span></div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160;</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160;   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint32ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint32_t num)</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160;   {</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160;       snprintf(outStr, strLen, <span class="stringliteral">&quot;%u&quot;</span>, static_cast&lt;unsigned int&gt;(num));</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160;   }</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160;   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaUint64ToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, uint64_t num)</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>&#160;   {</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>&#160;       snprintf(outStr, strLen, <span class="stringliteral">&quot;%llu&quot;</span>, static_cast&lt;unsigned long long&gt;(num));</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;   }</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> VmaPtrToStr(<span class="keywordtype">char</span>* outStr, <span class="keywordtype">size_t</span> strLen, <span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>&#160;   {</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160;       snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160;   }</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;   <span class="keyword">class </span>VmaMutex</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160;   {</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;   <span class="keyword">public</span>:</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160;       VmaMutex() { }</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160;       ~VmaMutex() { }</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;       <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;       <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160;   <span class="keyword">private</span>:</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;       std::mutex m_Mutex;</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;   };</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;<span class="preprocessor">   #define VMA_MUTEX VmaMutex</span></div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;<span class="comment">If providing your own implementation, you need to implement a subset of std::atomic:</span></div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160;<span class="comment">- Constructor(uint32_t desired)</span></div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;<span class="comment">- uint32_t load() const</span></div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;<span class="comment">- void store(uint32_t desired)</span></div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160;<span class="comment">- bool compare_exchange_weak(uint32_t&amp; expected, uint32_t desired)</span></div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160;<span class="preprocessor">   #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160;<span class="preprocessor">#ifndef VMA_BEST_FIT</span></div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;<span class="preprocessor">   #define VMA_BEST_FIT (1)</span></div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160;</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</span>&#160;</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_ALIGNMENT (1)</span></div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_MARGIN (0)</span></div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;</div><div class="line"><a name="l02413"></a><span class="lineno"> 2413</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;</div><div class="line"><a name="l02418"></a><span class="lineno"> 2418</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div><div class="line"><a name="l02419"></a><span class="lineno"> 2419</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02420"></a><span class="lineno"> 2420</span>&#160;</div><div class="line"><a name="l02421"></a><span class="lineno"> 2421</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div><div class="line"><a name="l02422"></a><span class="lineno"> 2422</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div><div class="line"><a name="l02424"></a><span class="lineno"> 2424</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;</div><div class="line"><a name="l02431"></a><span class="lineno"> 2431</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div><div class="line"><a name="l02432"></a><span class="lineno"> 2432</span>&#160;</div><div class="line"><a name="l02433"></a><span class="lineno"> 2433</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02434"></a><span class="lineno"> 2434</span>&#160;<span class="comment">END OF CONFIGURATION</span></div><div class="line"><a name="l02435"></a><span class="lineno"> 2435</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02436"></a><span class="lineno"> 2436</span>&#160;</div><div class="line"><a name="l02437"></a><span class="lineno"> 2437</span>&#160;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div><div class="line"><a name="l02438"></a><span class="lineno"> 2438</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</div><div class="line"><a name="l02439"></a><span class="lineno"> 2439</span>&#160;</div><div class="line"><a name="l02440"></a><span class="lineno"> 2440</span>&#160;<span class="comment">// Returns number of bits set to 1 in (v).</span></div><div class="line"><a name="l02441"></a><span class="lineno"> 2441</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160;{</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div><div class="line"><a name="l02446"></a><span class="lineno"> 2446</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div><div class="line"><a name="l02447"></a><span class="lineno"> 2447</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div><div class="line"><a name="l02448"></a><span class="lineno"> 2448</span>&#160;    <span class="keywordflow">return</span> c;</div><div class="line"><a name="l02449"></a><span class="lineno"> 2449</span>&#160;}</div><div class="line"><a name="l02450"></a><span class="lineno"> 2450</span>&#160;</div><div class="line"><a name="l02451"></a><span class="lineno"> 2451</span>&#160;<span class="comment">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div><div class="line"><a name="l02452"></a><span class="lineno"> 2452</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l02453"></a><span class="lineno"> 2453</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02454"></a><span class="lineno"> 2454</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</div><div class="line"><a name="l02455"></a><span class="lineno"> 2455</span>&#160;{</div><div class="line"><a name="l02456"></a><span class="lineno"> 2456</span>&#160;    <span class="keywordflow">return</span> (val + align - 1) / align * align;</div><div class="line"><a name="l02457"></a><span class="lineno"> 2457</span>&#160;}</div><div class="line"><a name="l02458"></a><span class="lineno"> 2458</span>&#160;</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></div><div class="line"><a name="l02460"></a><span class="lineno"> 2460</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160;<span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;{</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div><div class="line"><a name="l02464"></a><span class="lineno"> 2464</span>&#160;}</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l02470"></a><span class="lineno"> 2470</span>&#160;{</div><div class="line"><a name="l02471"></a><span class="lineno"> 2471</span>&#160;    Iterator centerValue = end; --centerValue;</div><div class="line"><a name="l02472"></a><span class="lineno"> 2472</span>&#160;    Iterator insertIndex = beg;</div><div class="line"><a name="l02473"></a><span class="lineno"> 2473</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</span>&#160;    {</div><div class="line"><a name="l02475"></a><span class="lineno"> 2475</span>&#160;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;        {</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div><div class="line"><a name="l02478"></a><span class="lineno"> 2478</span>&#160;            {</div><div class="line"><a name="l02479"></a><span class="lineno"> 2479</span>&#160;                VMA_SWAP(*memTypeIndex, *insertIndex);</div><div class="line"><a name="l02480"></a><span class="lineno"> 2480</span>&#160;            }</div><div class="line"><a name="l02481"></a><span class="lineno"> 2481</span>&#160;            ++insertIndex;</div><div class="line"><a name="l02482"></a><span class="lineno"> 2482</span>&#160;        }</div><div class="line"><a name="l02483"></a><span class="lineno"> 2483</span>&#160;    }</div><div class="line"><a name="l02484"></a><span class="lineno"> 2484</span>&#160;    <span class="keywordflow">if</span>(insertIndex != centerValue)</div><div class="line"><a name="l02485"></a><span class="lineno"> 2485</span>&#160;    {</div><div class="line"><a name="l02486"></a><span class="lineno"> 2486</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</div><div class="line"><a name="l02487"></a><span class="lineno"> 2487</span>&#160;    }</div><div class="line"><a name="l02488"></a><span class="lineno"> 2488</span>&#160;    <span class="keywordflow">return</span> insertIndex;</div><div class="line"><a name="l02489"></a><span class="lineno"> 2489</span>&#160;}</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l02492"></a><span class="lineno"> 2492</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l02493"></a><span class="lineno"> 2493</span>&#160;{</div><div class="line"><a name="l02494"></a><span class="lineno"> 2494</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</div><div class="line"><a name="l02495"></a><span class="lineno"> 2495</span>&#160;    {</div><div class="line"><a name="l02496"></a><span class="lineno"> 2496</span>&#160;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div><div class="line"><a name="l02497"></a><span class="lineno"> 2497</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div><div class="line"><a name="l02498"></a><span class="lineno"> 2498</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</div><div class="line"><a name="l02499"></a><span class="lineno"> 2499</span>&#160;    }</div><div class="line"><a name="l02500"></a><span class="lineno"> 2500</span>&#160;}</div><div class="line"><a name="l02501"></a><span class="lineno"> 2501</span>&#160;</div><div class="line"><a name="l02502"></a><span class="lineno"> 2502</span>&#160;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></div><div class="line"><a name="l02503"></a><span class="lineno"> 2503</span>&#160;</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160;<span class="preprocessor">#endif // #ifndef VMA_SORT</span></div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160;</div><div class="line"><a name="l02506"></a><span class="lineno"> 2506</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02507"></a><span class="lineno"> 2507</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div><div class="line"><a name="l02508"></a><span class="lineno"> 2508</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div><div class="line"><a name="l02509"></a><span class="lineno"> 2509</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02510"></a><span class="lineno"> 2510</span>&#160;<span class="comment">Algorithm is based on &quot;Vulkan 1.0.39 - A Specification (with all registered Vulkan extensions)&quot;</span></div><div class="line"><a name="l02511"></a><span class="lineno"> 2511</span>&#160;<span class="comment">chapter 11.6 &quot;Resource Memory Association&quot;, paragraph &quot;Buffer-Image Granularity&quot;.</span></div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;    VkDeviceSize resourceAOffset,</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;    VkDeviceSize resourceASize,</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160;    VkDeviceSize resourceBOffset,</div><div class="line"><a name="l02517"></a><span class="lineno"> 2517</span>&#160;    VkDeviceSize pageSize)</div><div class="line"><a name="l02518"></a><span class="lineno"> 2518</span>&#160;{</div><div class="line"><a name="l02519"></a><span class="lineno"> 2519</span>&#160;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div><div class="line"><a name="l02520"></a><span class="lineno"> 2520</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</div><div class="line"><a name="l02525"></a><span class="lineno"> 2525</span>&#160;}</div><div class="line"><a name="l02526"></a><span class="lineno"> 2526</span>&#160;</div><div class="line"><a name="l02527"></a><span class="lineno"> 2527</span>&#160;<span class="keyword">enum</span> VmaSuballocationType</div><div class="line"><a name="l02528"></a><span class="lineno"> 2528</span>&#160;{</div><div class="line"><a name="l02529"></a><span class="lineno"> 2529</span>&#160;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div><div class="line"><a name="l02533"></a><span class="lineno"> 2533</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div><div class="line"><a name="l02534"></a><span class="lineno"> 2534</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div><div class="line"><a name="l02535"></a><span class="lineno"> 2535</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div><div class="line"><a name="l02536"></a><span class="lineno"> 2536</span>&#160;};</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02539"></a><span class="lineno"> 2539</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div><div class="line"><a name="l02540"></a><span class="lineno"> 2540</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div><div class="line"><a name="l02541"></a><span class="lineno"> 2541</span>&#160;<span class="comment">or linear image and another one is optimal image. If type is unknown, behave</span></div><div class="line"><a name="l02542"></a><span class="lineno"> 2542</span>&#160;<span class="comment">conservatively.</span></div><div class="line"><a name="l02543"></a><span class="lineno"> 2543</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02544"></a><span class="lineno"> 2544</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div><div class="line"><a name="l02545"></a><span class="lineno"> 2545</span>&#160;    VmaSuballocationType suballocType1,</div><div class="line"><a name="l02546"></a><span class="lineno"> 2546</span>&#160;    VmaSuballocationType suballocType2)</div><div class="line"><a name="l02547"></a><span class="lineno"> 2547</span>&#160;{</div><div class="line"><a name="l02548"></a><span class="lineno"> 2548</span>&#160;    <span class="keywordflow">if</span>(suballocType1 &gt; suballocType2)</div><div class="line"><a name="l02549"></a><span class="lineno"> 2549</span>&#160;    {</div><div class="line"><a name="l02550"></a><span class="lineno"> 2550</span>&#160;        VMA_SWAP(suballocType1, suballocType2);</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;    }</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;    </div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160;    {</div><div class="line"><a name="l02555"></a><span class="lineno"> 2555</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div><div class="line"><a name="l02556"></a><span class="lineno"> 2556</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div><div class="line"><a name="l02558"></a><span class="lineno"> 2558</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div><div class="line"><a name="l02560"></a><span class="lineno"> 2560</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02561"></a><span class="lineno"> 2561</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l02562"></a><span class="lineno"> 2562</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02563"></a><span class="lineno"> 2563</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div><div class="line"><a name="l02564"></a><span class="lineno"> 2564</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02565"></a><span class="lineno"> 2565</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l02566"></a><span class="lineno"> 2566</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div><div class="line"><a name="l02567"></a><span class="lineno"> 2567</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02568"></a><span class="lineno"> 2568</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l02571"></a><span class="lineno"> 2571</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div><div class="line"><a name="l02572"></a><span class="lineno"> 2572</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l02573"></a><span class="lineno"> 2573</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l02574"></a><span class="lineno"> 2574</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l02575"></a><span class="lineno"> 2575</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l02576"></a><span class="lineno"> 2576</span>&#160;    }</div><div class="line"><a name="l02577"></a><span class="lineno"> 2577</span>&#160;}</div><div class="line"><a name="l02578"></a><span class="lineno"> 2578</span>&#160;</div><div class="line"><a name="l02579"></a><span class="lineno"> 2579</span>&#160;<span class="comment">// Helper RAII class to lock a mutex in constructor and unlock it in destructor (at the end of scope).</span></div><div class="line"><a name="l02580"></a><span class="lineno"> 2580</span>&#160;<span class="keyword">struct </span>VmaMutexLock</div><div class="line"><a name="l02581"></a><span class="lineno"> 2581</span>&#160;{</div><div class="line"><a name="l02582"></a><span class="lineno"> 2582</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</div><div class="line"><a name="l02585"></a><span class="lineno"> 2585</span>&#160;    {</div><div class="line"><a name="l02586"></a><span class="lineno"> 2586</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l02587"></a><span class="lineno"> 2587</span>&#160;        {</div><div class="line"><a name="l02588"></a><span class="lineno"> 2588</span>&#160;            m_pMutex-&gt;Lock();</div><div class="line"><a name="l02589"></a><span class="lineno"> 2589</span>&#160;        }</div><div class="line"><a name="l02590"></a><span class="lineno"> 2590</span>&#160;    }</div><div class="line"><a name="l02591"></a><span class="lineno"> 2591</span>&#160;    </div><div class="line"><a name="l02592"></a><span class="lineno"> 2592</span>&#160;    ~VmaMutexLock()</div><div class="line"><a name="l02593"></a><span class="lineno"> 2593</span>&#160;    {</div><div class="line"><a name="l02594"></a><span class="lineno"> 2594</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;        {</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;            m_pMutex-&gt;Unlock();</div><div class="line"><a name="l02597"></a><span class="lineno"> 2597</span>&#160;        }</div><div class="line"><a name="l02598"></a><span class="lineno"> 2598</span>&#160;    }</div><div class="line"><a name="l02599"></a><span class="lineno"> 2599</span>&#160;</div><div class="line"><a name="l02600"></a><span class="lineno"> 2600</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02601"></a><span class="lineno"> 2601</span>&#160;    VMA_MUTEX* m_pMutex;</div><div class="line"><a name="l02602"></a><span class="lineno"> 2602</span>&#160;};</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l02605"></a><span class="lineno"> 2605</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div><div class="line"><a name="l02606"></a><span class="lineno"> 2606</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div><div class="line"><a name="l02607"></a><span class="lineno"> 2607</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l02608"></a><span class="lineno"> 2608</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div><div class="line"><a name="l02609"></a><span class="lineno"> 2609</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02610"></a><span class="lineno"> 2610</span>&#160;</div><div class="line"><a name="l02611"></a><span class="lineno"> 2611</span>&#160;<span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div><div class="line"><a name="l02612"></a><span class="lineno"> 2612</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER = 16;</div><div class="line"><a name="l02613"></a><span class="lineno"> 2613</span>&#160;</div><div class="line"><a name="l02614"></a><span class="lineno"> 2614</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l02615"></a><span class="lineno"> 2615</span>&#160;<span class="comment">Performs binary search and returns iterator to first element that is greater or</span></div><div class="line"><a name="l02616"></a><span class="lineno"> 2616</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div><div class="line"><a name="l02617"></a><span class="lineno"> 2617</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02618"></a><span class="lineno"> 2618</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div><div class="line"><a name="l02619"></a><span class="lineno"> 2619</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;<span class="comment">Returned value is the found element, if present in the collection or place where</span></div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div><div class="line"><a name="l02622"></a><span class="lineno"> 2622</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02623"></a><span class="lineno"> 2623</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> CmpT&gt;</div><div class="line"><a name="l02624"></a><span class="lineno"> 2624</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, CmpT cmp)</div><div class="line"><a name="l02625"></a><span class="lineno"> 2625</span>&#160;{</div><div class="line"><a name="l02626"></a><span class="lineno"> 2626</span>&#160;   <span class="keywordtype">size_t</span> down = 0, up = (end - beg);</div><div class="line"><a name="l02627"></a><span class="lineno"> 2627</span>&#160;   <span class="keywordflow">while</span>(down &lt; up)</div><div class="line"><a name="l02628"></a><span class="lineno"> 2628</span>&#160;   {</div><div class="line"><a name="l02629"></a><span class="lineno"> 2629</span>&#160;      <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div><div class="line"><a name="l02630"></a><span class="lineno"> 2630</span>&#160;      <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div><div class="line"><a name="l02631"></a><span class="lineno"> 2631</span>&#160;      {</div><div class="line"><a name="l02632"></a><span class="lineno"> 2632</span>&#160;         down = mid + 1;</div><div class="line"><a name="l02633"></a><span class="lineno"> 2633</span>&#160;      }</div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>&#160;      <span class="keywordflow">else</span></div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;      {</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>&#160;         up = mid;</div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>&#160;      }</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>&#160;   }</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>&#160;   <span class="keywordflow">return</span> beg + down;</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</span>&#160;}</div><div class="line"><a name="l02641"></a><span class="lineno"> 2641</span>&#160;</div><div class="line"><a name="l02643"></a><span class="lineno"> 2643</span>&#160;<span class="comment">// Memory allocation</span></div><div class="line"><a name="l02644"></a><span class="lineno"> 2644</span>&#160;</div><div class="line"><a name="l02645"></a><span class="lineno"> 2645</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div><div class="line"><a name="l02646"></a><span class="lineno"> 2646</span>&#160;{</div><div class="line"><a name="l02647"></a><span class="lineno"> 2647</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l02648"></a><span class="lineno"> 2648</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</div><div class="line"><a name="l02649"></a><span class="lineno"> 2649</span>&#160;    {</div><div class="line"><a name="l02650"></a><span class="lineno"> 2650</span>&#160;        <span class="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div><div class="line"><a name="l02651"></a><span class="lineno"> 2651</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div><div class="line"><a name="l02652"></a><span class="lineno"> 2652</span>&#160;            size,</div><div class="line"><a name="l02653"></a><span class="lineno"> 2653</span>&#160;            alignment,</div><div class="line"><a name="l02654"></a><span class="lineno"> 2654</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160;    }</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>&#160;    {</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160;        <span class="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160;    }</div><div class="line"><a name="l02660"></a><span class="lineno"> 2660</span>&#160;}</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160;{</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;    {</div><div class="line"><a name="l02667"></a><span class="lineno"> 2667</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div><div class="line"><a name="l02668"></a><span class="lineno"> 2668</span>&#160;    }</div><div class="line"><a name="l02669"></a><span class="lineno"> 2669</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l02670"></a><span class="lineno"> 2670</span>&#160;    {</div><div class="line"><a name="l02671"></a><span class="lineno"> 2671</span>&#160;        VMA_SYSTEM_FREE(ptr);</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;    }</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;}</div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160;</div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</div><div class="line"><a name="l02677"></a><span class="lineno"> 2677</span>&#160;{</div><div class="line"><a name="l02678"></a><span class="lineno"> 2678</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div><div class="line"><a name="l02679"></a><span class="lineno"> 2679</span>&#160;}</div><div class="line"><a name="l02680"></a><span class="lineno"> 2680</span>&#160;</div><div class="line"><a name="l02681"></a><span class="lineno"> 2681</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02682"></a><span class="lineno"> 2682</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l02683"></a><span class="lineno"> 2683</span>&#160;{</div><div class="line"><a name="l02684"></a><span class="lineno"> 2684</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div><div class="line"><a name="l02685"></a><span class="lineno"> 2685</span>&#160;}</div><div class="line"><a name="l02686"></a><span class="lineno"> 2686</span>&#160;</div><div class="line"><a name="l02687"></a><span class="lineno"> 2687</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></div><div class="line"><a name="l02688"></a><span class="lineno"> 2688</span>&#160;</div><div class="line"><a name="l02689"></a><span class="lineno"> 2689</span>&#160;<span class="preprocessor">#define vma_new_array(allocator, type, count)   new(VmaAllocateArray&lt;type&gt;((allocator), (count)))(type)</span></div><div class="line"><a name="l02690"></a><span class="lineno"> 2690</span>&#160;</div><div class="line"><a name="l02691"></a><span class="lineno"> 2691</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02692"></a><span class="lineno"> 2692</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr)</div><div class="line"><a name="l02693"></a><span class="lineno"> 2693</span>&#160;{</div><div class="line"><a name="l02694"></a><span class="lineno"> 2694</span>&#160;    ptr-&gt;~T();</div><div class="line"><a name="l02695"></a><span class="lineno"> 2695</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l02696"></a><span class="lineno"> 2696</span>&#160;}</div><div class="line"><a name="l02697"></a><span class="lineno"> 2697</span>&#160;</div><div class="line"><a name="l02698"></a><span class="lineno"> 2698</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02699"></a><span class="lineno"> 2699</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, T* ptr, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l02700"></a><span class="lineno"> 2700</span>&#160;{</div><div class="line"><a name="l02701"></a><span class="lineno"> 2701</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l02702"></a><span class="lineno"> 2702</span>&#160;    {</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>&#160;        {</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</span>&#160;        }</div><div class="line"><a name="l02707"></a><span class="lineno"> 2707</span>&#160;        VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160;    }</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160;}</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>&#160;</div><div class="line"><a name="l02711"></a><span class="lineno"> 2711</span>&#160;<span class="comment">// STL-compatible allocator.</span></div><div class="line"><a name="l02712"></a><span class="lineno"> 2712</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l02713"></a><span class="lineno"> 2713</span>&#160;<span class="keyword">class </span>VmaStlAllocator</div><div class="line"><a name="l02714"></a><span class="lineno"> 2714</span>&#160;{</div><div class="line"><a name="l02715"></a><span class="lineno"> 2715</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>&#160;    </div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt; VmaStlAllocator(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; src) : m_pCallbacks(src.m_pCallbacks) { }</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</span>&#160;</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</span>&#160;    T* allocate(<span class="keywordtype">size_t</span> n) { <span class="keywordflow">return</span> VmaAllocateArray&lt;T&gt;(m_pCallbacks, n); }</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>&#160;    <span class="keywordtype">void</span> deallocate(T* p, <span class="keywordtype">size_t</span> n) { VmaFree(m_pCallbacks, p); }</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>&#160;</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160;    <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l02727"></a><span class="lineno"> 2727</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160;    }</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</span>&#160;    <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> VmaStlAllocator&lt;U&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l02732"></a><span class="lineno"> 2732</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>&#160;    }</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160;</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>&#160;};</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>&#160;</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>&#160;</div><div class="line"><a name="l02741"></a><span class="lineno"> 2741</span>&#160;<span class="preprocessor">#define VmaVector std::vector</span></div><div class="line"><a name="l02742"></a><span class="lineno"> 2742</span>&#160;</div><div class="line"><a name="l02743"></a><span class="lineno"> 2743</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02744"></a><span class="lineno"> 2744</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div><div class="line"><a name="l02745"></a><span class="lineno"> 2745</span>&#160;{</div><div class="line"><a name="l02746"></a><span class="lineno"> 2746</span>&#160;    vec.insert(vec.begin() + index, item);</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</span>&#160;}</div><div class="line"><a name="l02748"></a><span class="lineno"> 2748</span>&#160;</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(std::vector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02751"></a><span class="lineno"> 2751</span>&#160;{</div><div class="line"><a name="l02752"></a><span class="lineno"> 2752</span>&#160;    vec.erase(vec.begin() + index);</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>&#160;}</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>&#160;</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>&#160;<span class="comment">T must be POD because constructors and destructors are not called and memcpy is</span></div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>&#160;<span class="comment">used for these objects. */</span></div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>&#160;<span class="keyword">class </span>VmaVector</div><div class="line"><a name="l02762"></a><span class="lineno"> 2762</span>&#160;{</div><div class="line"><a name="l02763"></a><span class="lineno"> 2763</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l02765"></a><span class="lineno"> 2765</span>&#160;</div><div class="line"><a name="l02766"></a><span class="lineno"> 2766</span>&#160;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>&#160;        m_pArray(VMA_NULL),</div><div class="line"><a name="l02769"></a><span class="lineno"> 2769</span>&#160;        m_Count(0),</div><div class="line"><a name="l02770"></a><span class="lineno"> 2770</span>&#160;        m_Capacity(0)</div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>&#160;    {</div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>&#160;    }</div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</span>&#160;</div><div class="line"><a name="l02774"></a><span class="lineno"> 2774</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l02776"></a><span class="lineno"> 2776</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div><div class="line"><a name="l02777"></a><span class="lineno"> 2777</span>&#160;        m_Count(count),</div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</span>&#160;        m_Capacity(count)</div><div class="line"><a name="l02779"></a><span class="lineno"> 2779</span>&#160;    {</div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160;    }</div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>&#160;    </div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</span>&#160;        m_Allocator(src.m_Allocator),</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>&#160;        m_pArray(src.m_Count ? (T*)VmaAllocateArray&lt;T&gt;(src.m_Allocator.m_pCallbacks, src.m_Count) : VMA_NULL),</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160;        m_Count(src.m_Count),</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160;        m_Capacity(src.m_Count)</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;    {</div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;        <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;        {</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>&#160;        }</div><div class="line"><a name="l02792"></a><span class="lineno"> 2792</span>&#160;    }</div><div class="line"><a name="l02793"></a><span class="lineno"> 2793</span>&#160;    </div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160;    ~VmaVector()</div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160;    {</div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</span>&#160;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l02797"></a><span class="lineno"> 2797</span>&#160;    }</div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160;</div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>&#160;    {</div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>&#160;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160;        {</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;            resize(rhs.m_Count);</div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160;            {</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160;            }</div><div class="line"><a name="l02808"></a><span class="lineno"> 2808</span>&#160;        }</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>&#160;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>&#160;    }</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;    </div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div><div class="line"><a name="l02813"></a><span class="lineno"> 2813</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;    <span class="keyword">const</span> T* data()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>&#160;    </div><div class="line"><a name="l02817"></a><span class="lineno"> 2817</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</span>&#160;    {</div><div class="line"><a name="l02819"></a><span class="lineno"> 2819</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>&#160;    }</div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;    <span class="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>&#160;    }</div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</span>&#160;</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</span>&#160;    T&amp; front()</div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;    {</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;    }</div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</span>&#160;    <span class="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</div><div class="line"><a name="l02837"></a><span class="lineno"> 2837</span>&#160;    }</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160;    T&amp; back()</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>&#160;    {</div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>&#160;    }</div><div class="line"><a name="l02843"></a><span class="lineno"> 2843</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;    }</div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;</div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160;    <span class="keywordtype">void</span> reserve(<span class="keywordtype">size_t</span> newCapacity, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>&#160;    {</div><div class="line"><a name="l02851"></a><span class="lineno"> 2851</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>&#160;        </div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;        {</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160;            newCapacity = m_Capacity;</div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160;        }</div><div class="line"><a name="l02857"></a><span class="lineno"> 2857</span>&#160;        </div><div class="line"><a name="l02858"></a><span class="lineno"> 2858</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</span>&#160;        {</div><div class="line"><a name="l02860"></a><span class="lineno"> 2860</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>&#160;            {</div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</span>&#160;            }</div><div class="line"><a name="l02865"></a><span class="lineno"> 2865</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;        }</div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;    }</div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;</div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160;    <span class="keywordtype">void</span> resize(<span class="keywordtype">size_t</span> newCount, <span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160;    {</div><div class="line"><a name="l02873"></a><span class="lineno"> 2873</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div><div class="line"><a name="l02874"></a><span class="lineno"> 2874</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;        {</div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;            newCapacity = VMA_MAX(newCount, VMA_MAX(m_Capacity * 3 / 2, (<span class="keywordtype">size_t</span>)8));</div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;        }</div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;        {</div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;            newCapacity = newCount;</div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;        }</div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;</div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;        {</div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator.m_pCallbacks, newCapacity) : VMA_NULL;</div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> elementsToCopy = VMA_MIN(m_Count, newCount);</div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;            {</div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;            }</div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;        }</div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>&#160;</div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;        m_Count = newCount;</div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;    }</div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>&#160;</div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>&#160;    <span class="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>&#160;    {</div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>&#160;        resize(0, freeMemory);</div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;    }</div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;</div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;    {</div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</span>&#160;        resize(oldCount + 1);</div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;        {</div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>&#160;        }</div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;        m_pArray[index] = src;</div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160;    }</div><div class="line"><a name="l02915"></a><span class="lineno"> 2915</span>&#160;</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>&#160;    <span class="keywordtype">void</span> <span class="keyword">remove</span>(<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160;    {</div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160;        {</div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;            memmove(m_pArray + index, m_pArray + (index + 1), (oldCount - index - 1) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>&#160;        }</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160;        resize(oldCount - 1);</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160;    }</div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>&#160;</div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>&#160;    {</div><div class="line"><a name="l02929"></a><span class="lineno"> 2929</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>&#160;        resize(newIndex + 1);</div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;        m_pArray[newIndex] = src;</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;    }</div><div class="line"><a name="l02933"></a><span class="lineno"> 2933</span>&#160;</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</span>&#160;    <span class="keywordtype">void</span> pop_back()</div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160;    {</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>&#160;        resize(size() - 1);</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>&#160;    }</div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>&#160;</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>&#160;    {</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160;        insert(0, src);</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</span>&#160;    }</div><div class="line"><a name="l02944"></a><span class="lineno"> 2944</span>&#160;</div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;    <span class="keywordtype">void</span> pop_front()</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;    {</div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;        <span class="keyword">remove</span>(0);</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;    }</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;    <span class="keyword">typedef</span> T* iterator;</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>&#160;</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;    AllocatorT m_Allocator;</div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;    T* m_pArray;</div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160;};</div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>&#160;</div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorInsert(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index, <span class="keyword">const</span> T&amp; item)</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;{</div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;    vec.insert(index, item);</div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160;}</div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;</div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaVectorRemove(VmaVector&lt;T, allocatorT&gt;&amp; vec, <span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>&#160;{</div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>&#160;    vec.remove(index);</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160;}</div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>&#160;</div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02976"></a><span class="lineno"> 2976</span>&#160;</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160;<span class="keywordtype">size_t</span> VmaVectorInsertSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;{</div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;        vector.data(),</div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;        value,</div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;        CmpLess()) - vector.data();</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>&#160;}</div><div class="line"><a name="l02988"></a><span class="lineno"> 2988</span>&#160;</div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160;<span class="keywordtype">bool</span> VmaVectorRemoveSorted(VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;{</div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;        vector.begin(),</div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;        vector.end(),</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;        value,</div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>&#160;        comparator);</div><div class="line"><a name="l02998"></a><span class="lineno"> 2998</span>&#160;    <span class="keywordflow">if</span>((it != vector.end()) &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div><div class="line"><a name="l02999"></a><span class="lineno"> 2999</span>&#160;    {</div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</span>&#160;    }</div><div class="line"><a name="l03004"></a><span class="lineno"> 3004</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;}</div><div class="line"><a name="l03006"></a><span class="lineno"> 3006</span>&#160;</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03008"></a><span class="lineno"> 3008</span>&#160;<span class="keywordtype">size_t</span> VmaVectorFindSorted(<span class="keyword">const</span> VectorT&amp; vector, <span class="keyword">const</span> <span class="keyword">typename</span> VectorT::value_type&amp; value)</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</span>&#160;{</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03012"></a><span class="lineno"> 3012</span>&#160;        vector.data(),</div><div class="line"><a name="l03013"></a><span class="lineno"> 3013</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160;        value,</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>&#160;        comparator);</div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160;    <span class="keywordflow">if</span>(it != vector.size() &amp;&amp; !comparator(*it, value) &amp;&amp; !comparator(value, *it))</div><div class="line"><a name="l03017"></a><span class="lineno"> 3017</span>&#160;    {</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>&#160;        <span class="keywordflow">return</span> it - vector.begin();</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>&#160;    }</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>&#160;    {</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160;        <span class="keywordflow">return</span> vector.size();</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160;    }</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160;}</div><div class="line"><a name="l03025"></a><span class="lineno"> 3025</span>&#160;</div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;<span class="comment">// class VmaPoolAllocator</span></div><div class="line"><a name="l03028"></a><span class="lineno"> 3028</span>&#160;</div><div class="line"><a name="l03029"></a><span class="lineno"> 3029</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160;<span class="comment">Allocator for objects of type T using a list of arrays (pools) to speed up</span></div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>&#160;{</div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock);</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160;    ~VmaPoolAllocator();</div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;    T* Alloc();</div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160;</div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03045"></a><span class="lineno"> 3045</span>&#160;    <span class="keyword">union </span>Item</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160;    {</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;        uint32_t NextFreeIndex;</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;        T Value;</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;    };</div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;</div><div class="line"><a name="l03051"></a><span class="lineno"> 3051</span>&#160;    <span class="keyword">struct </span>ItemBlock</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;    {</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;        Item* pItems;</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;        uint32_t FirstFreeIndex;</div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;    };</div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;    </div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;    <span class="keywordtype">size_t</span> m_ItemsPerBlock;</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</div><div class="line"><a name="l03060"></a><span class="lineno"> 3060</span>&#160;</div><div class="line"><a name="l03061"></a><span class="lineno"> 3061</span>&#160;    ItemBlock&amp; CreateNewBlock();</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;};</div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160;</div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;VmaPoolAllocator&lt;T&gt;::VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock) :</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;    m_ItemsPerBlock(itemsPerBlock),</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160;{</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;    VMA_ASSERT(itemsPerBlock &gt; 0);</div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>&#160;}</div><div class="line"><a name="l03072"></a><span class="lineno"> 3072</span>&#160;</div><div class="line"><a name="l03073"></a><span class="lineno"> 3073</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>&#160;{</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;    Clear();</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;}</div><div class="line"><a name="l03078"></a><span class="lineno"> 3078</span>&#160;</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Clear()</div><div class="line"><a name="l03081"></a><span class="lineno"> 3081</span>&#160;{</div><div class="line"><a name="l03082"></a><span class="lineno"> 3082</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemsPerBlock);</div><div class="line"><a name="l03084"></a><span class="lineno"> 3084</span>&#160;    m_ItemBlocks.clear();</div><div class="line"><a name="l03085"></a><span class="lineno"> 3085</span>&#160;}</div><div class="line"><a name="l03086"></a><span class="lineno"> 3086</span>&#160;</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;T* VmaPoolAllocator&lt;T&gt;::Alloc()</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;{</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;    {</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;        {</div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>&#160;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>&#160;            <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;        }</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;    }</div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;</div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;    <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l03107"></a><span class="lineno"> 3107</span>&#160;}</div><div class="line"><a name="l03108"></a><span class="lineno"> 3108</span>&#160;</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;{</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;    <span class="comment">// Search all memory blocks to find ptr.</span></div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_ItemBlocks.size(); ++i)</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;    {</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03116"></a><span class="lineno"> 3116</span>&#160;        </div><div class="line"><a name="l03117"></a><span class="lineno"> 3117</span>&#160;        <span class="comment">// Casting to union.</span></div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;        Item* pItemPtr;</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;        </div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;        <span class="comment">// Check if pItemPtr is in address range of this block.</span></div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;        <span class="keywordflow">if</span>((pItemPtr &gt;= block.pItems) &amp;&amp; (pItemPtr &lt; block.pItems + m_ItemsPerBlock))</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>&#160;        {</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;            <span class="keyword">const</span> uint32_t index = <span class="keyword">static_cast&lt;</span>uint32_t<span class="keyword">&gt;</span>(pItemPtr - block.pItems);</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;            block.FirstFreeIndex = index;</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;        }</div><div class="line"><a name="l03129"></a><span class="lineno"> 3129</span>&#160;    }</div><div class="line"><a name="l03130"></a><span class="lineno"> 3130</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pointer doesn&#39;t belong to this memory pool.&quot;</span>);</div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>&#160;}</div><div class="line"><a name="l03132"></a><span class="lineno"> 3132</span>&#160;</div><div class="line"><a name="l03133"></a><span class="lineno"> 3133</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>&#160;{</div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>&#160;    ItemBlock newBlock = {</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, m_ItemsPerBlock), 0 };</div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>&#160;</div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;    m_ItemBlocks.push_back(newBlock);</div><div class="line"><a name="l03140"></a><span class="lineno"> 3140</span>&#160;</div><div class="line"><a name="l03141"></a><span class="lineno"> 3141</span>&#160;    <span class="comment">// Setup singly-linked list of all free items in this block.</span></div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; m_ItemsPerBlock - 1; ++i)</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160;    newBlock.pItems[m_ItemsPerBlock - 1].NextFreeIndex = UINT32_MAX;</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160;}</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03152"></a><span class="lineno"> 3152</span>&#160;</div><div class="line"><a name="l03153"></a><span class="lineno"> 3153</span>&#160;<span class="preprocessor">#define VmaList std::list</span></div><div class="line"><a name="l03154"></a><span class="lineno"> 3154</span>&#160;</div><div class="line"><a name="l03155"></a><span class="lineno"> 3155</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;</div><div class="line"><a name="l03157"></a><span class="lineno"> 3157</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160;<span class="keyword">struct </span>VmaListItem</div><div class="line"><a name="l03159"></a><span class="lineno"> 3159</span>&#160;{</div><div class="line"><a name="l03160"></a><span class="lineno"> 3160</span>&#160;    VmaListItem* pPrev;</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;    VmaListItem* pNext;</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;    T Value;</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;};</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;<span class="comment">// Doubly linked list.</span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;<span class="keyword">class </span>VmaRawList</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;{</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;</div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;    ~VmaRawList();</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;</div><div class="line"><a name="l03176"></a><span class="lineno"> 3176</span>&#160;    <span class="keywordtype">size_t</span> GetCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count; }</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Count == 0; }</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160;</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;    <span class="keyword">const</span> ItemType* Front()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>&#160;    <span class="keyword">const</span> ItemType* Back()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160;    ItemType* PushBack();</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160;    ItemType* PushFront();</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;    <span class="keywordtype">void</span> PopBack();</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;    <span class="keywordtype">void</span> PopFront();</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;    </div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;    <span class="comment">// Item can be null - it means PushBack.</span></div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03197"></a><span class="lineno"> 3197</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03198"></a><span class="lineno"> 3198</span>&#160;</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;    <span class="keywordtype">void</span> Remove(ItemType* pItem);</div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;</div><div class="line"><a name="l03201"></a><span class="lineno"> 3201</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03202"></a><span class="lineno"> 3202</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;    ItemType* m_pFront;</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;    ItemType* m_pBack;</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160;</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160;    <span class="comment">// Declared not defined, to block copy constructor and assignment operator.</span></div><div class="line"><a name="l03209"></a><span class="lineno"> 3209</span>&#160;    VmaRawList(<span class="keyword">const</span> VmaRawList&lt;T&gt;&amp; src);</div><div class="line"><a name="l03210"></a><span class="lineno"> 3210</span>&#160;    VmaRawList&lt;T&gt;&amp; operator=(<span class="keyword">const</span> VmaRawList&lt;T&gt;&amp; rhs);</div><div class="line"><a name="l03211"></a><span class="lineno"> 3211</span>&#160;};</div><div class="line"><a name="l03212"></a><span class="lineno"> 3212</span>&#160;</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160;    m_pFront(VMA_NULL),</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>&#160;    m_pBack(VMA_NULL),</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160;    m_Count(0)</div><div class="line"><a name="l03220"></a><span class="lineno"> 3220</span>&#160;{</div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>&#160;}</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160;</div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;{</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160;}</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;{</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160;    {</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;        ItemType* pItem = m_pBack;</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;        {</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;            m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;            pItem = pPrevItem;</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>&#160;        }</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>&#160;        m_pFront = VMA_NULL;</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;        m_pBack = VMA_NULL;</div><div class="line"><a name="l03244"></a><span class="lineno"> 3244</span>&#160;        m_Count = 0;</div><div class="line"><a name="l03245"></a><span class="lineno"> 3245</span>&#160;    }</div><div class="line"><a name="l03246"></a><span class="lineno"> 3246</span>&#160;}</div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;</div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;{</div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;    {</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03257"></a><span class="lineno"> 3257</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03258"></a><span class="lineno"> 3258</span>&#160;        m_Count = 1;</div><div class="line"><a name="l03259"></a><span class="lineno"> 3259</span>&#160;    }</div><div class="line"><a name="l03260"></a><span class="lineno"> 3260</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;    {</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;        pNewItem-&gt;pPrev = m_pBack;</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;        ++m_Count;</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;    }</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;}</div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160;</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160;{</div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;    {</div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;        m_Count = 1;</div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;    }</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160;    {</div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;        ++m_Count;</div><div class="line"><a name="l03288"></a><span class="lineno"> 3288</span>&#160;    }</div><div class="line"><a name="l03289"></a><span class="lineno"> 3289</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160;}</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack(<span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;{</div><div class="line"><a name="l03295"></a><span class="lineno"> 3295</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;}</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront(<span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03302"></a><span class="lineno"> 3302</span>&#160;{</div><div class="line"><a name="l03303"></a><span class="lineno"> 3303</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03306"></a><span class="lineno"> 3306</span>&#160;}</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160;</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>&#160;{</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>&#160;    {</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;        pPrevItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;    }</div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</span>&#160;    m_pBack = pPrevItem;</div><div class="line"><a name="l03319"></a><span class="lineno"> 3319</span>&#160;    m_ItemAllocator.Free(pBackItem);</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;    --m_Count;</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;}</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03324"></a><span class="lineno"> 3324</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</div><div class="line"><a name="l03325"></a><span class="lineno"> 3325</span>&#160;{</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>&#160;    {</div><div class="line"><a name="l03331"></a><span class="lineno"> 3331</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03332"></a><span class="lineno"> 3332</span>&#160;    }</div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;    m_pFront = pNextItem;</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>&#160;    --m_Count;</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;}</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;</div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;{</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160;    {</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;    }</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;    {</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;        m_pFront = pItem-&gt;pNext;</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;    }</div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</span>&#160;</div><div class="line"><a name="l03354"></a><span class="lineno"> 3354</span>&#160;    <span class="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;    {</div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;    }</div><div class="line"><a name="l03358"></a><span class="lineno"> 3358</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;    {</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;        m_pBack = pItem-&gt;pPrev;</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;    }</div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;</div><div class="line"><a name="l03364"></a><span class="lineno"> 3364</span>&#160;    m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l03365"></a><span class="lineno"> 3365</span>&#160;    --m_Count;</div><div class="line"><a name="l03366"></a><span class="lineno"> 3366</span>&#160;}</div><div class="line"><a name="l03367"></a><span class="lineno"> 3367</span>&#160;</div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160;{</div><div class="line"><a name="l03371"></a><span class="lineno"> 3371</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;    {</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;        newItem-&gt;pPrev = prevItem;</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;        newItem-&gt;pNext = pItem;</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>&#160;        pItem-&gt;pPrev = newItem;</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div><div class="line"><a name="l03379"></a><span class="lineno"> 3379</span>&#160;        {</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>&#160;            prevItem-&gt;pNext = newItem;</div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160;        }</div><div class="line"><a name="l03382"></a><span class="lineno"> 3382</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03383"></a><span class="lineno"> 3383</span>&#160;        {</div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;            m_pFront = newItem;</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;        }</div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;        ++m_Count;</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;    }</div><div class="line"><a name="l03390"></a><span class="lineno"> 3390</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;        <span class="keywordflow">return</span> PushBack();</div><div class="line"><a name="l03392"></a><span class="lineno"> 3392</span>&#160;}</div><div class="line"><a name="l03393"></a><span class="lineno"> 3393</span>&#160;</div><div class="line"><a name="l03394"></a><span class="lineno"> 3394</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>&#160;{</div><div class="line"><a name="l03397"></a><span class="lineno"> 3397</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>&#160;    {</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>&#160;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160;        newItem-&gt;pNext = nextItem;</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>&#160;        newItem-&gt;pPrev = pItem;</div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>&#160;        pItem-&gt;pNext = newItem;</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</div><div class="line"><a name="l03405"></a><span class="lineno"> 3405</span>&#160;        {</div><div class="line"><a name="l03406"></a><span class="lineno"> 3406</span>&#160;            nextItem-&gt;pPrev = newItem;</div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160;        }</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;        {</div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;            m_pBack = newItem;</div><div class="line"><a name="l03412"></a><span class="lineno"> 3412</span>&#160;        }</div><div class="line"><a name="l03413"></a><span class="lineno"> 3413</span>&#160;        ++m_Count;</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</span>&#160;    }</div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</span>&#160;        <span class="keywordflow">return</span> PushFront();</div><div class="line"><a name="l03418"></a><span class="lineno"> 3418</span>&#160;}</div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>&#160;</div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</span>&#160;{</div><div class="line"><a name="l03423"></a><span class="lineno"> 3423</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160;}</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value)</div><div class="line"><a name="l03430"></a><span class="lineno"> 3430</span>&#160;{</div><div class="line"><a name="l03431"></a><span class="lineno"> 3431</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;}</div><div class="line"><a name="l03435"></a><span class="lineno"> 3435</span>&#160;</div><div class="line"><a name="l03436"></a><span class="lineno"> 3436</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> AllocatorT&gt;</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;<span class="keyword">class </span>VmaList</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;{</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160;    <span class="keyword">class </span>iterator</div><div class="line"><a name="l03441"></a><span class="lineno"> 3441</span>&#160;    {</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160;        iterator() :</div><div class="line"><a name="l03444"></a><span class="lineno"> 3444</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;        {</div><div class="line"><a name="l03447"></a><span class="lineno"> 3447</span>&#160;        }</div><div class="line"><a name="l03448"></a><span class="lineno"> 3448</span>&#160;</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;        T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03451"></a><span class="lineno"> 3451</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03452"></a><span class="lineno"> 3452</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;        }</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>&#160;        T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03457"></a><span class="lineno"> 3457</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;        }</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</span>&#160;</div><div class="line"><a name="l03460"></a><span class="lineno"> 3460</span>&#160;        iterator&amp; operator++()</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;        {</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03465"></a><span class="lineno"> 3465</span>&#160;        }</div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160;        iterator&amp; operator--()</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160;        {</div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>&#160;            {</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>&#160;            }</div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;            {</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</span>&#160;            }</div><div class="line"><a name="l03477"></a><span class="lineno"> 3477</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>&#160;        }</div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>&#160;</div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03481"></a><span class="lineno"> 3481</span>&#160;        {</div><div class="line"><a name="l03482"></a><span class="lineno"> 3482</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;        }</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03487"></a><span class="lineno"> 3487</span>&#160;        {</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</span>&#160;        }</div><div class="line"><a name="l03492"></a><span class="lineno"> 3492</span>&#160;</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;        }</div><div class="line"><a name="l03498"></a><span class="lineno"> 3498</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03499"></a><span class="lineno"> 3499</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160;        }</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;        </div><div class="line"><a name="l03504"></a><span class="lineno"> 3504</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03505"></a><span class="lineno"> 3505</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l03506"></a><span class="lineno"> 3506</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l03507"></a><span class="lineno"> 3507</span>&#160;</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;            m_pList(pList),</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160;        {</div><div class="line"><a name="l03512"></a><span class="lineno"> 3512</span>&#160;        }</div><div class="line"><a name="l03513"></a><span class="lineno"> 3513</span>&#160;</div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>&#160;    };</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>&#160;</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</span>&#160;    <span class="keyword">class </span>const_iterator</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;    {</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;        const_iterator() :</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>&#160;        {</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</span>&#160;        }</div><div class="line"><a name="l03525"></a><span class="lineno"> 3525</span>&#160;</div><div class="line"><a name="l03526"></a><span class="lineno"> 3526</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;            m_pList(src.m_pList),</div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</span>&#160;            m_pItem(src.m_pItem)</div><div class="line"><a name="l03529"></a><span class="lineno"> 3529</span>&#160;        {</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;        }</div><div class="line"><a name="l03531"></a><span class="lineno"> 3531</span>&#160;        </div><div class="line"><a name="l03532"></a><span class="lineno"> 3532</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160;        }</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160;        <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>&#160;        }</div><div class="line"><a name="l03542"></a><span class="lineno"> 3542</span>&#160;</div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160;        const_iterator&amp; operator++()</div><div class="line"><a name="l03544"></a><span class="lineno"> 3544</span>&#160;        {</div><div class="line"><a name="l03545"></a><span class="lineno"> 3545</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l03546"></a><span class="lineno"> 3546</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l03547"></a><span class="lineno"> 3547</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160;        }</div><div class="line"><a name="l03549"></a><span class="lineno"> 3549</span>&#160;        const_iterator&amp; operator--()</div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;        {</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>&#160;            {</div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>&#160;            }</div><div class="line"><a name="l03555"></a><span class="lineno"> 3555</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>&#160;            {</div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l03559"></a><span class="lineno"> 3559</span>&#160;            }</div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>&#160;        }</div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</span>&#160;</div><div class="line"><a name="l03563"></a><span class="lineno"> 3563</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;        {</div><div class="line"><a name="l03565"></a><span class="lineno"> 3565</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;        }</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;        const_iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>&#160;        {</div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>&#160;        }</div><div class="line"><a name="l03575"></a><span class="lineno"> 3575</span>&#160;</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;        <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>&#160;        }</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>&#160;        <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;        }</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</span>&#160;        </div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;        const_iterator(<span class="keyword">const</span> VmaRawList&lt;T&gt;* pList, <span class="keyword">const</span> VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;            m_pList(pList),</div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>&#160;        {</div><div class="line"><a name="l03592"></a><span class="lineno"> 3592</span>&#160;        }</div><div class="line"><a name="l03593"></a><span class="lineno"> 3593</span>&#160;</div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>&#160;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160;    };</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160;</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>&#160;</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>&#160;    <span class="keywordtype">bool</span> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.IsEmpty(); }</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160;    <span class="keywordtype">size_t</span> size()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.GetCount(); }</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</span>&#160;</div><div class="line"><a name="l03605"></a><span class="lineno"> 3605</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160;    const_iterator cbegin()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;    const_iterator cend()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&amp;m_RawList, VMA_NULL); }</div><div class="line"><a name="l03610"></a><span class="lineno"> 3610</span>&#160;</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div><div class="line"><a name="l03612"></a><span class="lineno"> 3612</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; value) { m_RawList.PushBack(value); }</div><div class="line"><a name="l03613"></a><span class="lineno"> 3613</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>&#160;    iterator insert(iterator it, <span class="keyword">const</span> T&amp; value) { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.InsertBefore(it.m_pItem, value)); }</div><div class="line"><a name="l03615"></a><span class="lineno"> 3615</span>&#160;</div><div class="line"><a name="l03616"></a><span class="lineno"> 3616</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</div><div class="line"><a name="l03618"></a><span class="lineno"> 3618</span>&#160;};</div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;<span class="comment">// class VmaMap</span></div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;<span class="comment">// Unused in this version.</span></div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;<span class="preprocessor">#if 0</span></div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>&#160;</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;<span class="preprocessor">#define VmaPair std::pair</span></div><div class="line"><a name="l03631"></a><span class="lineno"> 3631</span>&#160;</div><div class="line"><a name="l03632"></a><span class="lineno"> 3632</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;<span class="preprocessor">    std::unordered_map&lt; KeyT, ValueT, std::hash&lt;KeyT&gt;, std::equal_to&lt;KeyT&gt;, VmaStlAllocator&lt; std::pair&lt;KeyT, ValueT&gt; &gt; &gt;</span></div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160;<span class="keyword">struct </span>VmaPair</div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>&#160;{</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;    T1 first;</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160;    T2 second;</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160;</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;    VmaPair() : first(), second() { }</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;    VmaPair(<span class="keyword">const</span> T1&amp; firstSrc, <span class="keyword">const</span> T2&amp; secondSrc) : first(firstSrc), second(secondSrc) { }</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160;};</div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;<span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>&#160;<span class="keyword">class </span>VmaMap</div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>&#160;{</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div><div class="line"><a name="l03656"></a><span class="lineno"> 3656</span>&#160;</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</div><div class="line"><a name="l03658"></a><span class="lineno"> 3658</span>&#160;</div><div class="line"><a name="l03659"></a><span class="lineno"> 3659</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div><div class="line"><a name="l03661"></a><span class="lineno"> 3661</span>&#160;</div><div class="line"><a name="l03662"></a><span class="lineno"> 3662</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>&#160;    </div><div class="line"><a name="l03666"></a><span class="lineno"> 3666</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160;};</div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>&#160;</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div><div class="line"><a name="l03671"></a><span class="lineno"> 3671</span>&#160;</div><div class="line"><a name="l03672"></a><span class="lineno"> 3672</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> FirstT, <span class="keyword">typename</span> SecondT&gt;</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</div><div class="line"><a name="l03674"></a><span class="lineno"> 3674</span>&#160;{</div><div class="line"><a name="l03675"></a><span class="lineno"> 3675</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>&#160;    }</div><div class="line"><a name="l03679"></a><span class="lineno"> 3679</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaPair&lt;FirstT, SecondT&gt;&amp; lhs, <span class="keyword">const</span> FirstT&amp; rhsFirst)<span class="keyword"> const</span></div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>&#160;    }</div><div class="line"><a name="l03683"></a><span class="lineno"> 3683</span>&#160;};</div><div class="line"><a name="l03684"></a><span class="lineno"> 3684</span>&#160;</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::insert(<span class="keyword">const</span> PairType&amp; pair)</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;{</div><div class="line"><a name="l03688"></a><span class="lineno"> 3688</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03689"></a><span class="lineno"> 3689</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>&#160;        pair,</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>&#160;}</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>&#160;</div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;VmaPair&lt;KeyT, ValueT&gt;* VmaMap&lt;KeyT, ValueT&gt;::find(<span class="keyword">const</span> KeyT&amp; key)</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160;{</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</span>&#160;        key,</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;    {</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160;        <span class="keywordflow">return</span> it;</div><div class="line"><a name="l03707"></a><span class="lineno"> 3707</span>&#160;    }</div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160;    {</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>&#160;    }</div><div class="line"><a name="l03712"></a><span class="lineno"> 3712</span>&#160;}</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160;</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;{</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>&#160;}</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>&#160;</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160;<span class="preprocessor">#endif // #if 0</span></div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>&#160;</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160;</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock;</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160;</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;<span class="keyword">struct </span>VmaAllocation_T</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;{</div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> uint8_t MAP_COUNT_FLAG_PERSISTENT_MAP = 0x80;</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>&#160;</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>&#160;    <span class="keyword">enum</span> FLAGS</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>&#160;    {</div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>&#160;        FLAG_USER_DATA_STRING = 0x01,</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>&#160;    };</div><div class="line"><a name="l03737"></a><span class="lineno"> 3737</span>&#160;</div><div class="line"><a name="l03738"></a><span class="lineno"> 3738</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</div><div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>&#160;    {</div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;        ALLOCATION_TYPE_NONE,</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;        ALLOCATION_TYPE_BLOCK,</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160;    };</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160;</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>&#160;    VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;        m_Alignment(1),</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160;        m_Size(0),</div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>&#160;        m_pUserData(VMA_NULL),</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;        m_LastUseFrameIndex(currentFrameIndex),</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;        m_Type((uint8_t)ALLOCATION_TYPE_NONE),</div><div class="line"><a name="l03752"></a><span class="lineno"> 3752</span>&#160;        m_SuballocationType((uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN),</div><div class="line"><a name="l03753"></a><span class="lineno"> 3753</span>&#160;        m_MapCount(0),</div><div class="line"><a name="l03754"></a><span class="lineno"> 3754</span>&#160;        m_Flags(userDataString ? (uint8_t)FLAG_USER_DATA_STRING : 0)</div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;    {</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;    }</div><div class="line"><a name="l03757"></a><span class="lineno"> 3757</span>&#160;</div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</span>&#160;    ~VmaAllocation_T()</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;    {</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160;        VMA_ASSERT((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) == 0 &amp;&amp; <span class="stringliteral">&quot;Allocation was not unmapped before destruction.&quot;</span>);</div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>&#160;</div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</div><div class="line"><a name="l03764"></a><span class="lineno"> 3764</span>&#160;    }</div><div class="line"><a name="l03765"></a><span class="lineno"> 3765</span>&#160;</div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160;    <span class="keywordtype">void</span> InitBlockAllocation(</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>&#160;        <span class="keywordtype">bool</span> mapped,</div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</div><div class="line"><a name="l03775"></a><span class="lineno"> 3775</span>&#160;    {</div><div class="line"><a name="l03776"></a><span class="lineno"> 3776</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>&#160;        m_Alignment = alignment;</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>&#160;        m_Size = size;</div><div class="line"><a name="l03781"></a><span class="lineno"> 3781</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;        m_BlockAllocation.m_hPool = hPool;</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160;        m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;        m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;    }</div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;    <span class="keywordtype">void</span> InitLost()</div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;    {</div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160;        m_BlockAllocation.m_hPool = VK_NULL_HANDLE;</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;        m_BlockAllocation.m_Offset = 0;</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>&#160;    }</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160;</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;        VkDeviceSize offset);</div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160;</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>&#160;    <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div><div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div><div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>&#160;        VkDeviceMemory hMemory,</div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160;        VkDeviceSize size)</div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;    {</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160;        m_Alignment = 0;</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>&#160;        m_Size = size;</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>&#160;        m_DedicatedAllocation.m_MemoryTypeIndex = memoryTypeIndex;</div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>&#160;    }</div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>&#160;</div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>&#160;    ALLOCATION_TYPE GetType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (ALLOCATION_TYPE)m_Type; }</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;    <span class="keywordtype">bool</span> IsUserDataString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_Flags &amp; FLAG_USER_DATA_STRING) != 0; }</div><div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>&#160;    <span class="keywordtype">void</span>* GetUserData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pUserData; }</div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;    <span class="keywordtype">void</span> SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160;</div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div><div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>&#160;    }</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;    uint32_t GetMemoryTypeIndex() <span class="keyword">const</span>;</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160;    <span class="keywordtype">bool</span> IsPersistentMap()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (m_MapCount &amp; MAP_COUNT_FLAG_PERSISTENT_MAP) != 0; }</div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetPool() <span class="keyword">const</span>;</div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160;    </div><div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</div><div class="line"><a name="l03849"></a><span class="lineno"> 3849</span>&#160;    }</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>&#160;    <span class="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160;    {</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</span>&#160;    }</div><div class="line"><a name="l03854"></a><span class="lineno"> 3854</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;<span class="comment">      makes it lost by setting LastUseFrameIndex = VMA_FRAME_INDEX_LOST and returns true.</span></div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;<span class="comment">    - Else, returns false.</span></div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;<span class="comment">    </span></div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;</div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;    {</div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = m_Size;</div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l03875"></a><span class="lineno"> 3875</span>&#160;    }</div><div class="line"><a name="l03876"></a><span class="lineno"> 3876</span>&#160;</div><div class="line"><a name="l03877"></a><span class="lineno"> 3877</span>&#160;    <span class="keywordtype">void</span> BlockAllocMap();</div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div><div class="line"><a name="l03879"></a><span class="lineno"> 3879</span>&#160;    VkResult DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l03880"></a><span class="lineno"> 3880</span>&#160;    <span class="keywordtype">void</span> DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>&#160;</div><div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;    VkDeviceSize m_Alignment;</div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>&#160;    <span class="comment">// Bit 0x80 is set when allocation was created with VMA_ALLOCATION_CREATE_MAPPED_BIT.</span></div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160;    uint8_t m_MapCount;</div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div><div class="line"><a name="l03893"></a><span class="lineno"> 3893</span>&#160;</div><div class="line"><a name="l03894"></a><span class="lineno"> 3894</span>&#160;    <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;    {</div><div class="line"><a name="l03897"></a><span class="lineno"> 3897</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> m_hPool; <span class="comment">// Null if belongs to general memory.</span></div><div class="line"><a name="l03898"></a><span class="lineno"> 3898</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>&#160;        VkDeviceSize m_Offset;</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160;    };</div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>&#160;</div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</div><div class="line"><a name="l03905"></a><span class="lineno"> 3905</span>&#160;    {</div><div class="line"><a name="l03906"></a><span class="lineno"> 3906</span>&#160;        uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160;        VkDeviceMemory m_hMemory;</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;        <span class="keywordtype">void</span>* m_pMappedData; <span class="comment">// Not null means memory is mapped.</span></div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;    };</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</span>&#160;</div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</span>&#160;    <span class="keyword">union</span></div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</span>&#160;    {</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;        BlockAllocation m_BlockAllocation;</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;    };</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;    <span class="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</span>&#160;};</div><div class="line"><a name="l03921"></a><span class="lineno"> 3921</span>&#160;</div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;<span class="comment">allocated memory block or free.</span></div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03926"></a><span class="lineno"> 3926</span>&#160;<span class="keyword">struct </span>VmaSuballocation</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>&#160;{</div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>&#160;    VkDeviceSize size;</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160;    VmaSuballocationType type;</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;};</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160;<span class="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160;<span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</div><div class="line"><a name="l03938"></a><span class="lineno"> 3938</span>&#160;</div><div class="line"><a name="l03939"></a><span class="lineno"> 3939</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160;<span class="comment">- itemsToMakeLostCount is the number of VmaAllocations that need to be made lost for</span></div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>&#160;{</div><div class="line"><a name="l03954"></a><span class="lineno"> 3954</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l03955"></a><span class="lineno"> 3955</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div><div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>&#160;    VkDeviceSize sumItemSize; <span class="comment">// Sum size of items to make lost that overlap with proposed allocation.</span></div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;    VmaSuballocationList::iterator item;</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160;</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div><div class="line"><a name="l03963"></a><span class="lineno"> 3963</span>&#160;    }</div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;};</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</div><div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;{</div><div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l03974"></a><span class="lineno"> 3974</span>&#160;    ~VmaBlockMetadata();</div><div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;    <span class="keywordtype">void</span> Init(VkDeviceSize size);</div><div class="line"><a name="l03976"></a><span class="lineno"> 3976</span>&#160;</div><div class="line"><a name="l03977"></a><span class="lineno"> 3977</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;    <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Suballocations.size() - m_FreeCount; }</div><div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>&#160;    VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div><div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>&#160;    VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>&#160;    <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</div><div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>&#160;</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>&#160;    <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span>;</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160;    <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span>;</div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;</div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160;    <span class="comment">// Creates trivial request for case when block is empty.</span></div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;    <span class="keywordtype">void</span> CreateFirstAllocationRequest(VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>&#160;</div><div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160;    <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div><div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div><div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>&#160;    <span class="comment">// If failed, returns false.</span></div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;    <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;</div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;    <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;</div><div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>&#160;    uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l04015"></a><span class="lineno"> 4015</span>&#160;</div><div class="line"><a name="l04016"></a><span class="lineno"> 4016</span>&#160;    <span class="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div><div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>&#160;    <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;    <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160;    <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;    uint32_t m_FreeCount;</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;    VmaSuballocationList m_Suballocations;</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160;</div><div class="line"><a name="l04036"></a><span class="lineno"> 4036</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div><div class="line"><a name="l04037"></a><span class="lineno"> 4037</span>&#160;</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;    <span class="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;        VkDeviceSize* pOffset,</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;        VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;    <span class="comment">// Given free suballocation, it merges it with following one, which must also be free.</span></div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div><div class="line"><a name="l04063"></a><span class="lineno"> 4063</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04064"></a><span class="lineno"> 4064</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;};</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;</div><div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;{</div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;    VmaBlockMetadata m_Metadata;</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;</div><div class="line"><a name="l04078"></a><span class="lineno"> 4078</span>&#160;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04079"></a><span class="lineno"> 4079</span>&#160;</div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;    ~VmaDeviceMemoryBlock()</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160;    {</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;        VMA_ASSERT(m_MapCount == 0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being destroyed while it is still mapped.&quot;</span>);</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;    }</div><div class="line"><a name="l04085"></a><span class="lineno"> 4085</span>&#160;</div><div class="line"><a name="l04086"></a><span class="lineno"> 4086</span>&#160;    <span class="comment">// Always call after construction.</span></div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;    <span class="keywordtype">void</span> Init(</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;        uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;        VkDeviceMemory newMemory,</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;        VkDeviceSize newSize);</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;    <span class="comment">// Always call before destruction.</span></div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;    <span class="keywordtype">void</span> Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l04093"></a><span class="lineno"> 4093</span>&#160;    </div><div class="line"><a name="l04094"></a><span class="lineno"> 4094</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>&#160;    <span class="keywordtype">void</span>* GetMappedData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pMappedData; }</div><div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>&#160;</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;</div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160;    <span class="comment">// ppData can be null.</span></div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count);</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160;    VkResult BindBufferMemory(</div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160;        VkBuffer hBuffer);</div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160;    VkResult BindImageMemory(</div><div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;        VkImage hImage);</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;    uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;    VkDeviceMemory m_hMemory;</div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160;</div><div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>&#160;    <span class="comment">// Protects access to m_hMemory so it&#39;s not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.</span></div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;    <span class="comment">// Also protects m_MapCount, m_pMappedData.</span></div><div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160;    uint32_t m_MapCount;</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;};</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160;<span class="keyword">struct </span>VmaPointerLess</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;{</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <span class="keywordtype">void</span>* lhs, <span class="keyword">const</span> <span class="keywordtype">void</span>* rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;    }</div><div class="line"><a name="l04131"></a><span class="lineno"> 4131</span>&#160;};</div><div class="line"><a name="l04132"></a><span class="lineno"> 4132</span>&#160;</div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>&#160;<span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;</div><div class="line"><a name="l04135"></a><span class="lineno"> 4135</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04136"></a><span class="lineno"> 4136</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;<span class="comment">Vulkan memory type.</span></div><div class="line"><a name="l04138"></a><span class="lineno"> 4138</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04139"></a><span class="lineno"> 4139</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04141"></a><span class="lineno"> 4141</span>&#160;<span class="keyword">struct </span>VmaBlockVector</div><div class="line"><a name="l04142"></a><span class="lineno"> 4142</span>&#160;{</div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>&#160;    VmaBlockVector(</div><div class="line"><a name="l04144"></a><span class="lineno"> 4144</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04145"></a><span class="lineno"> 4145</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160;        VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l04148"></a><span class="lineno"> 4148</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160;        <span class="keywordtype">bool</span> isCustomPool);</div><div class="line"><a name="l04152"></a><span class="lineno"> 4152</span>&#160;    ~VmaBlockVector();</div><div class="line"><a name="l04153"></a><span class="lineno"> 4153</span>&#160;</div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160;    VkResult CreateMinBlocks();</div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</span>&#160;</div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160;</div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</span>&#160;</div><div class="line"><a name="l04163"></a><span class="lineno"> 4163</span>&#160;    <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Blocks.empty(); }</div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;</div><div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>&#160;    VkResult Allocate(</div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;    <span class="keywordtype">void</span> Free(</div><div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>&#160;</div><div class="line"><a name="l04176"></a><span class="lineno"> 4176</span>&#160;    <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;    <span class="keywordtype">void</span> AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;</div><div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160;</div><div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>&#160;    VmaDefragmentator* EnsureDefragmentator(</div><div class="line"><a name="l04188"></a><span class="lineno"> 4188</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04189"></a><span class="lineno"> 4189</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>&#160;</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l04193"></a><span class="lineno"> 4193</span>&#160;        VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>&#160;        uint32_t&amp; maxAllocationsToMove);</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;</div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160;    <span class="keywordtype">void</span> DestroyDefragmentator();</div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160;</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l04200"></a><span class="lineno"> 4200</span>&#160;</div><div class="line"><a name="l04201"></a><span class="lineno"> 4201</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div><div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div><div class="line"><a name="l04205"></a><span class="lineno"> 4205</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div><div class="line"><a name="l04206"></a><span class="lineno"> 4206</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div><div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div><div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_IsCustomPool;</div><div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty - a</span></div><div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;<span class="comment">    hysteresis to avoid pessimistic case of alternating creation and destruction</span></div><div class="line"><a name="l04214"></a><span class="lineno"> 4214</span>&#160;<span class="comment">    of a VkDeviceMemory. */</span></div><div class="line"><a name="l04215"></a><span class="lineno"> 4215</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;    VmaDefragmentator* m_pDefragmentator;</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;</div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160;    <span class="keywordtype">size_t</span> CalcMaxBlockSize() <span class="keyword">const</span>;</div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160;</div><div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>&#160;    <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</span>&#160;    <span class="comment">// after this call.</span></div><div class="line"><a name="l04225"></a><span class="lineno"> 4225</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;</div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;};</div><div class="line"><a name="l04229"></a><span class="lineno"> 4229</span>&#160;</div><div class="line"><a name="l04230"></a><span class="lineno"> 4230</span>&#160;<span class="keyword">struct </span>VmaPool_T</div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160;{</div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;    VmaBlockVector m_BlockVector;</div><div class="line"><a name="l04234"></a><span class="lineno"> 4234</span>&#160;</div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160;    <span class="comment">// Takes ownership.</span></div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;    VmaPool_T(</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo);</div><div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>&#160;    ~VmaPool_T();</div><div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>&#160;</div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;    VmaBlockVector&amp; GetBlockVector() { <span class="keywordflow">return</span> m_BlockVector; }</div><div class="line"><a name="l04242"></a><span class="lineno"> 4242</span>&#160;</div><div class="line"><a name="l04243"></a><span class="lineno"> 4243</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div><div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160;};</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;<span class="keyword">class </span>VmaDefragmentator</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;{</div><div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div><div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div><div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>&#160;    uint32_t m_CurrentFrameIndex;</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160;    VkDeviceSize m_BytesMoved;</div><div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;    uint32_t m_AllocationsMoved;</div><div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>&#160;</div><div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>&#160;    <span class="keyword">struct </span>AllocationInfo</div><div class="line"><a name="l04257"></a><span class="lineno"> 4257</span>&#160;    {</div><div class="line"><a name="l04258"></a><span class="lineno"> 4258</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;        VkBool32* m_pChanged;</div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;</div><div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160;        AllocationInfo() :</div><div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;            m_pChanged(VMA_NULL)</div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;        {</div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;        }</div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;    };</div><div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160;</div><div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>&#160;    <span class="keyword">struct </span>AllocationInfoSizeGreater</div><div class="line"><a name="l04269"></a><span class="lineno"> 4269</span>&#160;    {</div><div class="line"><a name="l04270"></a><span class="lineno"> 4270</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> AllocationInfo&amp; lhs, <span class="keyword">const</span> AllocationInfo&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;        }</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;    };</div><div class="line"><a name="l04275"></a><span class="lineno"> 4275</span>&#160;</div><div class="line"><a name="l04276"></a><span class="lineno"> 4276</span>&#160;    <span class="comment">// Used between AddAllocation and Defragment.</span></div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;    VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;</div><div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;    <span class="keyword">struct </span>BlockInfo</div><div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;    {</div><div class="line"><a name="l04281"></a><span class="lineno"> 4281</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div><div class="line"><a name="l04282"></a><span class="lineno"> 4282</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div><div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>&#160;</div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>&#160;            m_pBlock(VMA_NULL),</div><div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>&#160;            m_HasNonMovableAllocations(true),</div><div class="line"><a name="l04288"></a><span class="lineno"> 4288</span>&#160;            m_Allocations(pAllocationCallbacks),</div><div class="line"><a name="l04289"></a><span class="lineno"> 4289</span>&#160;            m_pMappedDataForDefragmentation(VMA_NULL)</div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;        {</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;        }</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160;</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160;        {</div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock-&gt;m_Metadata.GetAllocationCount();</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div><div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div><div class="line"><a name="l04298"></a><span class="lineno"> 4298</span>&#160;        }</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160;        <span class="keywordtype">void</span> SortAllocationsBySizeDescecnding()</div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;        {</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</span>&#160;        }</div><div class="line"><a name="l04304"></a><span class="lineno"> 4304</span>&#160;</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;        VkResult EnsureMapping(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppMappedData);</div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;        <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04307"></a><span class="lineno"> 4307</span>&#160;</div><div class="line"><a name="l04308"></a><span class="lineno"> 4308</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160;        <span class="comment">// Not null if mapped for defragmentation only, not originally mapped.</span></div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;        <span class="keywordtype">void</span>* m_pMappedDataForDefragmentation;</div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;    };</div><div class="line"><a name="l04312"></a><span class="lineno"> 4312</span>&#160;</div><div class="line"><a name="l04313"></a><span class="lineno"> 4313</span>&#160;    <span class="keyword">struct </span>BlockPointerLess</div><div class="line"><a name="l04314"></a><span class="lineno"> 4314</span>&#160;    {</div><div class="line"><a name="l04315"></a><span class="lineno"> 4315</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> VmaDeviceMemoryBlock* pRhsBlock)<span class="keyword"> const</span></div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;        }</div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;        }</div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160;    };</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160;</div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;    <span class="comment">// 1. Blocks with some non-movable allocations go first.</span></div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div><div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div><div class="line"><a name="l04328"></a><span class="lineno"> 4328</span>&#160;    {</div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>&#160;        <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> BlockInfo* pLhsBlockInfo, <span class="keyword">const</span> BlockInfo* pRhsBlockInfo)<span class="keyword"> const</span></div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;            {</div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;            }</div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;            {</div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;            }</div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_pBlock-&gt;m_Metadata.GetSumFreeSize() &lt; pRhsBlockInfo-&gt;m_pBlock-&gt;m_Metadata.GetSumFreeSize())</div><div class="line"><a name="l04340"></a><span class="lineno"> 4340</span>&#160;            {</div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160;            }</div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>&#160;        }</div><div class="line"><a name="l04345"></a><span class="lineno"> 4345</span>&#160;    };</div><div class="line"><a name="l04346"></a><span class="lineno"> 4346</span>&#160;</div><div class="line"><a name="l04347"></a><span class="lineno"> 4347</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;    BlockInfoVector m_Blocks;</div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160;    VkResult DefragmentRound(</div><div class="line"><a name="l04351"></a><span class="lineno"> 4351</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160;</div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</div><div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>&#160;</div><div class="line"><a name="l04358"></a><span class="lineno"> 4358</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>&#160;    VmaDefragmentator(</div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160;</div><div class="line"><a name="l04364"></a><span class="lineno"> 4364</span>&#160;    ~VmaDefragmentator();</div><div class="line"><a name="l04365"></a><span class="lineno"> 4365</span>&#160;</div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;    VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;    uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;</div><div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>&#160;    <span class="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div><div class="line"><a name="l04370"></a><span class="lineno"> 4370</span>&#160;</div><div class="line"><a name="l04371"></a><span class="lineno"> 4371</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04372"></a><span class="lineno"> 4372</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l04374"></a><span class="lineno"> 4374</span>&#160;};</div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;</div><div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>&#160;<span class="comment">// Main allocator object.</span></div><div class="line"><a name="l04377"></a><span class="lineno"> 4377</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</div><div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>&#160;{</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation;</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160;    VkDevice m_hDevice;</div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div><div class="line"><a name="l04383"></a><span class="lineno"> 4383</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div><div class="line"><a name="l04385"></a><span class="lineno"> 4385</span>&#160;    </div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160;    <span class="comment">// Number of bytes free out of limit, or VK_WHOLE_SIZE if not limit for that heap.</span></div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160;    VkDeviceSize m_HeapSizeLimit[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160;    VMA_MUTEX m_HeapSizeLimitMutex;</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160;</div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</div><div class="line"><a name="l04392"></a><span class="lineno"> 4392</span>&#160;</div><div class="line"><a name="l04393"></a><span class="lineno"> 4393</span>&#160;    <span class="comment">// Default pools.</span></div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04395"></a><span class="lineno"> 4395</span>&#160;</div><div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>&#160;    <span class="comment">// Each vector is sorted by memory (handle value).</span></div><div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</span>&#160;    VMA_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l04400"></a><span class="lineno"> 4400</span>&#160;</div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160;    VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;    ~VmaAllocator_T();</div><div class="line"><a name="l04403"></a><span class="lineno"> 4403</span>&#160;</div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;    }</div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>&amp; GetVulkanFunctions()<span class="keyword"> const</span></div><div class="line"><a name="l04409"></a><span class="lineno"> 4409</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04410"></a><span class="lineno"> 4410</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</div><div class="line"><a name="l04411"></a><span class="lineno"> 4411</span>&#160;    }</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160;            static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;    }</div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;</div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div><div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</div><div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160;</div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160;    }</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160;</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div><div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l04432"></a><span class="lineno"> 4432</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l04433"></a><span class="lineno"> 4433</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;        VkImage hImage,</div><div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l04438"></a><span class="lineno"> 4438</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04439"></a><span class="lineno"> 4439</span>&#160;</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</span>&#160;    <span class="comment">// Main allocation function.</span></div><div class="line"><a name="l04441"></a><span class="lineno"> 4441</span>&#160;    VkResult AllocateMemory(</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;</div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160;    <span class="comment">// Main deallocation function.</span></div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160;    <span class="keywordtype">void</span> FreeMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160;</div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160;    <span class="keywordtype">void</span> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;</div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l04462"></a><span class="lineno"> 4462</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;        VkBool32* pAllocationsChanged,</div><div class="line"><a name="l04464"></a><span class="lineno"> 4464</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* pDefragmentationInfo,</div><div class="line"><a name="l04465"></a><span class="lineno"> 4465</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>&#160;</div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160;    <span class="keywordtype">void</span> GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;    <span class="keywordtype">bool</span> TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;</div><div class="line"><a name="l04470"></a><span class="lineno"> 4470</span>&#160;    VkResult CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l04471"></a><span class="lineno"> 4471</span>&#160;    <span class="keywordtype">void</span> DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div><div class="line"><a name="l04475"></a><span class="lineno"> 4475</span>&#160;</div><div class="line"><a name="l04476"></a><span class="lineno"> 4476</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>&#160;</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160;</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;</div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;    VkResult Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;    <span class="keywordtype">void</span> Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160;</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;    VkResult BindBufferMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkBuffer hBuffer);</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;    VkResult BindImageMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkImage hImage);</div><div class="line"><a name="l04490"></a><span class="lineno"> 4490</span>&#160;</div><div class="line"><a name="l04491"></a><span class="lineno"> 4491</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l04493"></a><span class="lineno"> 4493</span>&#160;</div><div class="line"><a name="l04494"></a><span class="lineno"> 4494</span>&#160;    VkPhysicalDevice m_PhysicalDevice;</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;    </div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;    VMA_MUTEX m_PoolsMutex;</div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div><div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div><div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>&#160;</div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;</div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;    <span class="keywordtype">void</span> ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions);</div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;</div><div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</div><div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>&#160;</div><div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>&#160;    VkResult AllocateMemoryOfType(</div><div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l04509"></a><span class="lineno"> 4509</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l04510"></a><span class="lineno"> 4510</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160;</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for single allocation.</span></div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;    VkResult AllocateDedicatedMemory(</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l04521"></a><span class="lineno"> 4521</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l04522"></a><span class="lineno"> 4522</span>&#160;        <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;    <span class="comment">// Tries to free pMemory as Dedicated Memory. Returns true if found and freed.</span></div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;    <span class="keywordtype">void</span> FreeDedicatedMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;};</div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160;</div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160;</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span>* VmaMalloc(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> alignment)</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;{</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160;}</div><div class="line"><a name="l04540"></a><span class="lineno"> 4540</span>&#160;</div><div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaFree(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;{</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</div><div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>&#160;}</div><div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>&#160;</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;{</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;}</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;</div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;<span class="keyword">static</span> T* VmaAllocateArray(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;{</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;    <span class="keywordflow">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;}</div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04559"></a><span class="lineno"> 4559</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr)</div><div class="line"><a name="l04560"></a><span class="lineno"> 4560</span>&#160;{</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l04562"></a><span class="lineno"> 4562</span>&#160;    {</div><div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160;        ptr-&gt;~T();</div><div class="line"><a name="l04564"></a><span class="lineno"> 4564</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160;    }</div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160;}</div><div class="line"><a name="l04567"></a><span class="lineno"> 4567</span>&#160;</div><div class="line"><a name="l04568"></a><span class="lineno"> 4568</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04569"></a><span class="lineno"> 4569</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> vma_delete_array(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, T* ptr, <span class="keywordtype">size_t</span> count)</div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;{</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;    {</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;    }</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;}</div><div class="line"><a name="l04578"></a><span class="lineno"> 4578</span>&#160;</div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;<span class="comment">// VmaStringBuilder</span></div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;</div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;<span class="keyword">class </span>VmaStringBuilder</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;{</div><div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;    VmaStringBuilder(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> alloc) : m_Data(VmaStlAllocator&lt;char&gt;(alloc-&gt;GetAllocationCallbacks())) { }</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;    <span class="keywordtype">size_t</span> GetLength()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.size(); }</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* GetData()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Data.data(); }</div><div class="line"><a name="l04590"></a><span class="lineno"> 4590</span>&#160;</div><div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keywordtype">char</span> ch) { m_Data.push_back(ch); }</div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;    <span class="keywordtype">void</span> Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04593"></a><span class="lineno"> 4593</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;    <span class="keywordtype">void</span> AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;</div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160;};</div><div class="line"><a name="l04601"></a><span class="lineno"> 4601</span>&#160;</div><div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;{</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;    {</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;        m_Data.resize(oldCount + strLen);</div><div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;    }</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160;}</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160;</div><div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;{</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160;    <span class="keywordtype">char</span> buf[11];</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160;    VmaUint32ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;    Add(buf);</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;}</div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;{</div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;    VmaUint64ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;    Add(buf);</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;}</div><div class="line"><a name="l04626"></a><span class="lineno"> 4626</span>&#160;</div><div class="line"><a name="l04627"></a><span class="lineno"> 4627</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddPointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;{</div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</span>&#160;    Add(buf);</div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;}</div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160;</div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;<span class="comment">// VmaJsonWriter</span></div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;</div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160;{</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div><div class="line"><a name="l04645"></a><span class="lineno"> 4645</span>&#160;    ~VmaJsonWriter();</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;</div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;    <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160;    <span class="keywordtype">void</span> EndObject();</div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;    </div><div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160;    <span class="keywordtype">void</span> EndArray();</div><div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>&#160;    </div><div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;    <span class="keywordtype">void</span> BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;    <span class="keywordtype">void</span> ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div><div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;    <span class="keywordtype">void</span> ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr);</div><div class="line"><a name="l04659"></a><span class="lineno"> 4659</span>&#160;    <span class="keywordtype">void</span> EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr = VMA_NULL);</div><div class="line"><a name="l04660"></a><span class="lineno"> 4660</span>&#160;    </div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;    <span class="keywordtype">void</span> WriteNull();</div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;</div><div class="line"><a name="l04666"></a><span class="lineno"> 4666</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04667"></a><span class="lineno"> 4667</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> INDENT;</div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160;</div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;    {</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;        COLLECTION_TYPE_OBJECT,</div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160;        COLLECTION_TYPE_ARRAY,</div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;    };</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;    <span class="keyword">struct </span>StackItem</div><div class="line"><a name="l04675"></a><span class="lineno"> 4675</span>&#160;    {</div><div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;        COLLECTION_TYPE type;</div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;        uint32_t valueCount;</div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160;    };</div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160;</div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;    VmaStringBuilder&amp; m_SB;</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</div><div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>&#160;</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;    <span class="keywordtype">void</span> WriteIndent(<span class="keywordtype">bool</span> oneLess = <span class="keyword">false</span>);</div><div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>&#160;};</div><div class="line"><a name="l04688"></a><span class="lineno"> 4688</span>&#160;</div><div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160;<span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> VmaJsonWriter::INDENT = <span class="stringliteral">&quot;  &quot;</span>;</div><div class="line"><a name="l04690"></a><span class="lineno"> 4690</span>&#160;</div><div class="line"><a name="l04691"></a><span class="lineno"> 4691</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;    m_SB(sb),</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;    m_InsideString(false)</div><div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;{</div><div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;}</div><div class="line"><a name="l04697"></a><span class="lineno"> 4697</span>&#160;</div><div class="line"><a name="l04698"></a><span class="lineno"> 4698</span>&#160;VmaJsonWriter::~VmaJsonWriter()</div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;{</div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;    VMA_ASSERT(m_Stack.empty());</div><div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;}</div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;</div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</span>&#160;{</div><div class="line"><a name="l04706"></a><span class="lineno"> 4706</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160;</div><div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;</div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;    StackItem item;</div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;}</div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;</div><div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160;{</div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160;</div><div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160;</div><div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l04727"></a><span class="lineno"> 4727</span>&#160;}</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;</div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>&#160;{</div><div class="line"><a name="l04731"></a><span class="lineno"> 4731</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160;</div><div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04734"></a><span class="lineno"> 4734</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div><div class="line"><a name="l04735"></a><span class="lineno"> 4735</span>&#160;</div><div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>&#160;    StackItem item;</div><div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>&#160;}</div><div class="line"><a name="l04742"></a><span class="lineno"> 4742</span>&#160;</div><div class="line"><a name="l04743"></a><span class="lineno"> 4743</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;{</div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160;</div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l04748"></a><span class="lineno"> 4748</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div><div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160;</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;}</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160;</div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;{</div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;    BeginString(pStr);</div><div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>&#160;    EndString();</div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160;}</div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;</div><div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04761"></a><span class="lineno"> 4761</span>&#160;{</div><div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160;</div><div class="line"><a name="l04764"></a><span class="lineno"> 4764</span>&#160;    BeginValue(<span class="keyword">true</span>);</div><div class="line"><a name="l04765"></a><span class="lineno"> 4765</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;    {</div><div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160;    }</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;}</div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;{</div><div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160;</div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; strLen; ++i)</div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160;    {</div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\&#39;&#39;</span>)</div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;        {</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160;        }</div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;&quot;&#39;</span>)</div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</span>&#160;        {</div><div class="line"><a name="l04787"></a><span class="lineno"> 4787</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;        }</div><div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;        {</div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;            m_SB.Add(ch);</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;        }</div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;        {</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div><div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;        }</div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;    }</div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;}</div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;{</div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;}</div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;{</div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160;}</div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;</div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160;{</div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</span>&#160;    m_SB.AddPointer(ptr);</div><div class="line"><a name="l04833"></a><span class="lineno"> 4833</span>&#160;}</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;{</div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;    <span class="keywordflow">if</span>(pStr != VMA_NULL &amp;&amp; pStr[0] != <span class="charliteral">&#39;\0&#39;</span>)</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;    {</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;    }</div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;    m_InsideString = <span class="keyword">false</span>;</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>&#160;}</div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;</div><div class="line"><a name="l04846"></a><span class="lineno"> 4846</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div><div class="line"><a name="l04847"></a><span class="lineno"> 4847</span>&#160;{</div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l04851"></a><span class="lineno"> 4851</span>&#160;}</div><div class="line"><a name="l04852"></a><span class="lineno"> 4852</span>&#160;</div><div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div><div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;{</div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;}</div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;</div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div><div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;{</div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;    m_SB.Add(b ? <span class="stringliteral">&quot;true&quot;</span> : <span class="stringliteral">&quot;false&quot;</span>);</div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;}</div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;</div><div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</div><div class="line"><a name="l04868"></a><span class="lineno"> 4868</span>&#160;{</div><div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</div><div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160;}</div><div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160;</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;{</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty())</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;    {</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;        StackItem&amp; currItem = m_Stack.back();</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;            currItem.valueCount % 2 == 0)</div><div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160;        {</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;            VMA_ASSERT(isString);</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;        }</div><div class="line"><a name="l04884"></a><span class="lineno"> 4884</span>&#160;</div><div class="line"><a name="l04885"></a><span class="lineno"> 4885</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;            currItem.valueCount % 2 != 0)</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;        {</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</div><div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;        }</div><div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;        {</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>&#160;            WriteIndent();</div><div class="line"><a name="l04894"></a><span class="lineno"> 4894</span>&#160;        }</div><div class="line"><a name="l04895"></a><span class="lineno"> 4895</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160;        {</div><div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;            WriteIndent();</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;        }</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;        ++currItem.valueCount;</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;    }</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;}</div><div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160;</div><div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;{</div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;    <span class="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160;    {</div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;        m_SB.AddNewLine();</div><div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160;        </div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</div><div class="line"><a name="l04911"></a><span class="lineno"> 4911</span>&#160;        {</div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160;            --count;</div><div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>&#160;        }</div><div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160;        {</div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160;            m_SB.Add(INDENT);</div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;        }</div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;    }</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;}</div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;</div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160;</div><div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>&#160;</div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::SetUserData(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160;{</div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160;    {</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;</div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;        FreeUserDataString(hAllocator);</div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160;</div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;        {</div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrSrc = (<span class="keywordtype">char</span>*)pUserData;</div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> newStrLen = strlen(newStrSrc);</div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160;            <span class="keywordtype">char</span>* <span class="keyword">const</span> newStrDst = vma_new_array(hAllocator, <span class="keywordtype">char</span>, newStrLen + 1);</div><div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;            memcpy(newStrDst, newStrSrc, newStrLen + 1);</div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;            m_pUserData = newStrDst;</div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;        }</div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;    }</div><div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>&#160;    {</div><div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>&#160;        m_pUserData = pUserData;</div><div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160;    }</div><div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>&#160;}</div><div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>&#160;</div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div><div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160;    VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;    VkDeviceSize offset)</div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;{</div><div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160;    VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;</div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;    {</div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;            ++mapRefCount;</div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;    }</div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;    m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;    m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;}</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;</div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;    {</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;    }</div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;}</div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;</div><div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;    {</div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;    }</div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;}</div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;</div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;uint32_t VmaAllocation_T::GetMemoryTypeIndex()<span class="keyword"> const</span></div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;    {</div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_MemoryTypeIndex;</div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;        <span class="keywordflow">return</span> UINT32_MAX;</div><div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160;    }</div><div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160;}</div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160;</div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>&#160;    {</div><div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>&#160;        {</div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div><div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>&#160;        }</div><div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;        {</div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;            <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;        }</div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160;    }</div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160;}</div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;    {</div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;    }</div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;}</div><div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>&#160;</div><div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>&#160;<a class="code" href="struct_vma_pool.html">VmaPool</a> VmaAllocation_T::GetPool()<span class="keyword"> const</span></div><div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;    <span class="keywordflow">return</span> m_BlockAllocation.m_hPool;</div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;}</div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;</div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;{</div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;    VMA_ASSERT(CanBecomeLost());</div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;</div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;    {</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;        {</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;        }</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;        {</div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;        }</div><div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l05078"></a><span class="lineno"> 5078</span>&#160;        {</div><div class="line"><a name="l05079"></a><span class="lineno"> 5079</span>&#160;            <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>&#160;            {</div><div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;                <span class="comment">// Setting hAllocation.LastUseFrameIndex atomic to VMA_FRAME_INDEX_LOST is enough to mark it as LOST.</span></div><div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05084"></a><span class="lineno"> 5084</span>&#160;            }</div><div class="line"><a name="l05085"></a><span class="lineno"> 5085</span>&#160;        }</div><div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;    }</div><div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160;}</div><div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;</div><div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>&#160;{</div><div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;    VMA_ASSERT(IsUserDataString());</div><div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160;    {</div><div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;        <span class="keywordtype">char</span>* <span class="keyword">const</span> oldStr = (<span class="keywordtype">char</span>*)m_pUserData;</div><div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldStrLen = strlen(oldStr);</div><div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;        vma_delete_array(hAllocator, oldStr, oldStrLen + 1);</div><div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;        m_pUserData = VMA_NULL;</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;    }</div><div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;}</div><div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160;</div><div class="line"><a name="l05101"></a><span class="lineno"> 5101</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div><div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>&#160;{</div><div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;</div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;    {</div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;        ++m_MapCount;</div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;    }</div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;    {</div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;    }</div><div class="line"><a name="l05113"></a><span class="lineno"> 5113</span>&#160;}</div><div class="line"><a name="l05114"></a><span class="lineno"> 5114</span>&#160;</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;{</div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;</div><div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;    {</div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;        --m_MapCount;</div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;    }</div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;    {</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160;    }</div><div class="line"><a name="l05127"></a><span class="lineno"> 5127</span>&#160;}</div><div class="line"><a name="l05128"></a><span class="lineno"> 5128</span>&#160;</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160;VkResult VmaAllocation_T::DedicatedAllocMap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;{</div><div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160;</div><div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;    {</div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;        <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;        {</div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;            ++m_MapCount;</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;        }</div><div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;        {</div><div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160;        }</div><div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160;    }</div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;    {</div><div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;            m_DedicatedAllocation.m_hMemory,</div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;            ppData);</div><div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160;        {</div><div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160;            m_DedicatedAllocation.m_pMappedData = *ppData;</div><div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160;            m_MapCount = 1;</div><div class="line"><a name="l05161"></a><span class="lineno"> 5161</span>&#160;        }</div><div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160;    }</div><div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160;}</div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;</div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160;{</div><div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160;</div><div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;    {</div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;        --m_MapCount;</div><div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;        {</div><div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div><div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;                hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160;                m_DedicatedAllocation.m_hMemory);</div><div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160;        }</div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160;    }</div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;    {</div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</span>);</div><div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160;    }</div><div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;}</div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160;</div><div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;</div><div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div><div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VMA_SUBALLOCATION_TYPE_NAMES[] = {</div><div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div><div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div><div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div><div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div><div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;};</div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPrintStatInfo(VmaJsonWriter&amp; json, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; stat)</div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;{</div><div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160;    json.BeginObject();</div><div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div><div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>&#160;</div><div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</div><div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160;</div><div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div><div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160;</div><div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div><div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div><div class="line"><a name="l05214"></a><span class="lineno"> 5214</span>&#160;</div><div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div><div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;</div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 1)</div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;    {</div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div><div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div><div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;        json.EndObject();</div><div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;    }</div><div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;</div><div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;    <span class="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 1)</div><div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;    {</div><div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div><div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;        json.EndObject();</div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;    }</div><div class="line"><a name="l05243"></a><span class="lineno"> 5243</span>&#160;</div><div class="line"><a name="l05244"></a><span class="lineno"> 5244</span>&#160;    json.EndObject();</div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;}</div><div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;</div><div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>&#160;</div><div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;{</div><div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</div><div class="line"><a name="l05256"></a><span class="lineno"> 5256</span>&#160;    }</div><div class="line"><a name="l05257"></a><span class="lineno"> 5257</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</div><div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160;    }</div><div class="line"><a name="l05263"></a><span class="lineno"> 5263</span>&#160;};</div><div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160;</div><div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;<span class="comment">// class VmaBlockMetadata</span></div><div class="line"><a name="l05267"></a><span class="lineno"> 5267</span>&#160;</div><div class="line"><a name="l05268"></a><span class="lineno"> 5268</span>&#160;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;    m_Size(0),</div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;    m_FreeCount(0),</div><div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;{</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;}</div><div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160;</div><div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;VmaBlockMetadata::~VmaBlockMetadata()</div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;{</div><div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;}</div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Init(VkDeviceSize size)</div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;{</div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;    m_Size = size;</div><div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;    m_FreeCount = 1;</div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;    m_SumFreeSize = size;</div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;</div><div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;    VmaSuballocation suballoc = {};</div><div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;    suballoc.offset = 0;</div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;    suballoc.size = size;</div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;</div><div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160;    m_Suballocations.push_back(suballoc);</div><div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;    --suballocItem;</div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;}</div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;</div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;    <span class="keywordflow">if</span>(m_Suballocations.empty())</div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;    {</div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;    }</div><div class="line"><a name="l05305"></a><span class="lineno"> 5305</span>&#160;    </div><div class="line"><a name="l05306"></a><span class="lineno"> 5306</span>&#160;    <span class="comment">// Expected offset of new suballocation as calculates from previous ones.</span></div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;    VkDeviceSize calculatedOffset = 0;</div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;    uint32_t calculatedFreeCount = 0;</div><div class="line"><a name="l05310"></a><span class="lineno"> 5310</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l05311"></a><span class="lineno"> 5311</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div><div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div><div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;    <span class="comment">// True if previous visisted suballocation was free.</span></div><div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div><div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160;</div><div class="line"><a name="l05318"></a><span class="lineno"> 5318</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160;    {</div><div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</div><div class="line"><a name="l05323"></a><span class="lineno"> 5323</span>&#160;        </div><div class="line"><a name="l05324"></a><span class="lineno"> 5324</span>&#160;        <span class="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div><div class="line"><a name="l05325"></a><span class="lineno"> 5325</span>&#160;        <span class="keywordflow">if</span>(subAlloc.offset != calculatedOffset)</div><div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160;        {</div><div class="line"><a name="l05327"></a><span class="lineno"> 5327</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05328"></a><span class="lineno"> 5328</span>&#160;        }</div><div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;</div><div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;        <span class="keywordflow">if</span>(prevFree &amp;&amp; currFree)</div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;        {</div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;        }</div><div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;</div><div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160;        <span class="keywordflow">if</span>(currFree != (subAlloc.hAllocation == VK_NULL_HANDLE))</div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160;        {</div><div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;        }</div><div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;</div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;        <span class="keywordflow">if</span>(currFree)</div><div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;        {</div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;            calculatedSumFreeSize += subAlloc.size;</div><div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160;            ++calculatedFreeCount;</div><div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;            {</div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;                ++freeSuballocationsToRegister;</div><div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160;            }</div><div class="line"><a name="l05350"></a><span class="lineno"> 5350</span>&#160;        }</div><div class="line"><a name="l05351"></a><span class="lineno"> 5351</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05352"></a><span class="lineno"> 5352</span>&#160;        {</div><div class="line"><a name="l05353"></a><span class="lineno"> 5353</span>&#160;            <span class="keywordflow">if</span>(subAlloc.hAllocation-&gt;GetOffset() != subAlloc.offset)</div><div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;            {</div><div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;            }</div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;            <span class="keywordflow">if</span>(subAlloc.hAllocation-&gt;GetSize() != subAlloc.size)</div><div class="line"><a name="l05358"></a><span class="lineno"> 5358</span>&#160;            {</div><div class="line"><a name="l05359"></a><span class="lineno"> 5359</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160;            }</div><div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160;        }</div><div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160;</div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;        calculatedOffset += subAlloc.size;</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;        prevFree = currFree;</div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;    }</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;</div><div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div><div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160;    <span class="comment">// match expected one.</span></div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;    <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.size() != freeSuballocationsToRegister)</div><div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;    {</div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05372"></a><span class="lineno"> 5372</span>&#160;    }</div><div class="line"><a name="l05373"></a><span class="lineno"> 5373</span>&#160;</div><div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_FreeSuballocationsBySize.size(); ++i)</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;    {</div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l05378"></a><span class="lineno"> 5378</span>&#160;        </div><div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;        <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;        {</div><div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160;        }</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;size &lt; lastSize)</div><div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>&#160;        {</div><div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160;        }</div><div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>&#160;</div><div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>&#160;        lastSize = suballocItem-&gt;size;</div><div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160;    }</div><div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;</div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;    <span class="comment">// Check if totals match calculacted values.</span></div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;    <span class="keywordflow">if</span>(!ValidateFreeSuballocationList() ||</div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;        (calculatedOffset != m_Size) ||</div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;        (calculatedSumFreeSize != m_SumFreeSize) ||</div><div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160;        (calculatedFreeCount != m_FreeCount))</div><div class="line"><a name="l05398"></a><span class="lineno"> 5398</span>&#160;    {</div><div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;    }</div><div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;</div><div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;}</div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;</div><div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;VkDeviceSize VmaBlockMetadata::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</div><div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;    {</div><div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;        <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</div><div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;    }</div><div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>&#160;    {</div><div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>&#160;    }</div><div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>&#160;}</div><div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;</div><div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::IsEmpty()<span class="keyword"> const</span></div><div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</div><div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;}</div><div class="line"><a name="l05421"></a><span class="lineno"> 5421</span>&#160;</div><div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)<span class="keyword"> const</span></div><div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>&#160;</div><div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div><div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div><div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;    </div><div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div><div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160;</div><div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160;</div><div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;    {</div><div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05444"></a><span class="lineno"> 5444</span>&#160;        {</div><div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, suballoc.size);</div><div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div><div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;        }</div><div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>&#160;        {</div><div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, suballoc.size);</div><div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, suballoc.size);</div><div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>&#160;        }</div><div class="line"><a name="l05453"></a><span class="lineno"> 5453</span>&#160;    }</div><div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160;}</div><div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;</div><div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats)<span class="keyword"> const</span></div><div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05458"></a><span class="lineno"> 5458</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l05459"></a><span class="lineno"> 5459</span>&#160;</div><div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += m_Size;</div><div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div><div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div><div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = VMA_MAX(inoutStats.<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>, GetUnusedRangeSizeMax());</div><div class="line"><a name="l05465"></a><span class="lineno"> 5465</span>&#160;}</div><div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>&#160;</div><div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>&#160;</div><div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;    json.BeginObject();</div><div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;</div><div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div><div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;    json.WriteNumber(m_Size);</div><div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160;</div><div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;    json.WriteNumber(m_SumFreeSize);</div><div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;</div><div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;    json.WriteNumber((uint64_t)m_Suballocations.size() - m_FreeCount);</div><div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;</div><div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>&#160;    json.WriteNumber(m_FreeCount);</div><div class="line"><a name="l05484"></a><span class="lineno"> 5484</span>&#160;</div><div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div><div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>&#160;    json.BeginArray();</div><div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>&#160;    <span class="keywordtype">size_t</span> i = 0;</div><div class="line"><a name="l05488"></a><span class="lineno"> 5488</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l05489"></a><span class="lineno"> 5489</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160;        ++suballocItem, ++i)</div><div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>&#160;    {</div><div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l05493"></a><span class="lineno"> 5493</span>&#160;        </div><div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;        json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[suballocItem-&gt;type]);</div><div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;</div><div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>&#160;        json.WriteNumber(suballocItem-&gt;size);</div><div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>&#160;</div><div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;        json.WriteNumber(suballocItem-&gt;offset);</div><div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>&#160;</div><div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160;        {</div><div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData = suballocItem-&gt;hAllocation-&gt;GetUserData();</div><div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;            <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160;            {</div><div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;                json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;                <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;IsUserDataString())</div><div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>&#160;                {</div><div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>&#160;                    json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData);</div><div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;                }</div><div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05514"></a><span class="lineno"> 5514</span>&#160;                {</div><div class="line"><a name="l05515"></a><span class="lineno"> 5515</span>&#160;                    json.BeginString();</div><div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>&#160;                    json.ContinueString_Pointer(pUserData);</div><div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>&#160;                    json.EndString();</div><div class="line"><a name="l05518"></a><span class="lineno"> 5518</span>&#160;                }</div><div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>&#160;            }</div><div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>&#160;        }</div><div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;</div><div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;        json.EndObject();</div><div class="line"><a name="l05523"></a><span class="lineno"> 5523</span>&#160;    }</div><div class="line"><a name="l05524"></a><span class="lineno"> 5524</span>&#160;    json.EndArray();</div><div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>&#160;</div><div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>&#160;    json.EndObject();</div><div class="line"><a name="l05527"></a><span class="lineno"> 5527</span>&#160;}</div><div class="line"><a name="l05528"></a><span class="lineno"> 5528</span>&#160;</div><div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05530"></a><span class="lineno"> 5530</span>&#160;</div><div class="line"><a name="l05531"></a><span class="lineno"> 5531</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;<span class="comment">How many suitable free suballocations to analyze before choosing best one.</span></div><div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>&#160;<span class="comment">- Set to 1 to use First-Fit algorithm - first suitable free suballocation will</span></div><div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>&#160;<span class="comment">  be chosen.</span></div><div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;<span class="comment">- Set to UINT32_MAX to use Best-Fit/Worst-Fit algorithm - all suitable free</span></div><div class="line"><a name="l05536"></a><span class="lineno"> 5536</span>&#160;<span class="comment">  suballocations will be analized and best one will be chosen.</span></div><div class="line"><a name="l05537"></a><span class="lineno"> 5537</span>&#160;<span class="comment">- Any other value is also acceptable.</span></div><div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;<span class="comment">//static const uint32_t MAX_SUITABLE_SUBALLOCATIONS_TO_CHECK = 8;</span></div><div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;</div><div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::CreateFirstAllocationRequest(VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l05542"></a><span class="lineno"> 5542</span>&#160;{</div><div class="line"><a name="l05543"></a><span class="lineno"> 5543</span>&#160;    VMA_ASSERT(IsEmpty());</div><div class="line"><a name="l05544"></a><span class="lineno"> 5544</span>&#160;    pAllocationRequest-&gt;offset = 0;</div><div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;    pAllocationRequest-&gt;sumFreeSize = m_SumFreeSize;</div><div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;    pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;    pAllocationRequest-&gt;item = m_Suballocations.begin();</div><div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>&#160;    pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>&#160;}</div><div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;</div><div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::CreateAllocationRequest(</div><div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l05560"></a><span class="lineno"> 5560</span>&#160;{</div><div class="line"><a name="l05561"></a><span class="lineno"> 5561</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l05564"></a><span class="lineno"> 5564</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l05565"></a><span class="lineno"> 5565</span>&#160;</div><div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160;    <span class="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div><div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp; m_SumFreeSize &lt; allocSize)</div><div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160;    {</div><div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05570"></a><span class="lineno"> 5570</span>&#160;    }</div><div class="line"><a name="l05571"></a><span class="lineno"> 5571</span>&#160;</div><div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;    <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div><div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</div><div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;    {</div><div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;        <span class="keywordflow">if</span>(VMA_BEST_FIT)</div><div class="line"><a name="l05577"></a><span class="lineno"> 5577</span>&#160;        {</div><div class="line"><a name="l05578"></a><span class="lineno"> 5578</span>&#160;            <span class="comment">// Find first free suballocation with size not less than allocSize.</span></div><div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;                m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div><div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160;                allocSize,</div><div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;                VmaSuballocationItemSizeLess());</div><div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</div><div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160;            {</div><div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l05590"></a><span class="lineno"> 5590</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>&#160;                    allocSize,</div><div class="line"><a name="l05592"></a><span class="lineno"> 5592</span>&#160;                    allocAlignment,</div><div class="line"><a name="l05593"></a><span class="lineno"> 5593</span>&#160;                    allocType,</div><div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l05598"></a><span class="lineno"> 5598</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l05599"></a><span class="lineno"> 5599</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l05600"></a><span class="lineno"> 5600</span>&#160;                {</div><div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05603"></a><span class="lineno"> 5603</span>&#160;                }</div><div class="line"><a name="l05604"></a><span class="lineno"> 5604</span>&#160;            }</div><div class="line"><a name="l05605"></a><span class="lineno"> 5605</span>&#160;        }</div><div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>&#160;        {</div><div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>&#160;            <span class="comment">// Search staring from biggest suballocations.</span></div><div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div><div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>&#160;            {</div><div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>&#160;                    allocSize,</div><div class="line"><a name="l05616"></a><span class="lineno"> 5616</span>&#160;                    allocAlignment,</div><div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;                    allocType,</div><div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l05621"></a><span class="lineno"> 5621</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;                {</div><div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05627"></a><span class="lineno"> 5627</span>&#160;                }</div><div class="line"><a name="l05628"></a><span class="lineno"> 5628</span>&#160;            }</div><div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>&#160;        }</div><div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>&#160;    }</div><div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>&#160;</div><div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>&#160;    {</div><div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;        <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div><div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>&#160;</div><div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>&#160;        pAllocationRequest-&gt;sumFreeSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;        pAllocationRequest-&gt;sumItemSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;</div><div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div><div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div><div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;            suballocIt != m_Suballocations.end();</div><div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;            ++suballocIt)</div><div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>&#160;        {</div><div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>&#160;            <span class="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div><div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;            {</div><div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;                    allocSize,</div><div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;                    allocAlignment,</div><div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;                    allocType,</div><div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;                    suballocIt,</div><div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160;                    &amp;tmpAllocRequest.offset,</div><div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div><div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div><div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div><div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;                {</div><div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;                    tmpAllocRequest.item = suballocIt;</div><div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;</div><div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;                    <span class="keywordflow">if</span>(tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost())</div><div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;                    {</div><div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;                        *pAllocationRequest = tmpAllocRequest;</div><div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160;                    }</div><div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;                }</div><div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;            }</div><div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;        }</div><div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;</div><div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;sumItemSize != VK_WHOLE_SIZE)</div><div class="line"><a name="l05672"></a><span class="lineno"> 5672</span>&#160;        {</div><div class="line"><a name="l05673"></a><span class="lineno"> 5673</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>&#160;        }</div><div class="line"><a name="l05675"></a><span class="lineno"> 5675</span>&#160;    }</div><div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;</div><div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>&#160;}</div><div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>&#160;</div><div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::MakeRequestedAllocationsLost(</div><div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;{</div><div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;    <span class="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</div><div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;    {</div><div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;        {</div><div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160;            ++pAllocationRequest-&gt;item;</div><div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>&#160;        }</div><div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;        {</div><div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div><div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l05698"></a><span class="lineno"> 5698</span>&#160;        }</div><div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;        {</div><div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;        }</div><div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;    }</div><div class="line"><a name="l05704"></a><span class="lineno"> 5704</span>&#160;</div><div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;    </div><div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;}</div><div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;</div><div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;uint32_t VmaBlockMetadata::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;{</div><div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;        ++it)</div><div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;    {</div><div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>&#160;        {</div><div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;            it = FreeSuballocation(it);</div><div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;            ++lostAllocationCount;</div><div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;        }</div><div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160;    }</div><div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div><div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;}</div><div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;</div><div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Alloc(</div><div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;{</div><div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div><div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div><div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div><div class="line"><a name="l05739"></a><span class="lineno"> 5739</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05740"></a><span class="lineno"> 5740</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div><div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div><div class="line"><a name="l05742"></a><span class="lineno"> 5742</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div><div class="line"><a name="l05743"></a><span class="lineno"> 5743</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div><div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div><div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;</div><div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;    <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div><div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;    <span class="comment">// it to become used.</span></div><div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160;    UnregisterFreeSuballocation(request.item);</div><div class="line"><a name="l05749"></a><span class="lineno"> 5749</span>&#160;</div><div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;    suballoc.offset = request.offset;</div><div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;    suballoc.size = allocSize;</div><div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;    suballoc.type = type;</div><div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;    suballoc.hAllocation = hAllocation;</div><div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160;</div><div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;    <span class="comment">// If there are any free bytes remaining at the end, insert new free suballocation after current one.</span></div><div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</div><div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160;    {</div><div class="line"><a name="l05758"></a><span class="lineno"> 5758</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div><div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;        paddingSuballoc.size = paddingEnd;</div><div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;        VmaSuballocationList::iterator next = request.item;</div><div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;        ++next;</div><div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div><div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div><div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</div><div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;    }</div><div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160;</div><div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;    <span class="comment">// If there are any free bytes remaining at the beginning, insert new free suballocation before current one.</span></div><div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div><div class="line"><a name="l05771"></a><span class="lineno"> 5771</span>&#160;    {</div><div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div><div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160;        paddingSuballoc.size = paddingBegin;</div><div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div><div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div><div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</div><div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;    }</div><div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;</div><div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;    m_FreeCount = m_FreeCount - 1;</div><div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</div><div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>&#160;    {</div><div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>&#160;    }</div><div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>&#160;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</div><div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160;    {</div><div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>&#160;    }</div><div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l05792"></a><span class="lineno"> 5792</span>&#160;}</div><div class="line"><a name="l05793"></a><span class="lineno"> 5793</span>&#160;</div><div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;{</div><div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;    {</div><div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05801"></a><span class="lineno"> 5801</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div><div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;        {</div><div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l05806"></a><span class="lineno"> 5806</span>&#160;        }</div><div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;    }</div><div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;}</div><div class="line"><a name="l05810"></a><span class="lineno"> 5810</span>&#160;</div><div class="line"><a name="l05811"></a><span class="lineno"> 5811</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::FreeAtOffset(VkDeviceSize offset)</div><div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;{</div><div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;        ++suballocItem)</div><div class="line"><a name="l05816"></a><span class="lineno"> 5816</span>&#160;    {</div><div class="line"><a name="l05817"></a><span class="lineno"> 5817</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</div><div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;        {</div><div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l05821"></a><span class="lineno"> 5821</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160;        }</div><div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>&#160;    }</div><div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l05825"></a><span class="lineno"> 5825</span>&#160;}</div><div class="line"><a name="l05826"></a><span class="lineno"> 5826</span>&#160;</div><div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::ValidateFreeSuballocationList()<span class="keyword"> const</span></div><div class="line"><a name="l05828"></a><span class="lineno"> 5828</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05829"></a><span class="lineno"> 5829</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = m_FreeSuballocationsBySize.size(); i &lt; count; ++i)</div><div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;    {</div><div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160;</div><div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160;        {</div><div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160;        }</div><div class="line"><a name="l05839"></a><span class="lineno"> 5839</span>&#160;        <span class="keywordflow">if</span>(it-&gt;size &lt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>&#160;        {</div><div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>&#160;        }</div><div class="line"><a name="l05844"></a><span class="lineno"> 5844</span>&#160;        <span class="keywordflow">if</span>(it-&gt;size &lt; lastSize)</div><div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>&#160;        {</div><div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160;        }</div><div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;</div><div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160;        lastSize = it-&gt;size;</div><div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;    }</div><div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;}</div><div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;</div><div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata::CheckAllocation(</div><div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;    VkDeviceSize* pOffset,</div><div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;    VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div><div class="line"><a name="l05868"></a><span class="lineno"> 5868</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l05870"></a><span class="lineno"> 5870</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l05871"></a><span class="lineno"> 5871</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div><div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</div><div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;    </div><div class="line"><a name="l05874"></a><span class="lineno"> 5874</span>&#160;    *itemsToMakeLostCount = 0;</div><div class="line"><a name="l05875"></a><span class="lineno"> 5875</span>&#160;    *pSumFreeSize = 0;</div><div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>&#160;    *pSumItemSize = 0;</div><div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;</div><div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l05879"></a><span class="lineno"> 5879</span>&#160;    {</div><div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;        {</div><div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;            *pSumFreeSize = suballocItem-&gt;size;</div><div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;        }</div><div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160;        {</div><div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>&#160;            {</div><div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>&#160;                ++*itemsToMakeLostCount;</div><div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</div><div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>&#160;            }</div><div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160;            {</div><div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;            }</div><div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>&#160;        }</div><div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;</div><div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div><div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;        <span class="keywordflow">if</span>(m_Size - suballocItem-&gt;offset &lt; allocSize)</div><div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;        {</div><div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05902"></a><span class="lineno"> 5902</span>&#160;        }</div><div class="line"><a name="l05903"></a><span class="lineno"> 5903</span>&#160;</div><div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;        *pOffset = suballocItem-&gt;offset;</div><div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>&#160;    </div><div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l05908"></a><span class="lineno"> 5908</span>&#160;        <span class="keywordflow">if</span>((VMA_DEBUG_MARGIN &gt; 0) &amp;&amp; suballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l05909"></a><span class="lineno"> 5909</span>&#160;        {</div><div class="line"><a name="l05910"></a><span class="lineno"> 5910</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160;        }</div><div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;    </div><div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = VMA_MAX(allocAlignment, static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_ALIGNMENT));</div><div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>&#160;        *pOffset = VmaAlignUp(*pOffset, alignment);</div><div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;</div><div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l05918"></a><span class="lineno"> 5918</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l05919"></a><span class="lineno"> 5919</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l05920"></a><span class="lineno"> 5920</span>&#160;        {</div><div class="line"><a name="l05921"></a><span class="lineno"> 5921</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l05923"></a><span class="lineno"> 5923</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l05924"></a><span class="lineno"> 5924</span>&#160;            {</div><div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>&#160;                {</div><div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>&#160;                    {</div><div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l05933"></a><span class="lineno"> 5933</span>&#160;                    }</div><div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;                }</div><div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l05938"></a><span class="lineno"> 5938</span>&#160;            }</div><div class="line"><a name="l05939"></a><span class="lineno"> 5939</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160;            {</div><div class="line"><a name="l05941"></a><span class="lineno"> 5941</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l05942"></a><span class="lineno"> 5942</span>&#160;            }</div><div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>&#160;        }</div><div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;    </div><div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div><div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;        <span class="comment">// If yes, return false - this function should be called for another suballocItem as starting point.</span></div><div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</div><div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;        {</div><div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;        }</div><div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160;    </div><div class="line"><a name="l05952"></a><span class="lineno"> 5952</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l05953"></a><span class="lineno"> 5953</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div><div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>&#160;</div><div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>&#160;        <span class="comment">// Calculate required margin at the end if this is not last suballocation.</span></div><div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>&#160;        VmaSuballocationList::const_iterator next = suballocItem;</div><div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>&#160;        ++next;</div><div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin =</div><div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>&#160;            (next != m_Suballocations.cend()) ? VMA_DEBUG_MARGIN : 0;</div><div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;</div><div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div><div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;        <span class="comment">// Another early return check.</span></div><div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; m_Size)</div><div class="line"><a name="l05964"></a><span class="lineno"> 5964</span>&#160;        {</div><div class="line"><a name="l05965"></a><span class="lineno"> 5965</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05966"></a><span class="lineno"> 5966</span>&#160;        }</div><div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;</div><div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div><div class="line"><a name="l05969"></a><span class="lineno"> 5969</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div><div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div><div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</div><div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;        {</div><div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div><div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</div><div class="line"><a name="l05975"></a><span class="lineno"> 5975</span>&#160;            {</div><div class="line"><a name="l05976"></a><span class="lineno"> 5976</span>&#160;                ++lastSuballocItem;</div><div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div><div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;                {</div><div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05980"></a><span class="lineno"> 5980</span>&#160;                }</div><div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;                {</div><div class="line"><a name="l05983"></a><span class="lineno"> 5983</span>&#160;                    *pSumFreeSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l05984"></a><span class="lineno"> 5984</span>&#160;                }</div><div class="line"><a name="l05985"></a><span class="lineno"> 5985</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l05986"></a><span class="lineno"> 5986</span>&#160;                {</div><div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>&#160;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>&#160;                    {</div><div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>&#160;                        ++*itemsToMakeLostCount;</div><div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>&#160;                    }</div><div class="line"><a name="l05994"></a><span class="lineno"> 5994</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l05995"></a><span class="lineno"> 5995</span>&#160;                    {</div><div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;                    }</div><div class="line"><a name="l05998"></a><span class="lineno"> 5998</span>&#160;                }</div><div class="line"><a name="l05999"></a><span class="lineno"> 5999</span>&#160;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div><div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div><div class="line"><a name="l06001"></a><span class="lineno"> 6001</span>&#160;            }</div><div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>&#160;        }</div><div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>&#160;</div><div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06005"></a><span class="lineno"> 6005</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l06006"></a><span class="lineno"> 6006</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;        {</div><div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div><div class="line"><a name="l06009"></a><span class="lineno"> 6009</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160;            {</div><div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;                {</div><div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160;                    {</div><div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l06020"></a><span class="lineno"> 6020</span>&#160;                        {</div><div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>&#160;                            ++*itemsToMakeLostCount;</div><div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160;                        }</div><div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l06024"></a><span class="lineno"> 6024</span>&#160;                        {</div><div class="line"><a name="l06025"></a><span class="lineno"> 6025</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06026"></a><span class="lineno"> 6026</span>&#160;                        }</div><div class="line"><a name="l06027"></a><span class="lineno"> 6027</span>&#160;                    }</div><div class="line"><a name="l06028"></a><span class="lineno"> 6028</span>&#160;                }</div><div class="line"><a name="l06029"></a><span class="lineno"> 6029</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>&#160;                {</div><div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l06032"></a><span class="lineno"> 6032</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06033"></a><span class="lineno"> 6033</span>&#160;                }</div><div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;            }</div><div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>&#160;        }</div><div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>&#160;    }</div><div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06039"></a><span class="lineno"> 6039</span>&#160;    {</div><div class="line"><a name="l06040"></a><span class="lineno"> 6040</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06042"></a><span class="lineno"> 6042</span>&#160;</div><div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;        *pSumFreeSize = suballoc.size;</div><div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;</div><div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div><div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</div><div class="line"><a name="l06047"></a><span class="lineno"> 6047</span>&#160;        {</div><div class="line"><a name="l06048"></a><span class="lineno"> 6048</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;        }</div><div class="line"><a name="l06050"></a><span class="lineno"> 6050</span>&#160;</div><div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;        *pOffset = suballoc.offset;</div><div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>&#160;    </div><div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;        <span class="keywordflow">if</span>((VMA_DEBUG_MARGIN &gt; 0) &amp;&amp; suballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;        {</div><div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;        }</div><div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>&#160;    </div><div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l06061"></a><span class="lineno"> 6061</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = VMA_MAX(allocAlignment, static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_ALIGNMENT));</div><div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>&#160;        *pOffset = VmaAlignUp(*pOffset, alignment);</div><div class="line"><a name="l06063"></a><span class="lineno"> 6063</span>&#160;    </div><div class="line"><a name="l06064"></a><span class="lineno"> 6064</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160;        {</div><div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l06069"></a><span class="lineno"> 6069</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l06070"></a><span class="lineno"> 6070</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>&#160;            {</div><div class="line"><a name="l06072"></a><span class="lineno"> 6072</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;                {</div><div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>&#160;                    {</div><div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;                    }</div><div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;                }</div><div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l06084"></a><span class="lineno"> 6084</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>&#160;            }</div><div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>&#160;            {</div><div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>&#160;            }</div><div class="line"><a name="l06090"></a><span class="lineno"> 6090</span>&#160;        }</div><div class="line"><a name="l06091"></a><span class="lineno"> 6091</span>&#160;    </div><div class="line"><a name="l06092"></a><span class="lineno"> 6092</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div><div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;</div><div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;        <span class="comment">// Calculate required margin at the end if this is not last suballocation.</span></div><div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;        VmaSuballocationList::const_iterator next = suballocItem;</div><div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;        ++next;</div><div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin =</div><div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;            (next != m_Suballocations.cend()) ? VMA_DEBUG_MARGIN : 0;</div><div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;</div><div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;        <span class="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div><div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div><div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;        {</div><div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;        }</div><div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160;</div><div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>&#160;        {</div><div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div><div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;            {</div><div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>&#160;                {</div><div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;                    {</div><div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>&#160;                    }</div><div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>&#160;                }</div><div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;                {</div><div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l06126"></a><span class="lineno"> 6126</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06127"></a><span class="lineno"> 6127</span>&#160;                }</div><div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;            }</div><div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;        }</div><div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;    }</div><div class="line"><a name="l06132"></a><span class="lineno"> 6132</span>&#160;</div><div class="line"><a name="l06133"></a><span class="lineno"> 6133</span>&#160;    <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div><div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>&#160;}</div><div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;</div><div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::MergeFreeWithNext(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;{</div><div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div><div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>&#160;    </div><div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160;    VmaSuballocationList::iterator nextItem = item;</div><div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;    ++nextItem;</div><div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div><div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>&#160;</div><div class="line"><a name="l06147"></a><span class="lineno"> 6147</span>&#160;    item-&gt;size += nextItem-&gt;size;</div><div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;    m_Suballocations.erase(nextItem);</div><div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;}</div><div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;</div><div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;VmaSuballocationList::iterator VmaBlockMetadata::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div><div class="line"><a name="l06153"></a><span class="lineno"> 6153</span>&#160;{</div><div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>&#160;    <span class="comment">// Change this suballocation to be marked as free.</span></div><div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06156"></a><span class="lineno"> 6156</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06157"></a><span class="lineno"> 6157</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l06158"></a><span class="lineno"> 6158</span>&#160;    </div><div class="line"><a name="l06159"></a><span class="lineno"> 6159</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>&#160;    m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>&#160;</div><div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div><div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div><div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div><div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>&#160;    </div><div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div><div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;    ++nextItem;</div><div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160;    <span class="keywordflow">if</span>((nextItem != m_Suballocations.end()) &amp;&amp; (nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE))</div><div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;    {</div><div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</div><div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>&#160;    }</div><div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>&#160;</div><div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;    VmaSuballocationList::iterator prevItem = suballocItem;</div><div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div><div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;    {</div><div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;        --prevItem;</div><div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160;        {</div><div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>&#160;            mergeWithPrev = <span class="keyword">true</span>;</div><div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>&#160;        }</div><div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>&#160;    }</div><div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;</div><div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</div><div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;    {</div><div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;        UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>&#160;        MergeFreeWithNext(suballocItem);</div><div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>&#160;    }</div><div class="line"><a name="l06189"></a><span class="lineno"> 6189</span>&#160;</div><div class="line"><a name="l06190"></a><span class="lineno"> 6190</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</div><div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;    {</div><div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;        UnregisterFreeSuballocation(prevItem);</div><div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;        MergeFreeWithNext(prevItem);</div><div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;        RegisterFreeSuballocation(prevItem);</div><div class="line"><a name="l06195"></a><span class="lineno"> 6195</span>&#160;        <span class="keywordflow">return</span> prevItem;</div><div class="line"><a name="l06196"></a><span class="lineno"> 6196</span>&#160;    }</div><div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06198"></a><span class="lineno"> 6198</span>&#160;    {</div><div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;        RegisterFreeSuballocation(suballocItem);</div><div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>&#160;        <span class="keywordflow">return</span> suballocItem;</div><div class="line"><a name="l06201"></a><span class="lineno"> 6201</span>&#160;    }</div><div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>&#160;}</div><div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;</div><div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160;{</div><div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06207"></a><span class="lineno"> 6207</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l06208"></a><span class="lineno"> 6208</span>&#160;</div><div class="line"><a name="l06209"></a><span class="lineno"> 6209</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>&#160;</div><div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;    {</div><div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>&#160;        <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</div><div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>&#160;        {</div><div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;            m_FreeSuballocationsBySize.push_back(item);</div><div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;        }</div><div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;        {</div><div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</div><div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>&#160;        }</div><div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;    }</div><div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;</div><div class="line"><a name="l06225"></a><span class="lineno"> 6225</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l06226"></a><span class="lineno"> 6226</span>&#160;}</div><div class="line"><a name="l06227"></a><span class="lineno"> 6227</span>&#160;</div><div class="line"><a name="l06228"></a><span class="lineno"> 6228</span>&#160;</div><div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160;{</div><div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>&#160;</div><div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>&#160;    <span class="comment">// You may want to enable this validation at the beginning or at the end of</span></div><div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;</div><div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;    {</div><div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;            m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div><div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;            item,</div><div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;            VmaSuballocationItemSizeLess());</div><div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>&#160;            ++index)</div><div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;        {</div><div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>&#160;            <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</div><div class="line"><a name="l06250"></a><span class="lineno"> 6250</span>&#160;            {</div><div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>&#160;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div><div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>&#160;            }</div><div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;            VMA_ASSERT((m_FreeSuballocationsBySize[index]-&gt;size == item-&gt;size) &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div><div class="line"><a name="l06255"></a><span class="lineno"> 6255</span>&#160;        }</div><div class="line"><a name="l06256"></a><span class="lineno"> 6256</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</div><div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>&#160;    }</div><div class="line"><a name="l06258"></a><span class="lineno"> 6258</span>&#160;</div><div class="line"><a name="l06259"></a><span class="lineno"> 6259</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></div><div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;}</div><div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;</div><div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></div><div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>&#160;</div><div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>&#160;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>&#160;    m_Metadata(hAllocator),</div><div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div><div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div><div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;    m_MapCount(0),</div><div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;    m_pMappedData(VMA_NULL)</div><div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>&#160;{</div><div class="line"><a name="l06272"></a><span class="lineno"> 6272</span>&#160;}</div><div class="line"><a name="l06273"></a><span class="lineno"> 6273</span>&#160;</div><div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div><div class="line"><a name="l06275"></a><span class="lineno"> 6275</span>&#160;    uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l06276"></a><span class="lineno"> 6276</span>&#160;    VkDeviceMemory newMemory,</div><div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;    VkDeviceSize newSize)</div><div class="line"><a name="l06278"></a><span class="lineno"> 6278</span>&#160;{</div><div class="line"><a name="l06279"></a><span class="lineno"> 6279</span>&#160;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;</div><div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div><div class="line"><a name="l06282"></a><span class="lineno"> 6282</span>&#160;    m_hMemory = newMemory;</div><div class="line"><a name="l06283"></a><span class="lineno"> 6283</span>&#160;</div><div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160;    m_Metadata.Init(newSize);</div><div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>&#160;}</div><div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160;</div><div class="line"><a name="l06287"></a><span class="lineno"> 6287</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Destroy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l06288"></a><span class="lineno"> 6288</span>&#160;{</div><div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div><div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div><div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;    VMA_ASSERT(m_Metadata.IsEmpty() &amp;&amp; <span class="stringliteral">&quot;Some allocations were not freed before destruction of this memory block!&quot;</span>);</div><div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>&#160;    </div><div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_Metadata.GetSize(), m_hMemory);</div><div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;}</div><div class="line"><a name="l06297"></a><span class="lineno"> 6297</span>&#160;</div><div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06300"></a><span class="lineno"> 6300</span>&#160;    <span class="keywordflow">if</span>((m_hMemory == VK_NULL_HANDLE) ||</div><div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>&#160;        (m_Metadata.GetSize() == 0))</div><div class="line"><a name="l06302"></a><span class="lineno"> 6302</span>&#160;    {</div><div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>&#160;    }</div><div class="line"><a name="l06305"></a><span class="lineno"> 6305</span>&#160;    </div><div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;    <span class="keywordflow">return</span> m_Metadata.Validate();</div><div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;}</div><div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;</div><div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>&#160;VkResult VmaDeviceMemoryBlock::Map(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l06310"></a><span class="lineno"> 6310</span>&#160;{</div><div class="line"><a name="l06311"></a><span class="lineno"> 6311</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l06312"></a><span class="lineno"> 6312</span>&#160;    {</div><div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06314"></a><span class="lineno"> 6314</span>&#160;    }</div><div class="line"><a name="l06315"></a><span class="lineno"> 6315</span>&#160;</div><div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l06318"></a><span class="lineno"> 6318</span>&#160;    {</div><div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>&#160;        m_MapCount += count;</div><div class="line"><a name="l06320"></a><span class="lineno"> 6320</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div><div class="line"><a name="l06321"></a><span class="lineno"> 6321</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;        {</div><div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;            *ppData = m_pMappedData;</div><div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160;        }</div><div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06326"></a><span class="lineno"> 6326</span>&#160;    }</div><div class="line"><a name="l06327"></a><span class="lineno"> 6327</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>&#160;    {</div><div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>&#160;            m_hMemory,</div><div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>&#160;            &amp;m_pMappedData);</div><div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;        {</div><div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l06339"></a><span class="lineno"> 6339</span>&#160;            {</div><div class="line"><a name="l06340"></a><span class="lineno"> 6340</span>&#160;                *ppData = m_pMappedData;</div><div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>&#160;            }</div><div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>&#160;            m_MapCount = count;</div><div class="line"><a name="l06343"></a><span class="lineno"> 6343</span>&#160;        }</div><div class="line"><a name="l06344"></a><span class="lineno"> 6344</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l06345"></a><span class="lineno"> 6345</span>&#160;    }</div><div class="line"><a name="l06346"></a><span class="lineno"> 6346</span>&#160;}</div><div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160;</div><div class="line"><a name="l06348"></a><span class="lineno"> 6348</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, uint32_t count)</div><div class="line"><a name="l06349"></a><span class="lineno"> 6349</span>&#160;{</div><div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160;    {</div><div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>&#160;    }</div><div class="line"><a name="l06354"></a><span class="lineno"> 6354</span>&#160;</div><div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</div><div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>&#160;    {</div><div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>&#160;        m_MapCount -= count;</div><div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;        {</div><div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;            m_pMappedData = VMA_NULL;</div><div class="line"><a name="l06362"></a><span class="lineno"> 6362</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</div><div class="line"><a name="l06363"></a><span class="lineno"> 6363</span>&#160;        }</div><div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;    }</div><div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;    {</div><div class="line"><a name="l06367"></a><span class="lineno"> 6367</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VkDeviceMemory block is being unmapped while it was not previously mapped.&quot;</span>);</div><div class="line"><a name="l06368"></a><span class="lineno"> 6368</span>&#160;    }</div><div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>&#160;}</div><div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>&#160;</div><div class="line"><a name="l06371"></a><span class="lineno"> 6371</span>&#160;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div><div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;    VkBuffer hBuffer)</div><div class="line"><a name="l06375"></a><span class="lineno"> 6375</span>&#160;{</div><div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div><div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>&#160;        hBuffer,</div><div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>&#160;        m_hMemory,</div><div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;}</div><div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;</div><div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div><div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;    VkImage hImage)</div><div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>&#160;{</div><div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;    <span class="comment">// This lock is important so that we don&#39;t call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.</span></div><div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>&#160;        hImage,</div><div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>&#160;        m_hMemory,</div><div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;}</div><div class="line"><a name="l06402"></a><span class="lineno"> 6402</span>&#160;</div><div class="line"><a name="l06403"></a><span class="lineno"> 6403</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> InitStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</div><div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>&#160;{</div><div class="line"><a name="l06405"></a><span class="lineno"> 6405</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div><div class="line"><a name="l06406"></a><span class="lineno"> 6406</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06407"></a><span class="lineno"> 6407</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;}</div><div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;</div><div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>&#160;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div><div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaAddStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo, <span class="keyword">const</span> <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; srcInfo)</div><div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;{</div><div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l06415"></a><span class="lineno"> 6415</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += srcInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MIN(inoutInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MAX(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, srcInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;}</div><div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;</div><div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaPostprocessCalcStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; inoutInfo)</div><div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;{</div><div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 0) ?</div><div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>) : 0;</div><div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;    inoutInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = (inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 0) ?</div><div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>&#160;        VmaRoundDiv&lt;VkDeviceSize&gt;(inoutInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>, inoutInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>) : 0;</div><div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;}</div><div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;</div><div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;VmaPool_T::VmaPool_T(</div><div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo) :</div><div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>&#160;    m_BlockVector(</div><div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;        hAllocator,</div><div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;        createInfo.memoryTypeIndex,</div><div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160;        createInfo.blockSize,</div><div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;        createInfo.minBlockCount,</div><div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;        createInfo.maxBlockCount,</div><div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;        (createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a>) != 0 ? 1 : hAllocator-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;        createInfo.frameInUseCount,</div><div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;        true) <span class="comment">// isCustomPool</span></div><div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;{</div><div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;}</div><div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;</div><div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160;VmaPool_T::~VmaPool_T()</div><div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;{</div><div class="line"><a name="l06449"></a><span class="lineno"> 6449</span>&#160;}</div><div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>&#160;</div><div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06452"></a><span class="lineno"> 6452</span>&#160;</div><div class="line"><a name="l06453"></a><span class="lineno"> 6453</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>&#160;</div><div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>&#160;VmaBlockVector::VmaBlockVector(</div><div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>&#160;    VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l06461"></a><span class="lineno"> 6461</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l06462"></a><span class="lineno"> 6462</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>&#160;    <span class="keywordtype">bool</span> isCustomPool) :</div><div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div><div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div><div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>&#160;    m_MinBlockCount(minBlockCount),</div><div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>&#160;    m_MaxBlockCount(maxBlockCount),</div><div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div><div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>&#160;    m_FrameInUseCount(frameInUseCount),</div><div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>&#160;    m_IsCustomPool(isCustomPool),</div><div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>&#160;    m_HasEmptyBlock(false),</div><div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>&#160;    m_pDefragmentator(VMA_NULL)</div><div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>&#160;{</div><div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;}</div><div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>&#160;</div><div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>&#160;VmaBlockVector::~VmaBlockVector()</div><div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>&#160;{</div><div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>&#160;    VMA_ASSERT(m_pDefragmentator == VMA_NULL);</div><div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>&#160;</div><div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;    {</div><div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l06485"></a><span class="lineno"> 6485</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l06486"></a><span class="lineno"> 6486</span>&#160;    }</div><div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>&#160;}</div><div class="line"><a name="l06488"></a><span class="lineno"> 6488</span>&#160;</div><div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div><div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;{</div><div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_MinBlockCount; ++i)</div><div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160;    {</div><div class="line"><a name="l06493"></a><span class="lineno"> 6493</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div><div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06495"></a><span class="lineno"> 6495</span>&#160;        {</div><div class="line"><a name="l06496"></a><span class="lineno"> 6496</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06497"></a><span class="lineno"> 6497</span>&#160;        }</div><div class="line"><a name="l06498"></a><span class="lineno"> 6498</span>&#160;    }</div><div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;}</div><div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>&#160;</div><div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats)</div><div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;{</div><div class="line"><a name="l06504"></a><span class="lineno"> 6504</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div><div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div><div class="line"><a name="l06506"></a><span class="lineno"> 6506</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div><div class="line"><a name="l06507"></a><span class="lineno"> 6507</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div><div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l06509"></a><span class="lineno"> 6509</span>&#160;</div><div class="line"><a name="l06510"></a><span class="lineno"> 6510</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06511"></a><span class="lineno"> 6511</span>&#160;</div><div class="line"><a name="l06512"></a><span class="lineno"> 6512</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>&#160;    {</div><div class="line"><a name="l06514"></a><span class="lineno"> 6514</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;        pBlock-&gt;m_Metadata.AddPoolStats(*pStats);</div><div class="line"><a name="l06518"></a><span class="lineno"> 6518</span>&#160;    }</div><div class="line"><a name="l06519"></a><span class="lineno"> 6519</span>&#160;}</div><div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;</div><div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_ALLOCATION_TRY_COUNT = 32;</div><div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>&#160;</div><div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>&#160;VkResult VmaBlockVector::Allocate(</div><div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l06529"></a><span class="lineno"> 6529</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l06530"></a><span class="lineno"> 6530</span>&#160;{</div><div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div><div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0;</div><div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160;</div><div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;</div><div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>&#160;    <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div><div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>&#160;    <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div><div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div><div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;    {</div><div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;        VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;        VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;        <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>&#160;            currentFrameIndex,</div><div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>&#160;            m_FrameInUseCount,</div><div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;            m_BufferImageGranularity,</div><div class="line"><a name="l06547"></a><span class="lineno"> 6547</span>&#160;            vkMemReq.size,</div><div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>&#160;            vkMemReq.alignment,</div><div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>&#160;            suballocType,</div><div class="line"><a name="l06550"></a><span class="lineno"> 6550</span>&#160;            <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l06551"></a><span class="lineno"> 6551</span>&#160;            &amp;currRequest))</div><div class="line"><a name="l06552"></a><span class="lineno"> 6552</span>&#160;        {</div><div class="line"><a name="l06553"></a><span class="lineno"> 6553</span>&#160;            <span class="comment">// Allocate from pCurrBlock.</span></div><div class="line"><a name="l06554"></a><span class="lineno"> 6554</span>&#160;            VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l06555"></a><span class="lineno"> 6555</span>&#160;</div><div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;            <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l06557"></a><span class="lineno"> 6557</span>&#160;            {</div><div class="line"><a name="l06558"></a><span class="lineno"> 6558</span>&#160;                VkResult res = pCurrBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l06559"></a><span class="lineno"> 6559</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06560"></a><span class="lineno"> 6560</span>&#160;                {</div><div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>&#160;                }</div><div class="line"><a name="l06563"></a><span class="lineno"> 6563</span>&#160;            }</div><div class="line"><a name="l06564"></a><span class="lineno"> 6564</span>&#160;            </div><div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>&#160;            <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l06566"></a><span class="lineno"> 6566</span>&#160;            <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l06567"></a><span class="lineno"> 6567</span>&#160;            {</div><div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;            }</div><div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;            </div><div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;            *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>&#160;            pCurrBlock-&gt;m_Metadata.Alloc(currRequest, suballocType, vkMemReq.size, *pAllocation);</div><div class="line"><a name="l06573"></a><span class="lineno"> 6573</span>&#160;            (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l06574"></a><span class="lineno"> 6574</span>&#160;                hCurrentPool,</div><div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;                pCurrBlock,</div><div class="line"><a name="l06576"></a><span class="lineno"> 6576</span>&#160;                currRequest.offset,</div><div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>&#160;                suballocType,</div><div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;                mapped,</div><div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>&#160;                (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>&#160;            VMA_HEAVY_ASSERT(pCurrBlock-&gt;Validate());</div><div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing allocation #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;            (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06586"></a><span class="lineno"> 6586</span>&#160;        }</div><div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>&#160;    }</div><div class="line"><a name="l06588"></a><span class="lineno"> 6588</span>&#160;</div><div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div><div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0) &amp;&amp;</div><div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount);</div><div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160;</div><div class="line"><a name="l06593"></a><span class="lineno"> 6593</span>&#160;    <span class="comment">// 2. Try to create new block.</span></div><div class="line"><a name="l06594"></a><span class="lineno"> 6594</span>&#160;    <span class="keywordflow">if</span>(canCreateNewBlock)</div><div class="line"><a name="l06595"></a><span class="lineno"> 6595</span>&#160;    {</div><div class="line"><a name="l06596"></a><span class="lineno"> 6596</span>&#160;        <span class="comment">// Calculate optimal size for new block.</span></div><div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;        VkDeviceSize newBlockSize = m_PreferredBlockSize;</div><div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>&#160;        uint32_t newBlockSizeShift = 0;</div><div class="line"><a name="l06599"></a><span class="lineno"> 6599</span>&#160;        <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div><div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>&#160;</div><div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>&#160;        <span class="comment">// Allocating blocks of other sizes is allowed only in default pools.</span></div><div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;        <span class="comment">// In custom pools block size is fixed.</span></div><div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;        <span class="keywordflow">if</span>(m_IsCustomPool == <span class="keyword">false</span>)</div><div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;        {</div><div class="line"><a name="l06605"></a><span class="lineno"> 6605</span>&#160;            <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div><div class="line"><a name="l06606"></a><span class="lineno"> 6606</span>&#160;            <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div><div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;            <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; NEW_BLOCK_SIZE_SHIFT_MAX; ++i)</div><div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160;            {</div><div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;                <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;                <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= vkMemReq.size * 2)</div><div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>&#160;                {</div><div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>&#160;                    newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l06613"></a><span class="lineno"> 6613</span>&#160;                    ++newBlockSizeShift;</div><div class="line"><a name="l06614"></a><span class="lineno"> 6614</span>&#160;                }</div><div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06616"></a><span class="lineno"> 6616</span>&#160;                {</div><div class="line"><a name="l06617"></a><span class="lineno"> 6617</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>&#160;                }</div><div class="line"><a name="l06619"></a><span class="lineno"> 6619</span>&#160;            }</div><div class="line"><a name="l06620"></a><span class="lineno"> 6620</span>&#160;        }</div><div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>&#160;</div><div class="line"><a name="l06622"></a><span class="lineno"> 6622</span>&#160;        <span class="keywordtype">size_t</span> newBlockIndex = 0;</div><div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>&#160;        VkResult res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>&#160;        <span class="comment">// Allocation of this size failed? Try 1/2, 1/4, 1/8 of m_PreferredBlockSize.</span></div><div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;        <span class="keywordflow">if</span>(m_IsCustomPool == <span class="keyword">false</span>)</div><div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;        {</div><div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;            <span class="keywordflow">while</span>(res &lt; 0 &amp;&amp; newBlockSizeShift &lt; NEW_BLOCK_SIZE_SHIFT_MAX)</div><div class="line"><a name="l06628"></a><span class="lineno"> 6628</span>&#160;            {</div><div class="line"><a name="l06629"></a><span class="lineno"> 6629</span>&#160;                <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;                <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= vkMemReq.size)</div><div class="line"><a name="l06631"></a><span class="lineno"> 6631</span>&#160;                {</div><div class="line"><a name="l06632"></a><span class="lineno"> 6632</span>&#160;                    newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;                    ++newBlockSizeShift;</div><div class="line"><a name="l06634"></a><span class="lineno"> 6634</span>&#160;                    res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l06635"></a><span class="lineno"> 6635</span>&#160;                }</div><div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>&#160;                {</div><div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>&#160;                }</div><div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>&#160;            }</div><div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;        }</div><div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;</div><div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;        {</div><div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div><div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;            VMA_ASSERT(pBlock-&gt;m_Metadata.GetSize() &gt;= vkMemReq.size);</div><div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;</div><div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;            <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>&#160;            {</div><div class="line"><a name="l06650"></a><span class="lineno"> 6650</span>&#160;                res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l06651"></a><span class="lineno"> 6651</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06652"></a><span class="lineno"> 6652</span>&#160;                {</div><div class="line"><a name="l06653"></a><span class="lineno"> 6653</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>&#160;                }</div><div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>&#160;            }</div><div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>&#160;</div><div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>&#160;            <span class="comment">// Allocate from pBlock. Because it is empty, dstAllocRequest can be trivially filled.</span></div><div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;            VmaAllocationRequest allocRequest;</div><div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;            pBlock-&gt;m_Metadata.CreateFirstAllocationRequest(&amp;allocRequest);</div><div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;            *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;            pBlock-&gt;m_Metadata.Alloc(allocRequest, suballocType, vkMemReq.size, *pAllocation);</div><div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>&#160;            (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;                hCurrentPool,</div><div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;                pBlock,</div><div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;                allocRequest.offset,</div><div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;                suballocType,</div><div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>&#160;                mapped,</div><div class="line"><a name="l06670"></a><span class="lineno"> 6670</span>&#160;                (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;            VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l06672"></a><span class="lineno"> 6672</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new allocation Size=%llu&quot;</span>, allocInfo.allocationSize);</div><div class="line"><a name="l06673"></a><span class="lineno"> 6673</span>&#160;            (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l06674"></a><span class="lineno"> 6674</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;        }</div><div class="line"><a name="l06676"></a><span class="lineno"> 6676</span>&#160;    }</div><div class="line"><a name="l06677"></a><span class="lineno"> 6677</span>&#160;</div><div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canMakeOtherLost = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>) != 0;</div><div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>&#160;</div><div class="line"><a name="l06680"></a><span class="lineno"> 6680</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div><div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l06682"></a><span class="lineno"> 6682</span>&#160;    {</div><div class="line"><a name="l06683"></a><span class="lineno"> 6683</span>&#160;        uint32_t tryIndex = 0;</div><div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div><div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>&#160;        {</div><div class="line"><a name="l06686"></a><span class="lineno"> 6686</span>&#160;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div><div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;            VmaAllocationRequest bestRequest = {};</div><div class="line"><a name="l06688"></a><span class="lineno"> 6688</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div><div class="line"><a name="l06689"></a><span class="lineno"> 6689</span>&#160;</div><div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;            <span class="comment">// 1. Search existing allocations.</span></div><div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;            <span class="comment">// Forward order in m_Blocks - prefer blocks with smallest amount of free space.</span></div><div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex )</div><div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>&#160;            {</div><div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;                VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l06696"></a><span class="lineno"> 6696</span>&#160;                VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;                <span class="keywordflow">if</span>(pCurrBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;                    m_BufferImageGranularity,</div><div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;                    vkMemReq.size,</div><div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;                    vkMemReq.alignment,</div><div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;                    suballocType,</div><div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;                    &amp;currRequest))</div><div class="line"><a name="l06706"></a><span class="lineno"> 6706</span>&#160;                {</div><div class="line"><a name="l06707"></a><span class="lineno"> 6707</span>&#160;                    <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;                        currRequestCost &lt; bestRequestCost)</div><div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;                    {</div><div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;                        pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;                        bestRequest = currRequest;</div><div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;                        bestRequestCost = currRequestCost;</div><div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;</div><div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160;                        <span class="keywordflow">if</span>(bestRequestCost == 0)</div><div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160;                        {</div><div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;                        }</div><div class="line"><a name="l06719"></a><span class="lineno"> 6719</span>&#160;                    }</div><div class="line"><a name="l06720"></a><span class="lineno"> 6720</span>&#160;                }</div><div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;            }</div><div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;</div><div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div><div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;            {</div><div class="line"><a name="l06725"></a><span class="lineno"> 6725</span>&#160;                <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l06726"></a><span class="lineno"> 6726</span>&#160;                {</div><div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;                    {</div><div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160;                        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;                    }</div><div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>&#160;                }</div><div class="line"><a name="l06733"></a><span class="lineno"> 6733</span>&#160;</div><div class="line"><a name="l06734"></a><span class="lineno"> 6734</span>&#160;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_Metadata.MakeRequestedAllocationsLost(</div><div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;                    &amp;bestRequest))</div><div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;                {</div><div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160;                    <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>&#160;                    {</div><div class="line"><a name="l06742"></a><span class="lineno"> 6742</span>&#160;                        m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l06743"></a><span class="lineno"> 6743</span>&#160;                    }</div><div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div><div class="line"><a name="l06745"></a><span class="lineno"> 6745</span>&#160;                    *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l06746"></a><span class="lineno"> 6746</span>&#160;                    pBestRequestBlock-&gt;m_Metadata.Alloc(bestRequest, suballocType, vkMemReq.size, *pAllocation);</div><div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;                        pBestRequestBlock,</div><div class="line"><a name="l06750"></a><span class="lineno"> 6750</span>&#160;                        bestRequest.offset,</div><div class="line"><a name="l06751"></a><span class="lineno"> 6751</span>&#160;                        vkMemReq.alignment,</div><div class="line"><a name="l06752"></a><span class="lineno"> 6752</span>&#160;                        vkMemReq.size,</div><div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>&#160;                        suballocType,</div><div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>&#160;                        mapped,</div><div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;                        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0);</div><div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div><div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing allocation #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>&#160;                    (*pAllocation)-&gt;SetUserData(m_hAllocator, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06760"></a><span class="lineno"> 6760</span>&#160;                }</div><div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>&#160;                <span class="comment">// else: Some allocations must have been touched while we are here. Next try.</span></div><div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>&#160;            }</div><div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;            {</div><div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div><div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160;            }</div><div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;        }</div><div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div><div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div><div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div><div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div><div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>&#160;        {</div><div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div><div class="line"><a name="l06775"></a><span class="lineno"> 6775</span>&#160;        }</div><div class="line"><a name="l06776"></a><span class="lineno"> 6776</span>&#160;    }</div><div class="line"><a name="l06777"></a><span class="lineno"> 6777</span>&#160;</div><div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>&#160;}</div><div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;</div><div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Free(</div><div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;{</div><div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div><div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;</div><div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;    <span class="comment">// Scope for lock.</span></div><div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160;    {</div><div class="line"><a name="l06788"></a><span class="lineno"> 6788</span>&#160;        VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06789"></a><span class="lineno"> 6789</span>&#160;</div><div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;</div><div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</div><div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;        {</div><div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div><div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;        }</div><div class="line"><a name="l06796"></a><span class="lineno"> 6796</span>&#160;</div><div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>&#160;        pBlock-&gt;m_Metadata.Free(hAllocation);</div><div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l06799"></a><span class="lineno"> 6799</span>&#160;</div><div class="line"><a name="l06800"></a><span class="lineno"> 6800</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;</div><div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div><div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>&#160;        {</div><div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>&#160;            <span class="comment">// Already has empty Allocation. We don&#39;t want to have two, so delete this one.</span></div><div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;            <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160;            {</div><div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>&#160;                pBlockToDelete = pBlock;</div><div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;                Remove(pBlock);</div><div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;            }</div><div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;            <span class="comment">// We now have first empty Allocation.</span></div><div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>&#160;            {</div><div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;            }</div><div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;        }</div><div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>&#160;        <span class="comment">// pBlock didn&#39;t become empty, but we have another empty block - find and free that one.</span></div><div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div><div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock)</div><div class="line"><a name="l06820"></a><span class="lineno"> 6820</span>&#160;        {</div><div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>&#160;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div><div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;            <span class="keywordflow">if</span>(pLastBlock-&gt;m_Metadata.IsEmpty() &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;            {</div><div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>&#160;                pBlockToDelete = pLastBlock;</div><div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>&#160;                m_Blocks.pop_back();</div><div class="line"><a name="l06826"></a><span class="lineno"> 6826</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l06827"></a><span class="lineno"> 6827</span>&#160;            }</div><div class="line"><a name="l06828"></a><span class="lineno"> 6828</span>&#160;        }</div><div class="line"><a name="l06829"></a><span class="lineno"> 6829</span>&#160;</div><div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>&#160;        IncrementallySortBlocks();</div><div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>&#160;    }</div><div class="line"><a name="l06832"></a><span class="lineno"> 6832</span>&#160;</div><div class="line"><a name="l06833"></a><span class="lineno"> 6833</span>&#160;    <span class="comment">// Destruction of a free Allocation. Deferred until this point, outside of mutex</span></div><div class="line"><a name="l06834"></a><span class="lineno"> 6834</span>&#160;    <span class="comment">// lock, for performance reason.</span></div><div class="line"><a name="l06835"></a><span class="lineno"> 6835</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div><div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>&#160;    {</div><div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty allocation&quot;</span>);</div><div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div><div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>&#160;    }</div><div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>&#160;}</div><div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;</div><div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;<span class="keywordtype">size_t</span> VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div><div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;    <span class="keywordtype">size_t</span> result = 0;</div><div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>&#160;    {</div><div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160;        result = VMA_MAX((uint64_t)result, (uint64_t)m_Blocks[i]-&gt;m_Metadata.GetSize());</div><div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</div><div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;        {</div><div class="line"><a name="l06851"></a><span class="lineno"> 6851</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>&#160;        }</div><div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;    }</div><div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160;}</div><div class="line"><a name="l06856"></a><span class="lineno"> 6856</span>&#160;</div><div class="line"><a name="l06857"></a><span class="lineno"> 6857</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div><div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;{</div><div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160;    {</div><div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div><div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;        {</div><div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>&#160;        }</div><div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>&#160;    }</div><div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>&#160;    VMA_ASSERT(0);</div><div class="line"><a name="l06868"></a><span class="lineno"> 6868</span>&#160;}</div><div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>&#160;</div><div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div><div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;{</div><div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;    <span class="comment">// Bubble sort only until first swap.</span></div><div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 1; i &lt; m_Blocks.size(); ++i)</div><div class="line"><a name="l06874"></a><span class="lineno"> 6874</span>&#160;    {</div><div class="line"><a name="l06875"></a><span class="lineno"> 6875</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[i - 1]-&gt;m_Metadata.GetSumFreeSize() &gt; m_Blocks[i]-&gt;m_Metadata.GetSumFreeSize())</div><div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;        {</div><div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>&#160;            VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div><div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;        }</div><div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;    }</div><div class="line"><a name="l06881"></a><span class="lineno"> 6881</span>&#160;}</div><div class="line"><a name="l06882"></a><span class="lineno"> 6882</span>&#160;</div><div class="line"><a name="l06883"></a><span class="lineno"> 6883</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div><div class="line"><a name="l06884"></a><span class="lineno"> 6884</span>&#160;{</div><div class="line"><a name="l06885"></a><span class="lineno"> 6885</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l06886"></a><span class="lineno"> 6886</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>&#160;    allocInfo.allocationSize = blockSize;</div><div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div><div class="line"><a name="l06889"></a><span class="lineno"> 6889</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div><div class="line"><a name="l06890"></a><span class="lineno"> 6890</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;    {</div><div class="line"><a name="l06892"></a><span class="lineno"> 6892</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>&#160;    }</div><div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;</div><div class="line"><a name="l06895"></a><span class="lineno"> 6895</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div><div class="line"><a name="l06896"></a><span class="lineno"> 6896</span>&#160;</div><div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div><div class="line"><a name="l06898"></a><span class="lineno"> 6898</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div><div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>&#160;    pBlock-&gt;Init(</div><div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;        m_MemoryTypeIndex,</div><div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;        mem,</div><div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;        allocInfo.allocationSize);</div><div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>&#160;</div><div class="line"><a name="l06904"></a><span class="lineno"> 6904</span>&#160;    m_Blocks.push_back(pBlock);</div><div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div><div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160;    {</div><div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;        *pNewBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;    }</div><div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;</div><div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>&#160;}</div><div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>&#160;</div><div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06914"></a><span class="lineno"> 6914</span>&#160;</div><div class="line"><a name="l06915"></a><span class="lineno"> 6915</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div><div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;{</div><div class="line"><a name="l06917"></a><span class="lineno"> 6917</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06918"></a><span class="lineno"> 6918</span>&#160;</div><div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;    json.BeginObject();</div><div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>&#160;</div><div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>&#160;    <span class="keywordflow">if</span>(m_IsCustomPool)</div><div class="line"><a name="l06922"></a><span class="lineno"> 6922</span>&#160;    {</div><div class="line"><a name="l06923"></a><span class="lineno"> 6923</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div><div class="line"><a name="l06924"></a><span class="lineno"> 6924</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</div><div class="line"><a name="l06925"></a><span class="lineno"> 6925</span>&#160;</div><div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div><div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;</div><div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div><div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div><div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;        {</div><div class="line"><a name="l06933"></a><span class="lineno"> 6933</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div><div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;        }</div><div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div><div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;        {</div><div class="line"><a name="l06938"></a><span class="lineno"> 6938</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div><div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>&#160;        }</div><div class="line"><a name="l06941"></a><span class="lineno"> 6941</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div><div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div><div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;        json.EndObject();</div><div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;</div><div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</div><div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;        {</div><div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div><div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div><div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160;        }</div><div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160;    }</div><div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;    {</div><div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>&#160;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div><div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l06955"></a><span class="lineno"> 6955</span>&#160;    }</div><div class="line"><a name="l06956"></a><span class="lineno"> 6956</span>&#160;</div><div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;    json.BeginArray();</div><div class="line"><a name="l06959"></a><span class="lineno"> 6959</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_Blocks.size(); ++i)</div><div class="line"><a name="l06960"></a><span class="lineno"> 6960</span>&#160;    {</div><div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;        m_Blocks[i]-&gt;m_Metadata.PrintDetailedMap(json);</div><div class="line"><a name="l06962"></a><span class="lineno"> 6962</span>&#160;    }</div><div class="line"><a name="l06963"></a><span class="lineno"> 6963</span>&#160;    json.EndArray();</div><div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160;</div><div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;    json.EndObject();</div><div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;}</div><div class="line"><a name="l06967"></a><span class="lineno"> 6967</span>&#160;</div><div class="line"><a name="l06968"></a><span class="lineno"> 6968</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>&#160;</div><div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;VmaDefragmentator* VmaBlockVector::EnsureDefragmentator(</div><div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160;    uint32_t currentFrameIndex)</div><div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;{</div><div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>&#160;    {</div><div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>&#160;        m_pDefragmentator = vma_new(m_hAllocator, VmaDefragmentator)(</div><div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>&#160;            hAllocator,</div><div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;            currentFrameIndex);</div><div class="line"><a name="l06980"></a><span class="lineno"> 6980</span>&#160;    }</div><div class="line"><a name="l06981"></a><span class="lineno"> 6981</span>&#160;</div><div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>&#160;    <span class="keywordflow">return</span> m_pDefragmentator;</div><div class="line"><a name="l06983"></a><span class="lineno"> 6983</span>&#160;}</div><div class="line"><a name="l06984"></a><span class="lineno"> 6984</span>&#160;</div><div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>&#160;VkResult VmaBlockVector::Defragment(</div><div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l06987"></a><span class="lineno"> 6987</span>&#160;    VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160;    uint32_t&amp; maxAllocationsToMove)</div><div class="line"><a name="l06989"></a><span class="lineno"> 6989</span>&#160;{</div><div class="line"><a name="l06990"></a><span class="lineno"> 6990</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;    {</div><div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>&#160;    }</div><div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>&#160;</div><div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>&#160;</div><div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>&#160;    <span class="comment">// Defragment.</span></div><div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>&#160;    VkResult result = m_pDefragmentator-&gt;Defragment(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l06999"></a><span class="lineno"> 6999</span>&#160;</div><div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>&#160;    <span class="comment">// Accumulate statistics.</span></div><div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;    {</div><div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;        <span class="keyword">const</span> VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> = m_pDefragmentator-&gt;GetBytesMoved();</div><div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;        <span class="keyword">const</span> uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> = m_pDefragmentator-&gt;GetAllocationsMoved();</div><div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;        VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div><div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>&#160;        VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div><div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160;        maxBytesToMove -= <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160;        maxAllocationsToMove -= <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160;    }</div><div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;    </div><div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;    <span class="comment">// Free empty blocks.</span></div><div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>&#160;    {</div><div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_Metadata.IsEmpty())</div><div class="line"><a name="l07019"></a><span class="lineno"> 7019</span>&#160;        {</div><div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;            {</div><div class="line"><a name="l07022"></a><span class="lineno"> 7022</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l07023"></a><span class="lineno"> 7023</span>&#160;                {</div><div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;                    pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock-&gt;m_Metadata.GetSize();</div><div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;                }</div><div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>&#160;</div><div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160;                vma_delete(m_hAllocator, pBlock);</div><div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;            }</div><div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;            {</div><div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;            }</div><div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;        }</div><div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>&#160;    }</div><div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>&#160;</div><div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;}</div><div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;</div><div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DestroyDefragmentator()</div><div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>&#160;{</div><div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator != VMA_NULL)</div><div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;    {</div><div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;        vma_delete(m_hAllocator, m_pDefragmentator);</div><div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;        m_pDefragmentator = VMA_NULL;</div><div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160;    }</div><div class="line"><a name="l07049"></a><span class="lineno"> 7049</span>&#160;}</div><div class="line"><a name="l07050"></a><span class="lineno"> 7050</span>&#160;</div><div class="line"><a name="l07051"></a><span class="lineno"> 7051</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div><div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>&#160;{</div><div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div><div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160;    {</div><div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>&#160;        lostAllocationCount += pBlock-&gt;m_Metadata.MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div><div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;    }</div><div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div><div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;    {</div><div class="line"><a name="l07065"></a><span class="lineno"> 7065</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div><div class="line"><a name="l07066"></a><span class="lineno"> 7066</span>&#160;    }</div><div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;}</div><div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;</div><div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::AddStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;{</div><div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;</div><div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;</div><div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;    {</div><div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;        pBlock-&gt;m_Metadata.CalcAllocationStatInfo(allocationStatInfo);</div><div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l07084"></a><span class="lineno"> 7084</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l07085"></a><span class="lineno"> 7085</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>&#160;    }</div><div class="line"><a name="l07087"></a><span class="lineno"> 7087</span>&#160;}</div><div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>&#160;</div><div class="line"><a name="l07090"></a><span class="lineno"> 7090</span>&#160;<span class="comment">// VmaDefragmentator members definition</span></div><div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;</div><div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>&#160;VmaDefragmentator::VmaDefragmentator(</div><div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>&#160;    uint32_t currentFrameIndex) :</div><div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;    m_pBlockVector(pBlockVector),</div><div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>&#160;    m_CurrentFrameIndex(currentFrameIndex),</div><div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>&#160;    m_BytesMoved(0),</div><div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;    m_AllocationsMoved(0),</div><div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocationInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l07103"></a><span class="lineno"> 7103</span>&#160;{</div><div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>&#160;}</div><div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;</div><div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;VmaDefragmentator::~VmaDefragmentator()</div><div class="line"><a name="l07107"></a><span class="lineno"> 7107</span>&#160;{</div><div class="line"><a name="l07108"></a><span class="lineno"> 7108</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l07109"></a><span class="lineno"> 7109</span>&#160;    {</div><div class="line"><a name="l07110"></a><span class="lineno"> 7110</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>&#160;    }</div><div class="line"><a name="l07112"></a><span class="lineno"> 7112</span>&#160;}</div><div class="line"><a name="l07113"></a><span class="lineno"> 7113</span>&#160;</div><div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>&#160;<span class="keywordtype">void</span> VmaDefragmentator::AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged)</div><div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160;{</div><div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;    AllocationInfo allocInfo;</div><div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>&#160;    allocInfo.m_hAllocation = hAlloc;</div><div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>&#160;    allocInfo.m_pChanged = pChanged;</div><div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;    m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;}</div><div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;</div><div class="line"><a name="l07122"></a><span class="lineno"> 7122</span>&#160;VkResult VmaDefragmentator::BlockInfo::EnsureMapping(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, <span class="keywordtype">void</span>** ppMappedData)</div><div class="line"><a name="l07123"></a><span class="lineno"> 7123</span>&#160;{</div><div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>&#160;    <span class="comment">// It has already been mapped for defragmentation.</span></div><div class="line"><a name="l07125"></a><span class="lineno"> 7125</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation)</div><div class="line"><a name="l07126"></a><span class="lineno"> 7126</span>&#160;    {</div><div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>&#160;        *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160;    }</div><div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160;            </div><div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;    <span class="comment">// It is originally mapped.</span></div><div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;    <span class="keywordflow">if</span>(m_pBlock-&gt;GetMappedData())</div><div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>&#160;    {</div><div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>&#160;        *ppMappedData = m_pBlock-&gt;GetMappedData();</div><div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;    }</div><div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160;            </div><div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;    <span class="comment">// Map on first usage.</span></div><div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160;    VkResult res = m_pBlock-&gt;Map(hAllocator, 1, &amp;m_pMappedDataForDefragmentation);</div><div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;    *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;}</div><div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;</div><div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>&#160;<span class="keywordtype">void</span> VmaDefragmentator::BlockInfo::Unmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l07145"></a><span class="lineno"> 7145</span>&#160;{</div><div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation != VMA_NULL)</div><div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>&#160;    {</div><div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>&#160;        m_pBlock-&gt;Unmap(hAllocator, 1);</div><div class="line"><a name="l07149"></a><span class="lineno"> 7149</span>&#160;    }</div><div class="line"><a name="l07150"></a><span class="lineno"> 7150</span>&#160;}</div><div class="line"><a name="l07151"></a><span class="lineno"> 7151</span>&#160;</div><div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>&#160;VkResult VmaDefragmentator::DefragmentRound(</div><div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>&#160;{</div><div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div><div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;    {</div><div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>&#160;    }</div><div class="line"><a name="l07160"></a><span class="lineno"> 7160</span>&#160;</div><div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;    {</div><div class="line"><a name="l07165"></a><span class="lineno"> 7165</span>&#160;        <span class="comment">// 1. Find next allocation to move.</span></div><div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;        <span class="comment">// 1.1. Start from last to first m_Blocks - they are sorted from most &quot;destination&quot; to most &quot;source&quot;.</span></div><div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;        <span class="comment">// 1.2. Then start from last to first m_Allocations - they are sorted from largest to smallest.</span></div><div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</div><div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160;        {</div><div class="line"><a name="l07170"></a><span class="lineno"> 7170</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div><div class="line"><a name="l07171"></a><span class="lineno"> 7171</span>&#160;            {</div><div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div><div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == 0)</div><div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;                {</div><div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160;                }</div><div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;                {</div><div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;                    --srcBlockIndex;</div><div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160;                    srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;                }</div><div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>&#160;            }</div><div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;            {</div><div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</div><div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;            }</div><div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;        }</div><div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;        </div><div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div><div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div><div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>&#160;</div><div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div><div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div><div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div><div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;</div><div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;        <span class="comment">// 2. Try to find new place for this allocation in preceding or current block.</span></div><div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstBlockIndex = 0; dstBlockIndex &lt;= srcBlockIndex; ++dstBlockIndex)</div><div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>&#160;        {</div><div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div><div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;            VmaAllocationRequest dstAllocRequest;</div><div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_Metadata.CreateAllocationRequest(</div><div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>&#160;                m_CurrentFrameIndex,</div><div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div><div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>&#160;                size,</div><div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160;                alignment,</div><div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;                suballocType,</div><div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div><div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;            MoveMakesSense(</div><div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div><div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;            {</div><div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>&#160;</div><div class="line"><a name="l07216"></a><span class="lineno"> 7216</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div><div class="line"><a name="l07217"></a><span class="lineno"> 7217</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div><div class="line"><a name="l07218"></a><span class="lineno"> 7218</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</div><div class="line"><a name="l07219"></a><span class="lineno"> 7219</span>&#160;                {</div><div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>&#160;                    <span class="keywordflow">return</span> VK_INCOMPLETE;</div><div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160;                }</div><div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>&#160;</div><div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>&#160;                <span class="keywordtype">void</span>* pDstMappedData = VMA_NULL;</div><div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;                VkResult res = pDstBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pDstMappedData);</div><div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;                {</div><div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07228"></a><span class="lineno"> 7228</span>&#160;                }</div><div class="line"><a name="l07229"></a><span class="lineno"> 7229</span>&#160;</div><div class="line"><a name="l07230"></a><span class="lineno"> 7230</span>&#160;                <span class="keywordtype">void</span>* pSrcMappedData = VMA_NULL;</div><div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;                res = pSrcBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pSrcMappedData);</div><div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l07233"></a><span class="lineno"> 7233</span>&#160;                {</div><div class="line"><a name="l07234"></a><span class="lineno"> 7234</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>&#160;                }</div><div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>&#160;                </div><div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>&#160;                <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div><div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>&#160;                memcpy(</div><div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>&#160;                    reinterpret_cast&lt;char*&gt;(pDstMappedData) + dstAllocRequest.offset,</div><div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>&#160;                    reinterpret_cast&lt;char*&gt;(pSrcMappedData) + srcOffset,</div><div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>&#160;                    static_cast&lt;size_t&gt;(size));</div><div class="line"><a name="l07242"></a><span class="lineno"> 7242</span>&#160;                </div><div class="line"><a name="l07243"></a><span class="lineno"> 7243</span>&#160;                pDstBlockInfo-&gt;m_pBlock-&gt;m_Metadata.Alloc(dstAllocRequest, suballocType, size, allocInfo.m_hAllocation);</div><div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;                pSrcBlockInfo-&gt;m_pBlock-&gt;m_Metadata.FreeAtOffset(srcOffset);</div><div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;                </div><div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160;                allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div><div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160;</div><div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div><div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;                {</div><div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</div><div class="line"><a name="l07251"></a><span class="lineno"> 7251</span>&#160;                }</div><div class="line"><a name="l07252"></a><span class="lineno"> 7252</span>&#160;</div><div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;                ++m_AllocationsMoved;</div><div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;                m_BytesMoved += size;</div><div class="line"><a name="l07255"></a><span class="lineno"> 7255</span>&#160;</div><div class="line"><a name="l07256"></a><span class="lineno"> 7256</span>&#160;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div><div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160;</div><div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;            }</div><div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;        }</div><div class="line"><a name="l07261"></a><span class="lineno"> 7261</span>&#160;</div><div class="line"><a name="l07262"></a><span class="lineno"> 7262</span>&#160;        <span class="comment">// If not processed, this allocInfo remains in pBlockInfo-&gt;m_Allocations for next round.</span></div><div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>&#160;</div><div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div><div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;        {</div><div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>&#160;            --srcAllocIndex;</div><div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;        }</div><div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;        {</div><div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div><div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;            {</div><div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>&#160;                --srcBlockIndex;</div><div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>&#160;                srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l07274"></a><span class="lineno"> 7274</span>&#160;            }</div><div class="line"><a name="l07275"></a><span class="lineno"> 7275</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>&#160;            {</div><div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;            }</div><div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;        }</div><div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;    }</div><div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;}</div><div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>&#160;</div><div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>&#160;VkResult VmaDefragmentator::Defragment(</div><div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>&#160;{</div><div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>&#160;    <span class="keywordflow">if</span>(m_Allocations.empty())</div><div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;    {</div><div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>&#160;    }</div><div class="line"><a name="l07291"></a><span class="lineno"> 7291</span>&#160;</div><div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>&#160;    <span class="comment">// Create block info for each block.</span></div><div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_pBlockVector-&gt;m_Blocks.size();</div><div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;    {</div><div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div><div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;        m_Blocks.push_back(pBlockInfo);</div><div class="line"><a name="l07299"></a><span class="lineno"> 7299</span>&#160;    }</div><div class="line"><a name="l07300"></a><span class="lineno"> 7300</span>&#160;</div><div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div><div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div><div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;</div><div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;    <span class="comment">// Move allocation infos from m_Allocations to appropriate m_Blocks[memTypeIndex].m_Allocations.</span></div><div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0, allocCount = m_Allocations.size(); blockIndex &lt; allocCount; ++blockIndex)</div><div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;    {</div><div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;        AllocationInfo&amp; allocInfo = m_Allocations[blockIndex];</div><div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;        <span class="comment">// Now as we are inside VmaBlockVector::m_Mutex, we can make final check if this allocation was not lost.</span></div><div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;        <span class="keywordflow">if</span>(allocInfo.m_hAllocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;        {</div><div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>&#160;            VmaDeviceMemoryBlock* pBlock = allocInfo.m_hAllocation-&gt;GetBlock();</div><div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>&#160;            BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div><div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;            <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div><div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;            {</div><div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>&#160;                (*it)-&gt;m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>&#160;            }</div><div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160;            {</div><div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>&#160;                VMA_ASSERT(0);</div><div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>&#160;            }</div><div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>&#160;        }</div><div class="line"><a name="l07322"></a><span class="lineno"> 7322</span>&#160;    }</div><div class="line"><a name="l07323"></a><span class="lineno"> 7323</span>&#160;    m_Allocations.clear();</div><div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160;</div><div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l07326"></a><span class="lineno"> 7326</span>&#160;    {</div><div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div><div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div><div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>&#160;        pBlockInfo-&gt;SortAllocationsBySizeDescecnding();</div><div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>&#160;    }</div><div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160;</div><div class="line"><a name="l07332"></a><span class="lineno"> 7332</span>&#160;    <span class="comment">// Sort m_Blocks this time by the main criterium, from most &quot;destination&quot; to most &quot;source&quot; blocks.</span></div><div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div><div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>&#160;</div><div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div><div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> round = 0; (round &lt; 2) &amp;&amp; (result == VK_SUCCESS); ++round)</div><div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;    {</div><div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;        result = DefragmentRound(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>&#160;    }</div><div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>&#160;</div><div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160;    <span class="comment">// Unmap blocks that were mapped for defragmentation.</span></div><div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l07344"></a><span class="lineno"> 7344</span>&#160;    {</div><div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>&#160;        m_Blocks[blockIndex]-&gt;Unmap(m_hAllocator);</div><div class="line"><a name="l07346"></a><span class="lineno"> 7346</span>&#160;    }</div><div class="line"><a name="l07347"></a><span class="lineno"> 7347</span>&#160;</div><div class="line"><a name="l07348"></a><span class="lineno"> 7348</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160;}</div><div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;</div><div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>&#160;<span class="keywordtype">bool</span> VmaDefragmentator::MoveMakesSense(</div><div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div><div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>&#160;{</div><div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</div><div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;    {</div><div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;    }</div><div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div><div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;    {</div><div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;    }</div><div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</div><div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;    {</div><div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>&#160;    }</div><div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;}</div><div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160;</div><div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;<span class="comment">// VmaAllocator_T</span></div><div class="line"><a name="l07372"></a><span class="lineno"> 7372</span>&#160;</div><div class="line"><a name="l07373"></a><span class="lineno"> 7373</span>&#160;VmaAllocator_T::VmaAllocator_T(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo) :</div><div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>&#160;    m_UseMutex((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a>) == 0),</div><div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>&#160;    m_UseKhrDedicatedAllocation((pCreateInfo-&gt;flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>) != 0),</div><div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div><div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div><div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div><div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div><div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div><div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div><div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160;    m_CurrentFrameIndex(0),</div><div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160;    m_Pools(VmaStlAllocator&lt;<a class="code" href="struct_vma_pool.html">VmaPool</a>&gt;(GetAllocationCallbacks()))</div><div class="line"><a name="l07384"></a><span class="lineno"> 7384</span>&#160;{</div><div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160;    VMA_ASSERT(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a> &amp;&amp; pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>);    </div><div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>&#160;</div><div class="line"><a name="l07387"></a><span class="lineno"> 7387</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div><div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div><div class="line"><a name="l07389"></a><span class="lineno"> 7389</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div><div class="line"><a name="l07390"></a><span class="lineno"> 7390</span>&#160;        </div><div class="line"><a name="l07391"></a><span class="lineno"> 7391</span>&#160;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div><div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div><div class="line"><a name="l07393"></a><span class="lineno"> 7393</span>&#160;</div><div class="line"><a name="l07394"></a><span class="lineno"> 7394</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>&#160;    {</div><div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>&#160;        m_HeapSizeLimit[i] = VK_WHOLE_SIZE;</div><div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>&#160;    }</div><div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>&#160;</div><div class="line"><a name="l07399"></a><span class="lineno"> 7399</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a> != VMA_NULL)</div><div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>&#160;    {</div><div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>;</div><div class="line"><a name="l07402"></a><span class="lineno"> 7402</span>&#160;        m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">pDeviceMemoryCallbacks</a>-&gt;<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>;</div><div class="line"><a name="l07403"></a><span class="lineno"> 7403</span>&#160;    }</div><div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;</div><div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div><div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;</div><div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div><div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</div><div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>&#160;</div><div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>&#160;    m_PreferredLargeHeapBlockSize = (pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> != 0) ?</div><div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;        pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a> : static_cast&lt;VkDeviceSize&gt;(VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div><div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;</div><div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a> != VMA_NULL)</div><div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>&#160;    {</div><div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l07416"></a><span class="lineno"> 7416</span>&#160;        {</div><div class="line"><a name="l07417"></a><span class="lineno"> 7417</span>&#160;            <span class="keyword">const</span> VkDeviceSize limit = pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">pHeapSizeLimit</a>[heapIndex];</div><div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div><div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;            {</div><div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>&#160;                m_HeapSizeLimit[heapIndex] = limit;</div><div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div><div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;                {</div><div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div><div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;                }</div><div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;            }</div><div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>&#160;        }</div><div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>&#160;    }</div><div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;</div><div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>&#160;    {</div><div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div><div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>&#160;</div><div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>&#160;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div><div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>&#160;            memTypeIndex,</div><div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>&#160;            preferredBlockSize,</div><div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160;            0,</div><div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>&#160;            SIZE_MAX,</div><div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>&#160;            GetBufferImageGranularity(),</div><div class="line"><a name="l07440"></a><span class="lineno"> 7440</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div><div class="line"><a name="l07441"></a><span class="lineno"> 7441</span>&#160;            <span class="keyword">false</span>); <span class="comment">// isCustomPool</span></div><div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div><div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div><div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</div><div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;    }</div><div class="line"><a name="l07446"></a><span class="lineno"> 7446</span>&#160;}</div><div class="line"><a name="l07447"></a><span class="lineno"> 7447</span>&#160;</div><div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div><div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>&#160;{</div><div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>&#160;    VMA_ASSERT(m_Pools.empty());</div><div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>&#160;</div><div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div><div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>&#160;    {</div><div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div><div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div><div class="line"><a name="l07456"></a><span class="lineno"> 7456</span>&#160;    }</div><div class="line"><a name="l07457"></a><span class="lineno"> 7457</span>&#160;}</div><div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>&#160;</div><div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::ImportVulkanFunctions(<span class="keyword">const</span> <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a>* pVulkanFunctions)</div><div class="line"><a name="l07460"></a><span class="lineno"> 7460</span>&#160;{</div><div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = &amp;vkGetPhysicalDeviceProperties;</div><div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = &amp;vkGetPhysicalDeviceMemoryProperties;</div><div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;    m_VulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</div><div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;    m_VulkanFunctions.vkFreeMemory = &amp;vkFreeMemory;</div><div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;    m_VulkanFunctions.vkMapMemory = &amp;vkMapMemory;</div><div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;    m_VulkanFunctions.vkUnmapMemory = &amp;vkUnmapMemory;</div><div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = &amp;vkBindBufferMemory;</div><div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;    m_VulkanFunctions.vkBindImageMemory = &amp;vkBindImageMemory;</div><div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = &amp;vkGetBufferMemoryRequirements;</div><div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = &amp;vkGetImageMemoryRequirements;</div><div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;    m_VulkanFunctions.vkCreateBuffer = &amp;vkCreateBuffer;</div><div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = &amp;vkDestroyBuffer;</div><div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>&#160;    m_VulkanFunctions.vkCreateImage = &amp;vkCreateImage;</div><div class="line"><a name="l07475"></a><span class="lineno"> 7475</span>&#160;    m_VulkanFunctions.vkDestroyImage = &amp;vkDestroyImage;</div><div class="line"><a name="l07476"></a><span class="lineno"> 7476</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;    {</div><div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div><div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div><div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l07482"></a><span class="lineno"> 7482</span>&#160;    }</div><div class="line"><a name="l07483"></a><span class="lineno"> 7483</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>&#160;</div><div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>&#160;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div><div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div><div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>&#160;</div><div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div><div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;    {</div><div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div><div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;        VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div><div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div><div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;        VMA_COPY_IF_NOT_NULL(vkMapMemory);</div><div class="line"><a name="l07495"></a><span class="lineno"> 7495</span>&#160;        VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div><div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div><div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div><div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div><div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div><div class="line"><a name="l07500"></a><span class="lineno"> 7500</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div><div class="line"><a name="l07501"></a><span class="lineno"> 7501</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div><div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateImage);</div><div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div><div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div><div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div><div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>&#160;    }</div><div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>&#160;</div><div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div><div class="line"><a name="l07509"></a><span class="lineno"> 7509</span>&#160;</div><div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>&#160;    <span class="comment">// If these asserts are hit, you must either #define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;    <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div><div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div><div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div><div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div><div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div><div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div><div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div><div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div><div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div><div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div><div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div><div class="line"><a name="l07525"></a><span class="lineno"> 7525</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div><div class="line"><a name="l07526"></a><span class="lineno"> 7526</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;    {</div><div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>&#160;    }</div><div class="line"><a name="l07531"></a><span class="lineno"> 7531</span>&#160;}</div><div class="line"><a name="l07532"></a><span class="lineno"> 7532</span>&#160;</div><div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div><div class="line"><a name="l07534"></a><span class="lineno"> 7534</span>&#160;{</div><div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div><div class="line"><a name="l07537"></a><span class="lineno"> 7537</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isSmallHeap = heapSize &lt;= VMA_SMALL_HEAP_MAX_SIZE;</div><div class="line"><a name="l07538"></a><span class="lineno"> 7538</span>&#160;    <span class="keywordflow">return</span> isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l07539"></a><span class="lineno"> 7539</span>&#160;}</div><div class="line"><a name="l07540"></a><span class="lineno"> 7540</span>&#160;</div><div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div><div class="line"><a name="l07542"></a><span class="lineno"> 7542</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l07543"></a><span class="lineno"> 7543</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160;{</div><div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160;    VMA_ASSERT(pAllocation != VMA_NULL);</div><div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  AllocateMemory: MemoryTypeIndex=%u, Size=%llu&quot;</span>, memTypeIndex, vkMemReq.size);</div><div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>&#160;</div><div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div><div class="line"><a name="l07555"></a><span class="lineno"> 7555</span>&#160;</div><div class="line"><a name="l07556"></a><span class="lineno"> 7556</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div><div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>&#160;    {</div><div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>;</div><div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>&#160;    }</div><div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>&#160;</div><div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;    VMA_ASSERT(blockVector);</div><div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>&#160;</div><div class="line"><a name="l07566"></a><span class="lineno"> 7566</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div><div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div><div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div><div class="line"><a name="l07569"></a><span class="lineno"> 7569</span>&#160;        dedicatedAllocation ||</div><div class="line"><a name="l07570"></a><span class="lineno"> 7570</span>&#160;        <span class="comment">// Heuristics: Allocate dedicated memory if requested size if greater than half of preferred block size.</span></div><div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;        vkMemReq.size &gt; preferredBlockSize / 2;</div><div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;</div><div class="line"><a name="l07573"></a><span class="lineno"> 7573</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div><div class="line"><a name="l07574"></a><span class="lineno"> 7574</span>&#160;        (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) == 0 &amp;&amp;</div><div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> == VK_NULL_HANDLE)</div><div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;    {</div><div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;        finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>;</div><div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>&#160;    }</div><div class="line"><a name="l07579"></a><span class="lineno"> 7579</span>&#160;</div><div class="line"><a name="l07580"></a><span class="lineno"> 7580</span>&#160;    <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0)</div><div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;    {</div><div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l07583"></a><span class="lineno"> 7583</span>&#160;        {</div><div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07585"></a><span class="lineno"> 7585</span>&#160;        }</div><div class="line"><a name="l07586"></a><span class="lineno"> 7586</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>&#160;        {</div><div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div><div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l07590"></a><span class="lineno"> 7590</span>&#160;                suballocType,</div><div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>&#160;                memTypeIndex,</div><div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div><div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;                (finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div><div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>&#160;                dedicatedImage,</div><div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>&#160;                pAllocation);</div><div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>&#160;        }</div><div class="line"><a name="l07599"></a><span class="lineno"> 7599</span>&#160;    }</div><div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160;    {</div><div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div><div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hCurrentPool</span></div><div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;            vkMemReq,</div><div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>&#160;            finalCreateInfo,</div><div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>&#160;            suballocType,</div><div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>&#160;            pAllocation);</div><div class="line"><a name="l07609"></a><span class="lineno"> 7609</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07610"></a><span class="lineno"> 7610</span>&#160;        {</div><div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07612"></a><span class="lineno"> 7612</span>&#160;        }</div><div class="line"><a name="l07613"></a><span class="lineno"> 7613</span>&#160;</div><div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div><div class="line"><a name="l07615"></a><span class="lineno"> 7615</span>&#160;        <span class="keywordflow">if</span>((finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l07616"></a><span class="lineno"> 7616</span>&#160;        {</div><div class="line"><a name="l07617"></a><span class="lineno"> 7617</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07618"></a><span class="lineno"> 7618</span>&#160;        }</div><div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>&#160;        {</div><div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>&#160;            res = AllocateDedicatedMemory(</div><div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;                suballocType,</div><div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;                memTypeIndex,</div><div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0,</div><div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;                (finalCreateInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a>) != 0,</div><div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;                finalCreateInfo.pUserData,</div><div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;                dedicatedImage,</div><div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160;                pAllocation);</div><div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;            {</div><div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div><div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div><div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>&#160;            }</div><div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07638"></a><span class="lineno"> 7638</span>&#160;            {</div><div class="line"><a name="l07639"></a><span class="lineno"> 7639</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div><div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;            }</div><div class="line"><a name="l07643"></a><span class="lineno"> 7643</span>&#160;        }</div><div class="line"><a name="l07644"></a><span class="lineno"> 7644</span>&#160;    }</div><div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>&#160;}</div><div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>&#160;</div><div class="line"><a name="l07647"></a><span class="lineno"> 7647</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div><div class="line"><a name="l07648"></a><span class="lineno"> 7648</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;    <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l07653"></a><span class="lineno"> 7653</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l07657"></a><span class="lineno"> 7657</span>&#160;{</div><div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>&#160;    VMA_ASSERT(pAllocation);</div><div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>&#160;</div><div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;    allocInfo.allocationSize = size;</div><div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;</div><div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div><div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>&#160;    {</div><div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div><div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>&#160;        {</div><div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div><div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div><div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>&#160;        }</div><div class="line"><a name="l07673"></a><span class="lineno"> 7673</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div><div class="line"><a name="l07674"></a><span class="lineno"> 7674</span>&#160;        {</div><div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div><div class="line"><a name="l07676"></a><span class="lineno"> 7676</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l07677"></a><span class="lineno"> 7677</span>&#160;        }</div><div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;    }</div><div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>&#160;</div><div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>&#160;    <span class="comment">// Allocate VkDeviceMemory.</span></div><div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l07682"></a><span class="lineno"> 7682</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div><div class="line"><a name="l07683"></a><span class="lineno"> 7683</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l07684"></a><span class="lineno"> 7684</span>&#160;    {</div><div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l07686"></a><span class="lineno"> 7686</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07687"></a><span class="lineno"> 7687</span>&#160;    }</div><div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160;</div><div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div><div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;    <span class="keywordflow">if</span>(map)</div><div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160;    {</div><div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div><div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160;            m_hDevice,</div><div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>&#160;            hMemory,</div><div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;            0,</div><div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>&#160;            0,</div><div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>&#160;            &amp;pMappedData);</div><div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;        {</div><div class="line"><a name="l07701"></a><span class="lineno"> 7701</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div><div class="line"><a name="l07702"></a><span class="lineno"> 7702</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div><div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;        }</div><div class="line"><a name="l07705"></a><span class="lineno"> 7705</span>&#160;    }</div><div class="line"><a name="l07706"></a><span class="lineno"> 7706</span>&#160;</div><div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(m_CurrentFrameIndex.load(), isUserDataString);</div><div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div><div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div><div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;</div><div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;    <span class="comment">// Register it in m_pDedicatedAllocations.</span></div><div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>&#160;    {</div><div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;        AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, *pAllocation);</div><div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;    }</div><div class="line"><a name="l07718"></a><span class="lineno"> 7718</span>&#160;</div><div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory MemoryTypeIndex=#%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;</div><div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;}</div><div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;</div><div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div><div class="line"><a name="l07725"></a><span class="lineno"> 7725</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>&#160;    {</div><div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;        memReqInfo.buffer = hBuffer;</div><div class="line"><a name="l07734"></a><span class="lineno"> 7734</span>&#160;</div><div class="line"><a name="l07735"></a><span class="lineno"> 7735</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l07736"></a><span class="lineno"> 7736</span>&#160;</div><div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160;</div><div class="line"><a name="l07740"></a><span class="lineno"> 7740</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>&#160;</div><div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l07745"></a><span class="lineno"> 7745</span>&#160;    }</div><div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160;    {</div><div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div><div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>&#160;    }</div><div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>&#160;}</div><div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160;</div><div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div><div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;    VkImage hImage,</div><div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>&#160;    {</div><div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;        memReqInfo.image = hImage;</div><div class="line"><a name="l07764"></a><span class="lineno"> 7764</span>&#160;</div><div class="line"><a name="l07765"></a><span class="lineno"> 7765</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>&#160;</div><div class="line"><a name="l07767"></a><span class="lineno"> 7767</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160;</div><div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l07771"></a><span class="lineno"> 7771</span>&#160;</div><div class="line"><a name="l07772"></a><span class="lineno"> 7772</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>&#160;    }</div><div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07777"></a><span class="lineno"> 7777</span>&#160;    {</div><div class="line"><a name="l07778"></a><span class="lineno"> 7778</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div><div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;    }</div><div class="line"><a name="l07782"></a><span class="lineno"> 7782</span>&#160;}</div><div class="line"><a name="l07783"></a><span class="lineno"> 7783</span>&#160;</div><div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div><div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; createInfo,</div><div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l07792"></a><span class="lineno"> 7792</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;{</div><div class="line"><a name="l07794"></a><span class="lineno"> 7794</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l07795"></a><span class="lineno"> 7795</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;    {</div><div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT together with VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT makes no sense.&quot;</span>);</div><div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;    }</div><div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0 &amp;&amp;</div><div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160;        (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a>) != 0)</div><div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160;    {</div><div class="line"><a name="l07803"></a><span class="lineno"> 7803</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_MAPPED_BIT together with VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT is invalid.&quot;</span>);</div><div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07805"></a><span class="lineno"> 7805</span>&#160;    }</div><div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div><div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;    {</div><div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>&#160;        <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a>) != 0)</div><div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>&#160;        {</div><div class="line"><a name="l07810"></a><span class="lineno"> 7810</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT specified while dedicated allocation is required.&quot;</span>);</div><div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;        }</div><div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>&#160;        <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div><div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>&#160;        {</div><div class="line"><a name="l07815"></a><span class="lineno"> 7815</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Pool specified while dedicated allocation is required.&quot;</span>);</div><div class="line"><a name="l07816"></a><span class="lineno"> 7816</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07817"></a><span class="lineno"> 7817</span>&#160;        }</div><div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>&#160;    }</div><div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;    <span class="keywordflow">if</span>((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE) &amp;&amp;</div><div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>&#160;        ((createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; (<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a>)) != 0))</div><div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160;    {</div><div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Specifying VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT when pool != null is invalid.&quot;</span>);</div><div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160;    }</div><div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>&#160;</div><div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>&#160;    <span class="keywordflow">if</span>(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a> != VK_NULL_HANDLE)</div><div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>&#160;    {</div><div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>&#160;        <span class="keywordflow">return</span> createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.Allocate(</div><div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;            createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l07830"></a><span class="lineno"> 7830</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l07831"></a><span class="lineno"> 7831</span>&#160;            vkMemReq,</div><div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>&#160;            createInfo,</div><div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>&#160;            suballocType,</div><div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>&#160;            pAllocation);</div><div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>&#160;    }</div><div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l07837"></a><span class="lineno"> 7837</span>&#160;    {</div><div class="line"><a name="l07838"></a><span class="lineno"> 7838</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div><div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div><div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div><div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>&#160;        VkResult res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div><div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>&#160;        {</div><div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>&#160;            res = AllocateMemoryOfType(</div><div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>&#160;                vkMemReq,</div><div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>&#160;                dedicatedImage,</div><div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>&#160;                createInfo,</div><div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>&#160;                memTypeIndex,</div><div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>&#160;                suballocType,</div><div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>&#160;                pAllocation);</div><div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;            <span class="comment">// Succeeded on first try.</span></div><div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07855"></a><span class="lineno"> 7855</span>&#160;            {</div><div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160;            }</div><div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div><div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>&#160;            {</div><div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>&#160;                <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>&#160;                {</div><div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div><div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div><div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div><div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>&#160;                    res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(<span class="keyword">this</span>, memoryTypeBits, &amp;createInfo, &amp;memTypeIndex);</div><div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>&#160;                    {</div><div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>&#160;                        res = AllocateMemoryOfType(</div><div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160;                            vkMemReq,</div><div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l07872"></a><span class="lineno"> 7872</span>&#160;                            dedicatedBuffer,</div><div class="line"><a name="l07873"></a><span class="lineno"> 7873</span>&#160;                            dedicatedImage,</div><div class="line"><a name="l07874"></a><span class="lineno"> 7874</span>&#160;                            createInfo,</div><div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>&#160;                            memTypeIndex,</div><div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>&#160;                            suballocType,</div><div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>&#160;                            pAllocation);</div><div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div><div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160;                        {</div><div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160;                            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>&#160;                        }</div><div class="line"><a name="l07883"></a><span class="lineno"> 7883</span>&#160;                        <span class="comment">// else: Allocation from this memory type failed. Try next one - next loop iteration.</span></div><div class="line"><a name="l07884"></a><span class="lineno"> 7884</span>&#160;                    }</div><div class="line"><a name="l07885"></a><span class="lineno"> 7885</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div><div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>&#160;                    {</div><div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160;                        <span class="comment">// Not returning res, which is VK_ERROR_FEATURE_NOT_PRESENT, because we already failed to allocate once.</span></div><div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l07890"></a><span class="lineno"> 7890</span>&#160;                    }</div><div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;                }</div><div class="line"><a name="l07892"></a><span class="lineno"> 7892</span>&#160;            }</div><div class="line"><a name="l07893"></a><span class="lineno"> 7893</span>&#160;        }</div><div class="line"><a name="l07894"></a><span class="lineno"> 7894</span>&#160;        <span class="comment">// Can&#39;t find any single memory type maching requirements. res is VK_ERROR_FEATURE_NOT_PRESENT.</span></div><div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>&#160;    }</div><div class="line"><a name="l07898"></a><span class="lineno"> 7898</span>&#160;}</div><div class="line"><a name="l07899"></a><span class="lineno"> 7899</span>&#160;</div><div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeMemory(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>&#160;{</div><div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>&#160;    VMA_ASSERT(allocation);</div><div class="line"><a name="l07903"></a><span class="lineno"> 7903</span>&#160;</div><div class="line"><a name="l07904"></a><span class="lineno"> 7904</span>&#160;    <span class="keywordflow">if</span>(allocation-&gt;CanBecomeLost() == <span class="keyword">false</span> ||</div><div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>&#160;        allocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>&#160;    {</div><div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;        <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div><div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>&#160;        {</div><div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>&#160;            {</div><div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>&#160;                VmaBlockVector* pBlockVector = VMA_NULL;</div><div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;                <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetPool();</div><div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;                <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div><div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;                {</div><div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;                    pBlockVector = &amp;hPool-&gt;m_BlockVector;</div><div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>&#160;                }</div><div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;                {</div><div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>&#160;                    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;                    pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l07921"></a><span class="lineno"> 7921</span>&#160;                }</div><div class="line"><a name="l07922"></a><span class="lineno"> 7922</span>&#160;                pBlockVector-&gt;Free(allocation);</div><div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>&#160;            }</div><div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>&#160;            FreeDedicatedMemory(allocation);</div><div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l07929"></a><span class="lineno"> 7929</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l07930"></a><span class="lineno"> 7930</span>&#160;        }</div><div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;    }</div><div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;</div><div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;    allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div><div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160;    vma_delete(<span class="keyword">this</span>, allocation);</div><div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;}</div><div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>&#160;</div><div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;{</div><div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;    <span class="comment">// Initialize.</span></div><div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_TYPES; ++i)</div><div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160;    </div><div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>&#160;    {</div><div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;        VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div><div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>&#160;    }</div><div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>&#160;</div><div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;    {</div><div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0, poolCount = m_Pools.size(); poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160;        {</div><div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;            m_Pools[poolIndex]-&gt;GetBlockVector().AddStats(pStats);</div><div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;        }</div><div class="line"><a name="l07961"></a><span class="lineno"> 7961</span>&#160;    }</div><div class="line"><a name="l07962"></a><span class="lineno"> 7962</span>&#160;</div><div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div><div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;    {</div><div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0, allocCount = pDedicatedAllocVector-&gt;size(); allocIndex &lt; allocCount; ++allocIndex)</div><div class="line"><a name="l07971"></a><span class="lineno"> 7971</span>&#160;        {</div><div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div><div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>&#160;        }</div><div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>&#160;    }</div><div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160;</div><div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;    <span class="comment">// Postprocess.</span></div><div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryTypeCount(); ++i)</div><div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; GetMemoryHeapCount(); ++i)</div><div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l07986"></a><span class="lineno"> 7986</span>&#160;}</div><div class="line"><a name="l07987"></a><span class="lineno"> 7987</span>&#160;</div><div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_VENDOR_ID_AMD = 4098;</div><div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>&#160;</div><div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>&#160;VkResult VmaAllocator_T::Defragment(</div><div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l07994"></a><span class="lineno"> 7994</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a>* pDefragmentationInfo,</div><div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;{</div><div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;    <span class="keywordflow">if</span>(pAllocationsChanged != VMA_NULL)</div><div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160;    {</div><div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;        memset(pAllocationsChanged, 0, <span class="keyword">sizeof</span>(*pAllocationsChanged));</div><div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>&#160;    }</div><div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;    {</div><div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;        memset(pDefragmentationStats, 0, <span class="keyword">sizeof</span>(*pDefragmentationStats));</div><div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>&#160;    }</div><div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>&#160;</div><div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;    <span class="keyword">const</span> uint32_t currentFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l08007"></a><span class="lineno"> 8007</span>&#160;</div><div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>&#160;    VmaMutexLock poolsLock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08009"></a><span class="lineno"> 8009</span>&#160;</div><div class="line"><a name="l08010"></a><span class="lineno"> 8010</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;</div><div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them in BlockVectors when necessary.</span></div><div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0; allocIndex &lt; allocationCount; ++allocIndex)</div><div class="line"><a name="l08014"></a><span class="lineno"> 8014</span>&#160;    {</div><div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div><div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>&#160;        VMA_ASSERT(hAlloc);</div><div class="line"><a name="l08017"></a><span class="lineno"> 8017</span>&#160;        <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div><div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div><div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;            <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l08021"></a><span class="lineno"> 8021</span>&#160;            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0) &amp;&amp;</div><div class="line"><a name="l08022"></a><span class="lineno"> 8022</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div><div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;        {</div><div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;            VmaBlockVector* pAllocBlockVector = VMA_NULL;</div><div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;</div><div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>&#160;            <span class="keyword">const</span> <a class="code" href="struct_vma_pool.html">VmaPool</a> hAllocPool = hAlloc-&gt;GetPool();</div><div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div><div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div><div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>&#160;            {</div><div class="line"><a name="l08031"></a><span class="lineno"> 8031</span>&#160;                pAllocBlockVector = &amp;hAllocPool-&gt;GetBlockVector();</div><div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160;            }</div><div class="line"><a name="l08033"></a><span class="lineno"> 8033</span>&#160;            <span class="comment">// This allocation belongs to general pool.</span></div><div class="line"><a name="l08034"></a><span class="lineno"> 8034</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;            {</div><div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;                pAllocBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l08037"></a><span class="lineno"> 8037</span>&#160;            }</div><div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>&#160;</div><div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;            VmaDefragmentator* <span class="keyword">const</span> pDefragmentator = pAllocBlockVector-&gt;EnsureDefragmentator(<span class="keyword">this</span>, currentFrameIndex);</div><div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>&#160;</div><div class="line"><a name="l08041"></a><span class="lineno"> 8041</span>&#160;            VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div><div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;                &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div><div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160;            pDefragmentator-&gt;AddAllocation(hAlloc, pChanged);</div><div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160;        }</div><div class="line"><a name="l08045"></a><span class="lineno"> 8045</span>&#160;    }</div><div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;</div><div class="line"><a name="l08047"></a><span class="lineno"> 8047</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>&#160;</div><div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;    <span class="comment">// ======== Main processing.</span></div><div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160;</div><div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;    VkDeviceSize maxBytesToMove = SIZE_MAX;</div><div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;    uint32_t maxAllocationsToMove = UINT32_MAX;</div><div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div><div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;    {</div><div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;        maxBytesToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>&#160;        maxAllocationsToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>&#160;    }</div><div class="line"><a name="l08058"></a><span class="lineno"> 8058</span>&#160;</div><div class="line"><a name="l08059"></a><span class="lineno"> 8059</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div><div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>&#160;        (memTypeIndex &lt; GetMemoryTypeCount()) &amp;&amp; (result == VK_SUCCESS);</div><div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;        ++memTypeIndex)</div><div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;    {</div><div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>&#160;        <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;        <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;        {</div><div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160;            result = m_pBlockVectors[memTypeIndex]-&gt;Defragment(</div><div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;                pDefragmentationStats,</div><div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;                maxBytesToMove,</div><div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;                maxAllocationsToMove);</div><div class="line"><a name="l08071"></a><span class="lineno"> 8071</span>&#160;        }</div><div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;    }</div><div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>&#160;</div><div class="line"><a name="l08074"></a><span class="lineno"> 8074</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l08075"></a><span class="lineno"> 8075</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; (poolIndex &lt; poolCount) &amp;&amp; (result == VK_SUCCESS); ++poolIndex)</div><div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;    {</div><div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;        result = m_Pools[poolIndex]-&gt;GetBlockVector().Defragment(</div><div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160;            pDefragmentationStats,</div><div class="line"><a name="l08079"></a><span class="lineno"> 8079</span>&#160;            maxBytesToMove,</div><div class="line"><a name="l08080"></a><span class="lineno"> 8080</span>&#160;            maxAllocationsToMove);</div><div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;    }</div><div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;</div><div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160;    <span class="comment">// ========  Destroy defragmentators.</span></div><div class="line"><a name="l08084"></a><span class="lineno"> 8084</span>&#160;</div><div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = poolCount; poolIndex--; )</div><div class="line"><a name="l08087"></a><span class="lineno"> 8087</span>&#160;    {</div><div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;        m_Pools[poolIndex]-&gt;GetBlockVector().DestroyDefragmentator();</div><div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;    }</div><div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;</div><div class="line"><a name="l08091"></a><span class="lineno"> 8091</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )</div><div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;    {</div><div class="line"><a name="l08094"></a><span class="lineno"> 8094</span>&#160;        <span class="keywordflow">if</span>((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;        {</div><div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;            m_pBlockVectors[memTypeIndex]-&gt;DestroyDefragmentator();</div><div class="line"><a name="l08097"></a><span class="lineno"> 8097</span>&#160;        }</div><div class="line"><a name="l08098"></a><span class="lineno"> 8098</span>&#160;    }</div><div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;</div><div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>&#160;}</div><div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>&#160;</div><div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetAllocationInfo(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>&#160;{</div><div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160;    {</div><div class="line"><a name="l08107"></a><span class="lineno"> 8107</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l08111"></a><span class="lineno"> 8111</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l08113"></a><span class="lineno"> 8113</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l08114"></a><span class="lineno"> 8114</span>&#160;        {</div><div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;            {</div><div class="line"><a name="l08117"></a><span class="lineno"> 8117</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div><div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = VK_NULL_HANDLE;</div><div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div><div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l08121"></a><span class="lineno"> 8121</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l08122"></a><span class="lineno"> 8122</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;            }</div><div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160;            {</div><div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l08134"></a><span class="lineno"> 8134</span>&#160;            }</div><div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l08136"></a><span class="lineno"> 8136</span>&#160;            {</div><div class="line"><a name="l08137"></a><span class="lineno"> 8137</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;                {</div><div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>&#160;                }</div><div class="line"><a name="l08141"></a><span class="lineno"> 8141</span>&#160;            }</div><div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;        }</div><div class="line"><a name="l08143"></a><span class="lineno"> 8143</span>&#160;    }</div><div class="line"><a name="l08144"></a><span class="lineno"> 8144</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;    {</div><div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a> = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a> = hAllocation-&gt;GetSize();</div><div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = hAllocation-&gt;GetMappedData();</div><div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;        pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">pUserData</a> = hAllocation-&gt;GetUserData();</div><div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>&#160;    }</div><div class="line"><a name="l08153"></a><span class="lineno"> 8153</span>&#160;}</div><div class="line"><a name="l08154"></a><span class="lineno"> 8154</span>&#160;</div><div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160;<span class="keywordtype">bool</span> VmaAllocator_T::TouchAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160;{</div><div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div><div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>&#160;    {</div><div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>&#160;        {</div><div class="line"><a name="l08164"></a><span class="lineno"> 8164</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;            {</div><div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>&#160;            }</div><div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;            {</div><div class="line"><a name="l08170"></a><span class="lineno"> 8170</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08171"></a><span class="lineno"> 8171</span>&#160;            }</div><div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>&#160;            {</div><div class="line"><a name="l08174"></a><span class="lineno"> 8174</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l08175"></a><span class="lineno"> 8175</span>&#160;                {</div><div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l08177"></a><span class="lineno"> 8177</span>&#160;                }</div><div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>&#160;            }</div><div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;        }</div><div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;    }</div><div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;    {</div><div class="line"><a name="l08183"></a><span class="lineno"> 8183</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l08184"></a><span class="lineno"> 8184</span>&#160;    }</div><div class="line"><a name="l08185"></a><span class="lineno"> 8185</span>&#160;}</div><div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;</div><div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>&#160;VkResult VmaAllocator_T::CreatePool(<span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>&#160;{</div><div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  CreatePool: MemoryTypeIndex=%u&quot;</span>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>&#160;</div><div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div><div class="line"><a name="l08192"></a><span class="lineno"> 8192</span>&#160;</div><div class="line"><a name="l08193"></a><span class="lineno"> 8193</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> == 0)</div><div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;    {</div><div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div><div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;    }</div><div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a> == 0)</div><div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;    {</div><div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a> = CalcPreferredBlockSize(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l08200"></a><span class="lineno"> 8200</span>&#160;    }</div><div class="line"><a name="l08201"></a><span class="lineno"> 8201</span>&#160;</div><div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>&#160;    *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo);</div><div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>&#160;</div><div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div><div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l08206"></a><span class="lineno"> 8206</span>&#160;    {</div><div class="line"><a name="l08207"></a><span class="lineno"> 8207</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div><div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;        *pPool = VMA_NULL;</div><div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08210"></a><span class="lineno"> 8210</span>&#160;    }</div><div class="line"><a name="l08211"></a><span class="lineno"> 8211</span>&#160;</div><div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;    <span class="comment">// Add to m_Pools.</span></div><div class="line"><a name="l08213"></a><span class="lineno"> 8213</span>&#160;    {</div><div class="line"><a name="l08214"></a><span class="lineno"> 8214</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div><div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160;    }</div><div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160;</div><div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;}</div><div class="line"><a name="l08220"></a><span class="lineno"> 8220</span>&#160;</div><div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::DestroyPool(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l08222"></a><span class="lineno"> 8222</span>&#160;{</div><div class="line"><a name="l08223"></a><span class="lineno"> 8223</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div><div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>&#160;    {</div><div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div><div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div><div class="line"><a name="l08228"></a><span class="lineno"> 8228</span>&#160;    }</div><div class="line"><a name="l08229"></a><span class="lineno"> 8229</span>&#160;</div><div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div><div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;}</div><div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>&#160;</div><div class="line"><a name="l08233"></a><span class="lineno"> 8233</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetPoolStats(<a class="code" href="struct_vma_pool.html">VmaPool</a> pool, <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l08234"></a><span class="lineno"> 8234</span>&#160;{</div><div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div><div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;}</div><div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;</div><div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div><div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;{</div><div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div><div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>&#160;}</div><div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>&#160;</div><div class="line"><a name="l08243"></a><span class="lineno"> 8243</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div><div class="line"><a name="l08244"></a><span class="lineno"> 8244</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l08246"></a><span class="lineno"> 8246</span>&#160;{</div><div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div><div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>&#160;        m_CurrentFrameIndex.load(),</div><div class="line"><a name="l08249"></a><span class="lineno"> 8249</span>&#160;        pLostAllocationCount);</div><div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;}</div><div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160;</div><div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160;{</div><div class="line"><a name="l08254"></a><span class="lineno"> 8254</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(VMA_FRAME_INDEX_LOST, <span class="keyword">false</span>);</div><div class="line"><a name="l08255"></a><span class="lineno"> 8255</span>&#160;    (*pAllocation)-&gt;InitLost();</div><div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;}</div><div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160;</div><div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div><div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;{</div><div class="line"><a name="l08260"></a><span class="lineno"> 8260</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div><div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>&#160;</div><div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160;    VkResult res;</div><div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;    {</div><div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;        <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] &gt;= pAllocateInfo-&gt;allocationSize)</div><div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;        {</div><div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160;            res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160;            {</div><div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>&#160;                m_HeapSizeLimit[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div><div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>&#160;            }</div><div class="line"><a name="l08273"></a><span class="lineno"> 8273</span>&#160;        }</div><div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>&#160;        {</div><div class="line"><a name="l08276"></a><span class="lineno"> 8276</span>&#160;            res = VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160;        }</div><div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;    }</div><div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l08280"></a><span class="lineno"> 8280</span>&#160;    {</div><div class="line"><a name="l08281"></a><span class="lineno"> 8281</span>&#160;        res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;    }</div><div class="line"><a name="l08283"></a><span class="lineno"> 8283</span>&#160;</div><div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS &amp;&amp; m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a> != VMA_NULL)</div><div class="line"><a name="l08285"></a><span class="lineno"> 8285</span>&#160;    {</div><div class="line"><a name="l08286"></a><span class="lineno"> 8286</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">pfnAllocate</a>)(<span class="keyword">this</span>, pAllocateInfo-&gt;memoryTypeIndex, *pMemory, pAllocateInfo-&gt;allocationSize);</div><div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;    }</div><div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;</div><div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08290"></a><span class="lineno"> 8290</span>&#160;}</div><div class="line"><a name="l08291"></a><span class="lineno"> 8291</span>&#160;</div><div class="line"><a name="l08292"></a><span class="lineno"> 8292</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div><div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;{</div><div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;    <span class="keywordflow">if</span>(m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a> != VMA_NULL)</div><div class="line"><a name="l08295"></a><span class="lineno"> 8295</span>&#160;    {</div><div class="line"><a name="l08296"></a><span class="lineno"> 8296</span>&#160;        (*m_DeviceMemoryCallbacks.<a class="code" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">pfnFree</a>)(<span class="keyword">this</span>, memoryType, hMemory, size);</div><div class="line"><a name="l08297"></a><span class="lineno"> 8297</span>&#160;    }</div><div class="line"><a name="l08298"></a><span class="lineno"> 8298</span>&#160;</div><div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div><div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160;</div><div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);</div><div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;    {</div><div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160;        m_HeapSizeLimit[heapIndex] += size;</div><div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;    }</div><div class="line"><a name="l08307"></a><span class="lineno"> 8307</span>&#160;}</div><div class="line"><a name="l08308"></a><span class="lineno"> 8308</span>&#160;</div><div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>&#160;VkResult VmaAllocator_T::Map(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>&#160;{</div><div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160;    {</div><div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;    }</div><div class="line"><a name="l08315"></a><span class="lineno"> 8315</span>&#160;</div><div class="line"><a name="l08316"></a><span class="lineno"> 8316</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;    {</div><div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160;        {</div><div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div><div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;            VkResult res = pBlock-&gt;Map(<span class="keyword">this</span>, 1, (<span class="keywordtype">void</span>**)&amp;pBytes);</div><div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;            {</div><div class="line"><a name="l08325"></a><span class="lineno"> 8325</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div><div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;                hAllocation-&gt;BlockAllocMap();</div><div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;            }</div><div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;        }</div><div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div><div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l08333"></a><span class="lineno"> 8333</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l08334"></a><span class="lineno"> 8334</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160;    }</div><div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;}</div><div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;</div><div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::Unmap(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;{</div><div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;    {</div><div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l08343"></a><span class="lineno"> 8343</span>&#160;        {</div><div class="line"><a name="l08344"></a><span class="lineno"> 8344</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l08345"></a><span class="lineno"> 8345</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div><div class="line"><a name="l08346"></a><span class="lineno"> 8346</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div><div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;        }</div><div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div><div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;    }</div><div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;}</div><div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>&#160;</div><div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;VkResult VmaAllocator_T::BindBufferMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkBuffer hBuffer)</div><div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;{</div><div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l08361"></a><span class="lineno"> 8361</span>&#160;    {</div><div class="line"><a name="l08362"></a><span class="lineno"> 8362</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;        res = GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>&#160;            m_hDevice,</div><div class="line"><a name="l08365"></a><span class="lineno"> 8365</span>&#160;            hBuffer,</div><div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>&#160;    {</div><div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding buffer to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div><div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, hBuffer);</div><div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08375"></a><span class="lineno"> 8375</span>&#160;    }</div><div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;    }</div><div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;}</div><div class="line"><a name="l08381"></a><span class="lineno"> 8381</span>&#160;</div><div class="line"><a name="l08382"></a><span class="lineno"> 8382</span>&#160;VkResult VmaAllocator_T::BindImageMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkImage hImage)</div><div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;{</div><div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;    {</div><div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;        res = GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;            m_hDevice,</div><div class="line"><a name="l08390"></a><span class="lineno"> 8390</span>&#160;            hImage,</div><div class="line"><a name="l08391"></a><span class="lineno"> 8391</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>&#160;    {</div><div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l08397"></a><span class="lineno"> 8397</span>&#160;        VMA_ASSERT(pBlock &amp;&amp; <span class="stringliteral">&quot;Binding image to allocation that doesn&#39;t belong to any block. Is the allocation lost?&quot;</span>);</div><div class="line"><a name="l08398"></a><span class="lineno"> 8398</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, hImage);</div><div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08400"></a><span class="lineno"> 8400</span>&#160;    }</div><div class="line"><a name="l08401"></a><span class="lineno"> 8401</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;    }</div><div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;}</div><div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>&#160;</div><div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeDedicatedMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;{</div><div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;</div><div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>&#160;    {</div><div class="line"><a name="l08413"></a><span class="lineno"> 8413</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l08415"></a><span class="lineno"> 8415</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div><div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;        VMA_ASSERT(success);</div><div class="line"><a name="l08418"></a><span class="lineno"> 8418</span>&#160;    }</div><div class="line"><a name="l08419"></a><span class="lineno"> 8419</span>&#160;</div><div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div><div class="line"><a name="l08421"></a><span class="lineno"> 8421</span>&#160;    </div><div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160;    <span class="keywordflow">if</span>(allocation-&gt;GetMappedData() != VMA_NULL)</div><div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;    {</div><div class="line"><a name="l08424"></a><span class="lineno"> 8424</span>&#160;        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</div><div class="line"><a name="l08425"></a><span class="lineno"> 8425</span>&#160;    }</div><div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>&#160;    </div><div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div><div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;</div><div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;}</div><div class="line"><a name="l08431"></a><span class="lineno"> 8431</span>&#160;</div><div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>&#160;</div><div class="line"><a name="l08434"></a><span class="lineno"> 8434</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div><div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;{</div><div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;    {</div><div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div><div class="line"><a name="l08443"></a><span class="lineno"> 8443</span>&#160;        {</div><div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160;            {</div><div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div><div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;                json.BeginObject();</div><div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;            }</div><div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>&#160;</div><div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160;            json.ContinueString(memTypeIndex);</div><div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;            json.EndString();</div><div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;                </div><div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;            json.BeginArray();</div><div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;</div><div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; pDedicatedAllocVector-&gt;size(); ++i)</div><div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>&#160;            {</div><div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>&#160;                <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = (*pDedicatedAllocVector)[i];</div><div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>&#160;                    </div><div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>&#160;                json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[hAlloc-&gt;GetSuballocationType()]);</div><div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>&#160;</div><div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;                json.WriteNumber(hAlloc-&gt;GetSize());</div><div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>&#160;</div><div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>&#160;                <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData = hAlloc-&gt;GetUserData();</div><div class="line"><a name="l08469"></a><span class="lineno"> 8469</span>&#160;                <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l08470"></a><span class="lineno"> 8470</span>&#160;                {</div><div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;                    <span class="keywordflow">if</span>(hAlloc-&gt;IsUserDataString())</div><div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;                    {</div><div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;                        json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData);</div><div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;                    }</div><div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>&#160;                    {</div><div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>&#160;                        json.BeginString();</div><div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;                        json.ContinueString_Pointer(pUserData);</div><div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;                        json.EndString();</div><div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>&#160;                    }</div><div class="line"><a name="l08482"></a><span class="lineno"> 8482</span>&#160;                }</div><div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>&#160;</div><div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>&#160;                json.EndObject();</div><div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;            }</div><div class="line"><a name="l08486"></a><span class="lineno"> 8486</span>&#160;</div><div class="line"><a name="l08487"></a><span class="lineno"> 8487</span>&#160;            json.EndArray();</div><div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>&#160;        }</div><div class="line"><a name="l08489"></a><span class="lineno"> 8489</span>&#160;    }</div><div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div><div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>&#160;    {</div><div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>&#160;        json.EndObject();</div><div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>&#160;    }</div><div class="line"><a name="l08494"></a><span class="lineno"> 8494</span>&#160;</div><div class="line"><a name="l08495"></a><span class="lineno"> 8495</span>&#160;    {</div><div class="line"><a name="l08496"></a><span class="lineno"> 8496</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;        {</div><div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>&#160;            {</div><div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>&#160;                {</div><div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div><div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;                }</div><div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;</div><div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l08509"></a><span class="lineno"> 8509</span>&#160;                json.ContinueString(memTypeIndex);</div><div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;                json.EndString();</div><div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;</div><div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>&#160;            }</div><div class="line"><a name="l08514"></a><span class="lineno"> 8514</span>&#160;        }</div><div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div><div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>&#160;        {</div><div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>&#160;            json.EndObject();</div><div class="line"><a name="l08518"></a><span class="lineno"> 8518</span>&#160;        }</div><div class="line"><a name="l08519"></a><span class="lineno"> 8519</span>&#160;    }</div><div class="line"><a name="l08520"></a><span class="lineno"> 8520</span>&#160;</div><div class="line"><a name="l08521"></a><span class="lineno"> 8521</span>&#160;    {</div><div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div><div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;        {</div><div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div><div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;            json.BeginArray();</div><div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = 0; poolIndex &lt; poolCount; ++poolIndex)</div><div class="line"><a name="l08529"></a><span class="lineno"> 8529</span>&#160;            {</div><div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div><div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160;            }</div><div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>&#160;            json.EndArray();</div><div class="line"><a name="l08533"></a><span class="lineno"> 8533</span>&#160;        }</div><div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>&#160;    }</div><div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;}</div><div class="line"><a name="l08536"></a><span class="lineno"> 8536</span>&#160;</div><div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>&#160;</div><div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>&#160;<span class="keyword">static</span> VkResult AllocateMemoryForImage(</div><div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;    VkImage image,</div><div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;{</div><div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;    VMA_ASSERT(allocator &amp;&amp; (image != VK_NULL_HANDLE) &amp;&amp; pAllocationCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>&#160;    </div><div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div><div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;</div><div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;AllocateMemory(</div><div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>&#160;        vkMemReq,</div><div class="line"><a name="l08556"></a><span class="lineno"> 8556</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;        image, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;        *pAllocationCreateInfo,</div><div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;        suballocType,</div><div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>&#160;        pAllocation);</div><div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>&#160;}</div><div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160;</div><div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>&#160;<span class="comment">// Public interface</span></div><div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>&#160;</div><div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div><div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;{</div><div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div><div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div><div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;    *pAllocator = vma_new(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">pAllocationCallbacks</a>, VmaAllocator_T)(pCreateInfo);</div><div class="line"><a name="l08575"></a><span class="lineno"> 8575</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>&#160;}</div><div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160;</div><div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a>(</div><div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l08580"></a><span class="lineno"> 8580</span>&#160;{</div><div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div><div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>&#160;    {</div><div class="line"><a name="l08583"></a><span class="lineno"> 8583</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div><div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div><div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div><div class="line"><a name="l08586"></a><span class="lineno"> 8586</span>&#160;    }</div><div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160;}</div><div class="line"><a name="l08588"></a><span class="lineno"> 8588</span>&#160;</div><div class="line"><a name="l08589"></a><span class="lineno"> 8589</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a>(</div><div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div><div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;{</div><div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div><div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div><div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;}</div><div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>&#160;</div><div class="line"><a name="l08597"></a><span class="lineno"> 8597</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a>(</div><div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div><div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;{</div><div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div><div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>&#160;}</div><div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160;</div><div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a>(</div><div class="line"><a name="l08606"></a><span class="lineno"> 8606</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;    VkMemoryPropertyFlags* pFlags)</div><div class="line"><a name="l08609"></a><span class="lineno"> 8609</span>&#160;{</div><div class="line"><a name="l08610"></a><span class="lineno"> 8610</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div><div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div><div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div><div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>&#160;}</div><div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;</div><div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a>(</div><div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;    uint32_t frameIndex)</div><div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;{</div><div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;</div><div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>&#160;</div><div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div><div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160;}</div><div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;</div><div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a>(</div><div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>&#160;{</div><div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div><div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160;    allocator-&gt;CalculateStats(pStats);</div><div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;}</div><div class="line"><a name="l08635"></a><span class="lineno"> 8635</span>&#160;</div><div class="line"><a name="l08636"></a><span class="lineno"> 8636</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08637"></a><span class="lineno"> 8637</span>&#160;</div><div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a>(</div><div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>&#160;    VkBool32 detailedMap)</div><div class="line"><a name="l08642"></a><span class="lineno"> 8642</span>&#160;{</div><div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div><div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08645"></a><span class="lineno"> 8645</span>&#160;</div><div class="line"><a name="l08646"></a><span class="lineno"> 8646</span>&#160;    VmaStringBuilder sb(allocator);</div><div class="line"><a name="l08647"></a><span class="lineno"> 8647</span>&#160;    {</div><div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div><div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;        json.BeginObject();</div><div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;</div><div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div><div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div><div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160;</div><div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div><div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>&#160;    </div><div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>&#160;        {</div><div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div><div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;            json.ContinueString(heapIndex);</div><div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;            json.EndString();</div><div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>&#160;            json.BeginObject();</div><div class="line"><a name="l08663"></a><span class="lineno"> 8663</span>&#160;</div><div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div><div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160;</div><div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;            <span class="keywordflow">if</span>((allocator-&gt;m_MemProps.memoryHeaps[heapIndex].flags &amp; VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;            {</div><div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;            }</div><div class="line"><a name="l08673"></a><span class="lineno"> 8673</span>&#160;            json.EndArray();</div><div class="line"><a name="l08674"></a><span class="lineno"> 8674</span>&#160;</div><div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>&#160;            <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div><div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;            {</div><div class="line"><a name="l08677"></a><span class="lineno"> 8677</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div><div class="line"><a name="l08679"></a><span class="lineno"> 8679</span>&#160;            }</div><div class="line"><a name="l08680"></a><span class="lineno"> 8680</span>&#160;</div><div class="line"><a name="l08681"></a><span class="lineno"> 8681</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div><div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;            {</div><div class="line"><a name="l08683"></a><span class="lineno"> 8683</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div><div class="line"><a name="l08684"></a><span class="lineno"> 8684</span>&#160;                {</div><div class="line"><a name="l08685"></a><span class="lineno"> 8685</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l08686"></a><span class="lineno"> 8686</span>&#160;                    json.ContinueString(typeIndex);</div><div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;                    json.EndString();</div><div class="line"><a name="l08688"></a><span class="lineno"> 8688</span>&#160;</div><div class="line"><a name="l08689"></a><span class="lineno"> 8689</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;</div><div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div><div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>&#160;                    {</div><div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l08697"></a><span class="lineno"> 8697</span>&#160;                    }</div><div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>&#160;                    {</div><div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div><div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;                    }</div><div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div><div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;                    {</div><div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div><div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;                    }</div><div class="line"><a name="l08706"></a><span class="lineno"> 8706</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div><div class="line"><a name="l08707"></a><span class="lineno"> 8707</span>&#160;                    {</div><div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div><div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>&#160;                    }</div><div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div><div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>&#160;                    {</div><div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div><div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160;                    }</div><div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;                    json.EndArray();</div><div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;</div><div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;                    <span class="keywordflow">if</span>(stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex].<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> &gt; 0)</div><div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>&#160;                    {</div><div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l08719"></a><span class="lineno"> 8719</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div><div class="line"><a name="l08720"></a><span class="lineno"> 8720</span>&#160;                    }</div><div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>&#160;</div><div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>&#160;                    json.EndObject();</div><div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;                }</div><div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>&#160;            }</div><div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>&#160;</div><div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;            json.EndObject();</div><div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>&#160;        }</div><div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div><div class="line"><a name="l08729"></a><span class="lineno"> 8729</span>&#160;        {</div><div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;        }</div><div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>&#160;</div><div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>&#160;        json.EndObject();</div><div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;    }</div><div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;</div><div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div><div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>&#160;    <span class="keywordtype">char</span>* <span class="keyword">const</span> pChars = vma_new_array(allocator, <span class="keywordtype">char</span>, len + 1);</div><div class="line"><a name="l08738"></a><span class="lineno"> 8738</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div><div class="line"><a name="l08739"></a><span class="lineno"> 8739</span>&#160;    {</div><div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;        memcpy(pChars, sb.GetData(), len);</div><div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;    }</div><div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;    *ppStatsString = pChars;</div><div class="line"><a name="l08744"></a><span class="lineno"> 8744</span>&#160;}</div><div class="line"><a name="l08745"></a><span class="lineno"> 8745</span>&#160;</div><div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div><div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>&#160;{</div><div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div><div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;    {</div><div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l08753"></a><span class="lineno"> 8753</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div><div class="line"><a name="l08754"></a><span class="lineno"> 8754</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div><div class="line"><a name="l08755"></a><span class="lineno"> 8755</span>&#160;    }</div><div class="line"><a name="l08756"></a><span class="lineno"> 8756</span>&#160;}</div><div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;</div><div class="line"><a name="l08758"></a><span class="lineno"> 8758</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>&#160;</div><div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160;<span class="comment">This function is not protected by any mutex because it just reads immutable data.</span></div><div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l08766"></a><span class="lineno"> 8766</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08767"></a><span class="lineno"> 8767</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;{</div><div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>&#160;</div><div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>&#160;    <span class="keywordflow">if</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a> != 0)</div><div class="line"><a name="l08774"></a><span class="lineno"> 8774</span>&#160;    {</div><div class="line"><a name="l08775"></a><span class="lineno"> 8775</span>&#160;        memoryTypeBits &amp;= pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>&#160;    }</div><div class="line"><a name="l08777"></a><span class="lineno"> 8777</span>&#160;    </div><div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;    uint32_t requiredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160;    uint32_t preferredFlags = pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;</div><div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div><div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>&#160;    <span class="keywordflow">switch</span>(pAllocationCreateInfo-&gt;<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>)</div><div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;    {</div><div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a>:</div><div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a>:</div><div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a>:</div><div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a>:</div><div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a>:</div><div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>&#160;    }</div><div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>&#160;</div><div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div><div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160;    uint32_t minCost = UINT32_MAX;</div><div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div><div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div><div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div><div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;    {</div><div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div><div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>&#160;        {</div><div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div><div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div><div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div><div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div><div class="line"><a name="l08817"></a><span class="lineno"> 8817</span>&#160;            {</div><div class="line"><a name="l08818"></a><span class="lineno"> 8818</span>&#160;                <span class="comment">// Calculate cost as number of bits from preferredFlags not present in this memory type.</span></div><div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags);</div><div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div><div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div><div class="line"><a name="l08822"></a><span class="lineno"> 8822</span>&#160;                {</div><div class="line"><a name="l08823"></a><span class="lineno"> 8823</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div><div class="line"><a name="l08825"></a><span class="lineno"> 8825</span>&#160;                    {</div><div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>&#160;                    }</div><div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>&#160;                    minCost = currCost;</div><div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160;                }</div><div class="line"><a name="l08830"></a><span class="lineno"> 8830</span>&#160;            }</div><div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>&#160;        }</div><div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>&#160;    }</div><div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>&#160;}</div><div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>&#160;</div><div class="line"><a name="l08836"></a><span class="lineno"> 8836</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>&#160;{</div><div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div><div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l08845"></a><span class="lineno"> 8845</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l08846"></a><span class="lineno"> 8846</span>&#160;</div><div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l08849"></a><span class="lineno"> 8849</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div><div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div><div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>&#160;    {</div><div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div><div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;            hDev, hBuffer, &amp;memReq);</div><div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;</div><div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>&#160;            allocator,</div><div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>&#160;</div><div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div><div class="line"><a name="l08864"></a><span class="lineno"> 8864</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08865"></a><span class="lineno"> 8865</span>&#160;    }</div><div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08867"></a><span class="lineno"> 8867</span>&#160;}</div><div class="line"><a name="l08868"></a><span class="lineno"> 8868</span>&#160;</div><div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l08874"></a><span class="lineno"> 8874</span>&#160;{</div><div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div><div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;</div><div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div><div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div><div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div><div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l08885"></a><span class="lineno"> 8885</span>&#160;    {</div><div class="line"><a name="l08886"></a><span class="lineno"> 8886</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div><div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160;            hDev, hImage, &amp;memReq);</div><div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;</div><div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;            allocator,</div><div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>&#160;</div><div class="line"><a name="l08896"></a><span class="lineno"> 8896</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div><div class="line"><a name="l08897"></a><span class="lineno"> 8897</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;    }</div><div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;}</div><div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>&#160;</div><div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>&#160;{</div><div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div><div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>&#160;</div><div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div><div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160;</div><div class="line"><a name="l08911"></a><span class="lineno"> 8911</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08912"></a><span class="lineno"> 8912</span>&#160;</div><div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CreatePool(pCreateInfo, pPool);</div><div class="line"><a name="l08914"></a><span class="lineno"> 8914</span>&#160;}</div><div class="line"><a name="l08915"></a><span class="lineno"> 8915</span>&#160;</div><div class="line"><a name="l08916"></a><span class="lineno"> 8916</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a>(</div><div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l08919"></a><span class="lineno"> 8919</span>&#160;{</div><div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l08921"></a><span class="lineno"> 8921</span>&#160;</div><div class="line"><a name="l08922"></a><span class="lineno"> 8922</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div><div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>&#160;    {</div><div class="line"><a name="l08924"></a><span class="lineno"> 8924</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>&#160;    }</div><div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;</div><div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div><div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;</div><div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>&#160;</div><div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>&#160;    allocator-&gt;DestroyPool(pool);</div><div class="line"><a name="l08932"></a><span class="lineno"> 8932</span>&#160;}</div><div class="line"><a name="l08933"></a><span class="lineno"> 8933</span>&#160;</div><div class="line"><a name="l08934"></a><span class="lineno"> 8934</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a>(</div><div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>&#160;{</div><div class="line"><a name="l08939"></a><span class="lineno"> 8939</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div><div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>&#160;</div><div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;</div><div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div><div class="line"><a name="l08944"></a><span class="lineno"> 8944</span>&#160;}</div><div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>&#160;</div><div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a>(</div><div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>&#160;{</div><div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;</div><div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160;</div><div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div><div class="line"><a name="l08956"></a><span class="lineno"> 8956</span>&#160;}</div><div class="line"><a name="l08957"></a><span class="lineno"> 8957</span>&#160;</div><div class="line"><a name="l08958"></a><span class="lineno"> 8958</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;{</div><div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l08966"></a><span class="lineno"> 8966</span>&#160;</div><div class="line"><a name="l08967"></a><span class="lineno"> 8967</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div><div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;</div><div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>&#160;</div><div class="line"><a name="l08971"></a><span class="lineno"> 8971</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>&#160;        *pVkMemoryRequirements,</div><div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div><div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div><div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div><div class="line"><a name="l08979"></a><span class="lineno"> 8979</span>&#160;        pAllocation);</div><div class="line"><a name="l08980"></a><span class="lineno"> 8980</span>&#160;</div><div class="line"><a name="l08981"></a><span class="lineno"> 8981</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>&#160;    {</div><div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>&#160;    }</div><div class="line"><a name="l08985"></a><span class="lineno"> 8985</span>&#160;</div><div class="line"><a name="l08986"></a><span class="lineno"> 8986</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160;}</div><div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;</div><div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>&#160;{</div><div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;</div><div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div><div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;</div><div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09001"></a><span class="lineno"> 9001</span>&#160;</div><div class="line"><a name="l09002"></a><span class="lineno"> 9002</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div><div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>&#160;        prefersDedicatedAllocation);</div><div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>&#160;</div><div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>&#160;        vkMemReq,</div><div class="line"><a name="l09011"></a><span class="lineno"> 9011</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>&#160;        pAllocation);</div><div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>&#160;</div><div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l09020"></a><span class="lineno"> 9020</span>&#160;    {</div><div class="line"><a name="l09021"></a><span class="lineno"> 9021</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>&#160;    }</div><div class="line"><a name="l09023"></a><span class="lineno"> 9023</span>&#160;</div><div class="line"><a name="l09024"></a><span class="lineno"> 9024</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>&#160;}</div><div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>&#160;</div><div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>&#160;    VkImage image,</div><div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pCreateInfo,</div><div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>&#160;{</div><div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>&#160;</div><div class="line"><a name="l09036"></a><span class="lineno"> 9036</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div><div class="line"><a name="l09037"></a><span class="lineno"> 9037</span>&#160;</div><div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>&#160;</div><div class="line"><a name="l09040"></a><span class="lineno"> 9040</span>&#160;    VkResult result = AllocateMemoryForImage(</div><div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>&#160;        allocator,</div><div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;        image,</div><div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;        pCreateInfo,</div><div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div><div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;        pAllocation);</div><div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>&#160;</div><div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>&#160;    {</div><div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>&#160;    }</div><div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>&#160;</div><div class="line"><a name="l09052"></a><span class="lineno"> 9052</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160;}</div><div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;</div><div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a>(</div><div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;{</div><div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>&#160;</div><div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div><div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>&#160;</div><div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>&#160;</div><div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>&#160;    allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l09066"></a><span class="lineno"> 9066</span>&#160;}</div><div class="line"><a name="l09067"></a><span class="lineno"> 9067</span>&#160;</div><div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a>(</div><div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>&#160;{</div><div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div><div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>&#160;</div><div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09076"></a><span class="lineno"> 9076</span>&#160;</div><div class="line"><a name="l09077"></a><span class="lineno"> 9077</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div><div class="line"><a name="l09078"></a><span class="lineno"> 9078</span>&#160;}</div><div class="line"><a name="l09079"></a><span class="lineno"> 9079</span>&#160;</div><div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;{</div><div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160;</div><div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>&#160;</div><div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div><div class="line"><a name="l09089"></a><span class="lineno"> 9089</span>&#160;}</div><div class="line"><a name="l09090"></a><span class="lineno"> 9090</span>&#160;</div><div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a>(</div><div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09093"></a><span class="lineno"> 9093</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>&#160;{</div><div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>&#160;</div><div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>&#160;</div><div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div><div class="line"><a name="l09101"></a><span class="lineno"> 9101</span>&#160;}</div><div class="line"><a name="l09102"></a><span class="lineno"> 9102</span>&#160;</div><div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a>(</div><div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l09106"></a><span class="lineno"> 9106</span>&#160;{</div><div class="line"><a name="l09107"></a><span class="lineno"> 9107</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div><div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>&#160;</div><div class="line"><a name="l09109"></a><span class="lineno"> 9109</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div><div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>&#160;</div><div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div><div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>&#160;}</div><div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>&#160;</div><div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>&#160;    <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>&#160;{</div><div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div><div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>&#160;</div><div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>&#160;</div><div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;Map(allocation, ppData);</div><div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;}</div><div class="line"><a name="l09125"></a><span class="lineno"> 9125</span>&#160;</div><div class="line"><a name="l09126"></a><span class="lineno"> 9126</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a>(</div><div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>&#160;{</div><div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>&#160;</div><div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09133"></a><span class="lineno"> 9133</span>&#160;</div><div class="line"><a name="l09134"></a><span class="lineno"> 9134</span>&#160;    allocator-&gt;Unmap(allocation);</div><div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;}</div><div class="line"><a name="l09136"></a><span class="lineno"> 9136</span>&#160;</div><div class="line"><a name="l09137"></a><span class="lineno"> 9137</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a> *pDefragmentationInfo,</div><div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>&#160;{</div><div class="line"><a name="l09145"></a><span class="lineno"> 9145</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocations);</div><div class="line"><a name="l09146"></a><span class="lineno"> 9146</span>&#160;</div><div class="line"><a name="l09147"></a><span class="lineno"> 9147</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragment&quot;</span>);</div><div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;</div><div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09150"></a><span class="lineno"> 9150</span>&#160;</div><div class="line"><a name="l09151"></a><span class="lineno"> 9151</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;Defragment(pAllocations, allocationCount, pAllocationsChanged, pDefragmentationInfo, pDefragmentationStats);</div><div class="line"><a name="l09152"></a><span class="lineno"> 9152</span>&#160;}</div><div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>&#160;</div><div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>&#160;    VkBuffer buffer)</div><div class="line"><a name="l09158"></a><span class="lineno"> 9158</span>&#160;{</div><div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div><div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>&#160;</div><div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div><div class="line"><a name="l09162"></a><span class="lineno"> 9162</span>&#160;</div><div class="line"><a name="l09163"></a><span class="lineno"> 9163</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09164"></a><span class="lineno"> 9164</span>&#160;</div><div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, buffer);</div><div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>&#160;}</div><div class="line"><a name="l09167"></a><span class="lineno"> 9167</span>&#160;</div><div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;    VkImage image)</div><div class="line"><a name="l09172"></a><span class="lineno"> 9172</span>&#160;{</div><div class="line"><a name="l09173"></a><span class="lineno"> 9173</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div><div class="line"><a name="l09174"></a><span class="lineno"> 9174</span>&#160;</div><div class="line"><a name="l09175"></a><span class="lineno"> 9175</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div><div class="line"><a name="l09176"></a><span class="lineno"> 9176</span>&#160;</div><div class="line"><a name="l09177"></a><span class="lineno"> 9177</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>&#160;</div><div class="line"><a name="l09179"></a><span class="lineno"> 9179</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, image);</div><div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>&#160;}</div><div class="line"><a name="l09181"></a><span class="lineno"> 9181</span>&#160;</div><div class="line"><a name="l09182"></a><span class="lineno"> 9182</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l09187"></a><span class="lineno"> 9187</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;{</div><div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div><div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>&#160;    </div><div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div><div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>&#160;    </div><div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09195"></a><span class="lineno"> 9195</span>&#160;</div><div class="line"><a name="l09196"></a><span class="lineno"> 9196</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>&#160;</div><div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div><div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>&#160;        pBufferCreateInfo,</div><div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>&#160;        pBuffer);</div><div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l09206"></a><span class="lineno"> 9206</span>&#160;    {</div><div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div><div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div><div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l09213"></a><span class="lineno"> 9213</span>&#160;</div><div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>&#160;         <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div><div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;         <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div><div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0)</div><div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>&#160;        {</div><div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div><div class="line"><a name="l09220"></a><span class="lineno"> 9220</span>&#160;        }</div><div class="line"><a name="l09221"></a><span class="lineno"> 9221</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div><div class="line"><a name="l09222"></a><span class="lineno"> 9222</span>&#160;        {</div><div class="line"><a name="l09223"></a><span class="lineno"> 9223</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div><div class="line"><a name="l09225"></a><span class="lineno"> 9225</span>&#160;        }</div><div class="line"><a name="l09226"></a><span class="lineno"> 9226</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div><div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>&#160;        {</div><div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div><div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>&#160;        }</div><div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>&#160;</div><div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div><div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>&#160;            vkMemReq,</div><div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;            pAllocation);</div><div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>&#160;        {</div><div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div><div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160;            res = allocator-&gt;BindBufferMemory(*pAllocation, *pBuffer);</div><div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;            {</div><div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>&#160;                {</div><div class="line"><a name="l09251"></a><span class="lineno"> 9251</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;                }</div><div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>&#160;            }</div><div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09260"></a><span class="lineno"> 9260</span>&#160;        }</div><div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>&#160;    }</div><div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>&#160;}</div><div class="line"><a name="l09267"></a><span class="lineno"> 9267</span>&#160;</div><div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a>(</div><div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160;{</div><div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div><div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>&#160;    {</div><div class="line"><a name="l09275"></a><span class="lineno"> 9275</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>&#160;</div><div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div><div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>&#160;</div><div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;</div><div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>&#160;        </div><div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>&#160;    }</div><div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>&#160;}</div><div class="line"><a name="l09286"></a><span class="lineno"> 9286</span>&#160;</div><div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>* pAllocationCreateInfo,</div><div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l09294"></a><span class="lineno"> 9294</span>&#160;{</div><div class="line"><a name="l09295"></a><span class="lineno"> 9295</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div><div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>&#160;</div><div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div><div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>&#160;</div><div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>&#160;</div><div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>&#160;    *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>&#160;</div><div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div><div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div><div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;        pImageCreateInfo,</div><div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>&#160;        pImage);</div><div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>&#160;    {</div><div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div><div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div><div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div><div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>&#160;        </div><div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div><div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>&#160;        res = AllocateMemoryForImage(allocator, *pImage, pAllocationCreateInfo, suballocType, pAllocation);</div><div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l09319"></a><span class="lineno"> 9319</span>&#160;        {</div><div class="line"><a name="l09320"></a><span class="lineno"> 9320</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div><div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>&#160;            res = allocator-&gt;BindImageMemory(*pAllocation, *pImage);</div><div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>&#160;            {</div><div class="line"><a name="l09324"></a><span class="lineno"> 9324</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l09326"></a><span class="lineno"> 9326</span>&#160;                {</div><div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l09328"></a><span class="lineno"> 9328</span>&#160;                }</div><div class="line"><a name="l09329"></a><span class="lineno"> 9329</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160;            }</div><div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>&#160;            *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>&#160;        }</div><div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;        *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09340"></a><span class="lineno"> 9340</span>&#160;    }</div><div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l09342"></a><span class="lineno"> 9342</span>&#160;}</div><div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>&#160;</div><div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a>(</div><div class="line"><a name="l09345"></a><span class="lineno"> 9345</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>&#160;    VkImage image,</div><div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>&#160;{</div><div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div><div class="line"><a name="l09350"></a><span class="lineno"> 9350</span>&#160;    {</div><div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;</div><div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div><div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>&#160;</div><div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>&#160;</div><div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l09358"></a><span class="lineno"> 9358</span>&#160;</div><div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>&#160;    }</div><div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>&#160;}</div><div class="line"><a name="l09362"></a><span class="lineno"> 9362</span>&#160;</div><div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>&#160;<span class="preprocessor">#endif // #ifdef VMA_IMPLEMENTATION</span></div><div class="ttc" id="struct_vma_vulkan_functions_html_a77b7a74082823e865dd6546623468f96"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">VmaVulkanFunctions::vkGetPhysicalDeviceProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1153</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f">VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT</a></div><div class="ttdoc">Set this flag if the allocation should have its own memory block. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1415</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a9bc268595cb33f6ec4d519cfce81ff45"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9bc268595cb33f6ec4d519cfce81ff45">vmaUnmapMemory</a></div><div class="ttdeci">void vmaUnmapMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Unmaps memory represented by given allocation, mapped previously using vmaMapMemory(). </div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:921</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a08230f04ae6ccf8a78150a9e829a7156"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">VmaAllocatorCreateInfo::physicalDevice</a></div><div class="ttdeci">VkPhysicalDevice physicalDevice</div><div class="ttdoc">Vulkan physical device. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1178</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a6aced90fcc7b39882b6654a740a0b9bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a></div><div class="ttdeci">VkResult vmaDefragment(VmaAllocator allocator, VmaAllocation *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const VmaDefragmentationInfo *pDefragmentationInfo, VmaDefragmentationStats *pDefragmentationStats)</div><div class="ttdoc">Compacts memory by moving allocations. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_ae8084315a25006271a2edfc3a447519f"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">VmaVulkanFunctions::vkCreateBuffer</a></div><div class="ttdeci">PFN_vkCreateBuffer vkCreateBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:906</div></div>
+<div class="ttc" id="struct_vma_allocation_html"><div class="ttname"><a href="struct_vma_allocation.html">VmaAllocation</a></div><div class="ttdoc">Represents single memory allocation. </div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_ae8084315a25006271a2edfc3a447519f"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">VmaVulkanFunctions::vkCreateBuffer</a></div><div class="ttdeci">PFN_vkCreateBuffer vkCreateBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1163</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a3104eb30d8122c84dd8541063f145288"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a></div><div class="ttdeci">void vmaFreeStatsString(VmaAllocator allocator, char *pStatsString)</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a732be855fb4a7c248e6853d928a729af"><div class="ttname"><a href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a></div><div class="ttdeci">struct VmaStats VmaStats</div><div class="ttdoc">General statistics from current state of Allocator. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1107</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_ab5c1f38dea3a2cf00dc9eb4f57218c49"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">VmaVulkanFunctions::vkMapMemory</a></div><div class="ttdeci">PFN_vkMapMemory vkMapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:900</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_ae0bfb7dfdf79a76ffefc9a94677a2f67"><div class="ttname"><a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">VmaAllocationInfo::deviceMemory</a></div><div class="ttdeci">VkDeviceMemory deviceMemory</div><div class="ttdoc">Handle to Vulkan memory object. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1456</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a392ea2ecbaff93f91a7c49f735ad4346"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo::flags</a></div><div class="ttdeci">VmaAllocatorCreateFlags flags</div><div class="ttdoc">Flags for created allocator. Use VmaAllocatorCreateFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:918</div></div>
-<div class="ttc" id="struct_vma_defragmentation_info_html_aa7c7304e13c71f604c907196c4e28fbc"><div class="ttname"><a href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">VmaDefragmentationInfo::maxAllocationsToMove</a></div><div class="ttdeci">uint32_t maxAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to different place. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1631</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a></div><div class="ttdoc">Use this flag if you always allocate only buffers and linear images or only optimal images out of thi...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1326</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7">VMA_MEMORY_USAGE_GPU_ONLY</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1372</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_ab5c1f38dea3a2cf00dc9eb4f57218c49"><div class="ttname"><a href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">VmaVulkanFunctions::vkMapMemory</a></div><div class="ttdeci">PFN_vkMapMemory vkMapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1157</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_ae0bfb7dfdf79a76ffefc9a94677a2f67"><div class="ttname"><a href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">VmaAllocationInfo::deviceMemory</a></div><div class="ttdeci">VkDeviceMemory deviceMemory</div><div class="ttdoc">Handle to Vulkan memory object. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1745</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a392ea2ecbaff93f91a7c49f735ad4346"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo::flags</a></div><div class="ttdeci">VmaAllocatorCreateFlags flags</div><div class="ttdoc">Flags for created allocator. Use VmaAllocatorCreateFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1175</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info_html_aa7c7304e13c71f604c907196c4e28fbc"><div class="ttname"><a href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">VmaDefragmentationInfo::maxAllocationsToMove</a></div><div class="ttdeci">uint32_t maxAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to different place. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1944</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2">VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT</a></div><div class="ttdoc">Use this flag if you always allocate only buffers and linear images or only optimal images out of thi...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1591</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a736bd6cbda886f36c891727e73bd4024"><div class="ttname"><a href="vk__mem__alloc_8h.html#a736bd6cbda886f36c891727e73bd4024">vmaMakePoolAllocationsLost</a></div><div class="ttdeci">void vmaMakePoolAllocationsLost(VmaAllocator allocator, VmaPool pool, size_t *pLostAllocationCount)</div><div class="ttdoc">Marks all allocations in given pool as lost if they are not used in current frame or VmaPoolCreateInf...</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_a326807b2de2b0931cee4ed9a5f2e420c"><div class="ttname"><a href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">VmaPoolStats::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Total amount of VkDeviceMemory allocated from Vulkan for this pool, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1380</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1187</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_acfe6863e160722c2c1bbcf7573fddc4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocatorCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:889</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1225</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1134</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a6e409087e3be55400d0e4ccbe43c608d"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">VmaAllocatorCreateInfo::pAllocationCallbacks</a></div><div class="ttdeci">const VkAllocationCallbacks * pAllocationCallbacks</div><div class="ttdoc">Custom CPU memory allocation callbacks. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:930</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_a326807b2de2b0931cee4ed9a5f2e420c"><div class="ttname"><a href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">VmaPoolStats::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Total amount of VkDeviceMemory allocated from Vulkan for this pool, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1645</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1452</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_acfe6863e160722c2c1bbcf7573fddc4d"><div class="ttname"><a href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocatorCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1146</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a7fe8d81a1ad10b2a2faacacee5b15d6d"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">VmaAllocationCreateInfo::preferredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags preferredFlags</div><div class="ttdoc">Flags that preferably should be set in a memory type chosen for an allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1490</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e">VMA_MEMORY_USAGE_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1399</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a6e409087e3be55400d0e4ccbe43c608d"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">VmaAllocatorCreateInfo::pAllocationCallbacks</a></div><div class="ttdeci">const VkAllocationCallbacks * pAllocationCallbacks</div><div class="ttdoc">Custom CPU memory allocation callbacks. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1187</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a333b61c1788cb23559177531e6a93ca3"><div class="ttname"><a href="vk__mem__alloc_8h.html#a333b61c1788cb23559177531e6a93ca3">vmaCalculateStats</a></div><div class="ttdeci">void vmaCalculateStats(VmaAllocator allocator, VmaStats *pStats)</div><div class="ttdoc">Retrieves statistics from current state of the Allocator. </div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a3dc197be3227da7338b1643f70db36bd"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">VmaAllocatorCreateInfo::pVulkanFunctions</a></div><div class="ttdeci">const VmaVulkanFunctions * pVulkanFunctions</div><div class="ttdoc">Pointers to Vulkan functions. Can be null if you leave define VMA_STATIC_VULKAN_FUNCTIONS 1...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:983</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:915</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a3dc197be3227da7338b1643f70db36bd"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">VmaAllocatorCreateInfo::pVulkanFunctions</a></div><div class="ttdeci">const VmaVulkanFunctions * pVulkanFunctions</div><div class="ttdoc">Pointers to Vulkan functions. Can be null if you leave define VMA_STATIC_VULKAN_FUNCTIONS 1...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1240</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html"><div class="ttname"><a href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a></div><div class="ttdoc">Description of a Allocator to be created. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1172</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_aa8d164061c88f22fb1fd3c8f3534bc1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vmaDestroyAllocator</a></div><div class="ttdeci">void vmaDestroyAllocator(VmaAllocator allocator)</div><div class="ttdoc">Destroys allocator object. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a></div><div class="ttdeci">VmaAllocationCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaAllocationCreateInfo::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1138</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation. </div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a17e9733a5ecd76287d4db6e66f71f50c"><div class="ttname"><a href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">VmaStatInfo::allocationSizeMax</a></div><div class="ttdeci">VkDeviceSize allocationSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1048</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a1338d96a128a5ade648b8d934907c637"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">VmaVulkanFunctions::vkBindImageMemory</a></div><div class="ttdeci">PFN_vkBindImageMemory vkBindImageMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:903</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a1859d290aca2cd582d8dc25922092669"><div class="ttname"><a href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">VmaStatInfo::unusedBytes</a></div><div class="ttdeci">VkDeviceSize unusedBytes</div><div class="ttdoc">Total number of bytes occupied by unused ranges. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1047</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a9cdcdc1e2b2ea7c571f7d27e30ba6875"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a9cdcdc1e2b2ea7c571f7d27e30ba6875">VmaVulkanFunctions::vkGetImageMemoryRequirements2KHR</a></div><div class="ttdeci">PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:911</div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html"><div class="ttname"><a href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></div><div class="ttdoc">Statistics returned by function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1635</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a></div><div class="ttdeci">VmaAllocationCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaAllocationCreateInfo::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1403</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a86dd08aba8633bfa4ad0df2e76481d8b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86dd08aba8633bfa4ad0df2e76481d8b">vmaGetAllocationInfo</a></div><div class="ttdeci">void vmaGetAllocationInfo(VmaAllocator allocator, VmaAllocation allocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Returns current information about specified allocation and atomically marks it as used in current fra...</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a17e9733a5ecd76287d4db6e66f71f50c"><div class="ttname"><a href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">VmaStatInfo::allocationSizeMax</a></div><div class="ttdeci">VkDeviceSize allocationSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1305</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a1338d96a128a5ade648b8d934907c637"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">VmaVulkanFunctions::vkBindImageMemory</a></div><div class="ttdeci">PFN_vkBindImageMemory vkBindImageMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1160</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a1859d290aca2cd582d8dc25922092669"><div class="ttname"><a href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">VmaStatInfo::unusedBytes</a></div><div class="ttdeci">VkDeviceSize unusedBytes</div><div class="ttdoc">Total number of bytes occupied by unused ranges. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1304</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a9cdcdc1e2b2ea7c571f7d27e30ba6875"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a9cdcdc1e2b2ea7c571f7d27e30ba6875">VmaVulkanFunctions::vkGetImageMemoryRequirements2KHR</a></div><div class="ttdeci">PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1168</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html"><div class="ttname"><a href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></div><div class="ttdoc">Statistics returned by function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1948</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a11f0fbc034fa81a4efedd73d61ce7568"><div class="ttname"><a href="vk__mem__alloc_8h.html#a11f0fbc034fa81a4efedd73d61ce7568">vmaFreeMemory</a></div><div class="ttdeci">void vmaFreeMemory(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Frees memory previously allocated using vmaAllocateMemory(), vmaAllocateMemoryForBuffer(), or vmaAllocateMemoryForImage(). </div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a21ea188dd212b8171cb9ecbed4a2a3a7"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">VmaAllocatorCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:947</div></div>
-<div class="ttc" id="struct_vma_stats_html_a2e8f5b3353f2fefef3c27f29e245a1f9"><div class="ttname"><a href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">VmaStats::total</a></div><div class="ttdeci">VmaStatInfo total</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1057</div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html_a0113f1877904a5d1ee8f409216ff276b"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">VmaDefragmentationStats::deviceMemoryBlocksFreed</a></div><div class="ttdeci">uint32_t deviceMemoryBlocksFreed</div><div class="ttdoc">Number of empty VkDeviceMemory objects that have been released to the system. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1643</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1209</div></div>
-<div class="ttc" id="struct_vma_defragmentation_info_html_acb311c940a777270e67e1b81c5ab6a1d"><div class="ttname"><a href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">VmaDefragmentationInfo::maxBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1626</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a5b92901df89a4194b0d12f6071d4d143"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">VmaVulkanFunctions::vkGetBufferMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:904</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ab6a6477cda1ce775b30bde96d766203b"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</div><div class="ttdoc">Callback function called after successful vkAllocateMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:831</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:924</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1334</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1328</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_aac76d113a6a5ccbb09fea00fb25fd18f"><div class="ttname"><a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">VmaAllocationInfo::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Size of this allocation, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1466</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a21ea188dd212b8171cb9ecbed4a2a3a7"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">VmaAllocatorCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1204</div></div>
+<div class="ttc" id="struct_vma_stats_html_a2e8f5b3353f2fefef3c27f29e245a1f9"><div class="ttname"><a href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">VmaStats::total</a></div><div class="ttdeci">VmaStatInfo total</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1314</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_a0113f1877904a5d1ee8f409216ff276b"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">VmaDefragmentationStats::deviceMemoryBlocksFreed</a></div><div class="ttdeci">uint32_t deviceMemoryBlocksFreed</div><div class="ttdoc">Number of empty VkDeviceMemory objects that have been released to the system. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1956</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_add09658ac14fe290ace25470ddd6d41b"><div class="ttname"><a href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo::flags</a></div><div class="ttdeci">VmaAllocationCreateFlags flags</div><div class="ttdoc">Use VmaAllocationCreateFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1474</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info_html_acb311c940a777270e67e1b81c5ab6a1d"><div class="ttname"><a href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">VmaDefragmentationInfo::maxBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1939</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a5b92901df89a4194b0d12f6071d4d143"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">VmaVulkanFunctions::vkGetBufferMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1161</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ab6a6477cda1ce775b30bde96d766203b"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b">PFN_vmaAllocateDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaAllocateDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</div><div class="ttdoc">Callback function called after successful vkAllocateMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1088</div></div>
+<div class="ttc" id="struct_vma_allocator_html"><div class="ttname"><a href="struct_vma_allocator.html">VmaAllocator</a></div><div class="ttdoc">Represents main object of this library initialized. </div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_ad924ddd77b04039c88d0c09b0ffcd500"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">VmaAllocatorCreateInfo::device</a></div><div class="ttdeci">VkDevice device</div><div class="ttdoc">Vulkan device. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1181</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a6b0929b914b60cf2d45cac4bf3547470"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a></div><div class="ttdeci">VkResult vmaBindBufferMemory(VmaAllocator allocator, VmaAllocation allocation, VkBuffer buffer)</div><div class="ttdoc">Binds buffer to allocation. </div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html"><div class="ttname"><a href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a></div><div class="ttdoc">Describes parameter of created VmaPool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1599</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec">VMA_POOL_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1593</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_aac76d113a6a5ccbb09fea00fb25fd18f"><div class="ttname"><a href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">VmaAllocationInfo::size</a></div><div class="ttdeci">VkDeviceSize size</div><div class="ttdoc">Size of this allocation, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1755</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a8701444752eb5de4464adb5a2b514bca"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8701444752eb5de4464adb5a2b514bca">vmaGetMemoryTypeProperties</a></div><div class="ttdeci">void vmaGetMemoryTypeProperties(VmaAllocator allocator, uint32_t memoryTypeIndex, VkMemoryPropertyFlags *pFlags)</div><div class="ttdoc">Given Memory Type Index, returns Property Flags of this memory type. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_acc798589736f0becb317fc2196c1d8b9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">VmaVulkanFunctions::vkUnmapMemory</a></div><div class="ttdeci">PFN_vkUnmapMemory vkUnmapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:901</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1246</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_ad8006fb803185c0a699d30f3e9a865ae"><div class="ttname"><a href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">VmaPoolCreateInfo::minBlockCount</a></div><div class="ttdeci">size_t minBlockCount</div><div class="ttdoc">Minimum number of blocks to be always allocated in this pool, even if they stay empty. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1350</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_ad1924eb54fffa45e9e0e65670c8fe5eb"><div class="ttname"><a href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats::allocationCount</a></div><div class="ttdeci">size_t allocationCount</div><div class="ttdoc">Number of VmaAllocation objects created from this pool that were not destroyed or lost...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1386</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_acc798589736f0becb317fc2196c1d8b9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">VmaVulkanFunctions::vkUnmapMemory</a></div><div class="ttdeci">PFN_vkUnmapMemory vkUnmapMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1158</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a8259e85c272683434f4abb4ddddffe19"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">VmaAllocationCreateInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1511</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_ad8006fb803185c0a699d30f3e9a865ae"><div class="ttname"><a href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">VmaPoolCreateInfo::minBlockCount</a></div><div class="ttdeci">size_t minBlockCount</div><div class="ttdoc">Minimum number of blocks to be always allocated in this pool, even if they stay empty. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1615</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_ad1924eb54fffa45e9e0e65670c8fe5eb"><div class="ttname"><a href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats::allocationCount</a></div><div class="ttdeci">size_t allocationCount</div><div class="ttdoc">Number of VmaAllocation objects created from this pool that were not destroyed or lost...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1651</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a97064a1a271b0061ebfc3a079862d0c5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a></div><div class="ttdeci">struct VmaVulkanFunctions VmaVulkanFunctions</div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:887</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1337</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c">VMA_ALLOCATOR_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1144</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_a596fa76b685d3f1f688f84a709a5b319"><div class="ttname"><a href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">VmaPoolCreateInfo::memoryTypeIndex</a></div><div class="ttdeci">uint32_t memoryTypeIndex</div><div class="ttdoc">Vulkan memory type index to allocate this pool from. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1602</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_aef15a94b58fbcb0fe706d5720e84a74a"><div class="ttname"><a href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndex(VmaAllocator allocator, uint32_t memoryTypeBits, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given memoryTypeBits and VmaAllocationCreateInfo. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="ttdeci">VmaMemoryUsage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1085</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cc"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="ttdeci">VmaMemoryUsage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1350</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a795e6ff02a21d5486c0565f403dd9255"><div class="ttname"><a href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a></div><div class="ttdeci">struct VmaAllocationInfo VmaAllocationInfo</div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). </div></div>
-<div class="ttc" id="struct_vma_defragmentation_info_html"><div class="ttname"><a href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></div><div class="ttdoc">Optional configuration parameters to be passed to function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1621</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info_html"><div class="ttname"><a href="struct_vma_defragmentation_info.html">VmaDefragmentationInfo</a></div><div class="ttdoc">Optional configuration parameters to be passed to function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1934</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a211706e9348dcee25a843ed4ea69bce7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a></div><div class="ttdeci">struct VmaPoolCreateInfo VmaPoolCreateInfo</div><div class="ttdoc">Describes parameter of created VmaPool. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a5485779c8f1948238fc4e92232fa65e1"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5485779c8f1948238fc4e92232fa65e1">vmaDestroyPool</a></div><div class="ttdeci">void vmaDestroyPool(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Destroys VmaPool object and frees Vulkan device memory. </div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html_ab0cb9ac0dbc106c77e384ea676422f28"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">VmaDefragmentationStats::bytesFreed</a></div><div class="ttdeci">VkDeviceSize bytesFreed</div><div class="ttdoc">Total number of bytes that have been released to the system by freeing empty VkDeviceMemory objects...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1639</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1124</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1233</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a94fc4f3a605d9880bb3c0ba2c2fc80b2"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">VmaVulkanFunctions::vkBindBufferMemory</a></div><div class="ttdeci">PFN_vkBindBufferMemory vkBindBufferMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:902</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_ab0cb9ac0dbc106c77e384ea676422f28"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">VmaDefragmentationStats::bytesFreed</a></div><div class="ttdeci">VkDeviceSize bytesFreed</div><div class="ttdoc">Total number of bytes that have been released to the system by freeing empty VkDeviceMemory objects...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1952</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67">VMA_MEMORY_USAGE_CPU_TO_GPU</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1389</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a3bf940c0271d85d6ba32a4d820075055"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">VmaAllocationCreateInfo::memoryTypeBits</a></div><div class="ttdeci">uint32_t memoryTypeBits</div><div class="ttdoc">Bitmask containing one bit set for every memory type acceptable for this allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1498</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a94fc4f3a605d9880bb3c0ba2c2fc80b2"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">VmaVulkanFunctions::vkBindBufferMemory</a></div><div class="ttdeci">PFN_vkBindBufferMemory vkBindBufferMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1159</div></div>
+<div class="ttc" id="struct_vma_pool_html"><div class="ttname"><a href="struct_vma_pool.html">VmaPool</a></div><div class="ttdoc">Represents custom memory pool. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae8bf76997b234ef68aad922616df4153"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae8bf76997b234ef68aad922616df4153">vmaGetPoolStats</a></div><div class="ttdeci">void vmaGetPoolStats(VmaAllocator allocator, VmaPool pool, VmaPoolStats *pPoolStats)</div><div class="ttdoc">Retrieves statistics of existing VmaPool object. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae67f8573a0cf20f16f0a1eecbca566a0"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a></div><div class="ttdeci">struct VmaDefragmentationInfo VmaDefragmentationInfo</div><div class="ttdoc">Optional configuration parameters to be passed to function vmaDefragment(). </div></div>
-<div class="ttc" id="struct_vma_stats_html"><div class="ttname"><a href="struct_vma_stats.html">VmaStats</a></div><div class="ttdoc">General statistics from current state of Allocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1053</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><div class="ttname"><a href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</div><div class="ttdoc">Callback function called before vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:837</div></div>
+<div class="ttc" id="struct_vma_stats_html"><div class="ttname"><a href="struct_vma_stats.html">VmaStats</a></div><div class="ttdoc">General statistics from current state of Allocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1310</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aef2545dc2e9dd4f29ab9ba6ac6fe2f49"><div class="ttname"><a href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49">PFN_vmaFreeDeviceMemoryFunction</a></div><div class="ttdeci">void(VKAPI_PTR * PFN_vmaFreeDeviceMemoryFunction)(VmaAllocator allocator, uint32_t memoryType, VkDeviceMemory memory, VkDeviceSize size)</div><div class="ttdoc">Callback function called before vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1094</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_af9147d31ffc11d62fc187bde283ed14f"><div class="ttname"><a href="vk__mem__alloc_8h.html#af9147d31ffc11d62fc187bde283ed14f">vmaSetAllocationUserData</a></div><div class="ttdeci">void vmaSetAllocationUserData(VmaAllocator allocator, VmaAllocation allocation, void *pUserData)</div><div class="ttdoc">Sets pUserData in given allocation to new value. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a5c8770ded7c59c8caac6de0c2cb00b50"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a></div><div class="ttdeci">VkResult vmaCreatePool(VmaAllocator allocator, const VmaPoolCreateInfo *pCreateInfo, VmaPool *pPool)</div><div class="ttdoc">Allocates Vulkan device memory and creates VmaPool object. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a></div><div class="ttdeci">VmaAllocatorCreateFlagBits</div><div class="ttdoc">Flags for created VmaAllocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:858</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a></div><div class="ttdeci">VmaAllocatorCreateFlagBits</div><div class="ttdoc">Flags for created VmaAllocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1115</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a3d3ca45799923aa5d138e9e5f9eb2da5"><div class="ttname"><a href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a></div><div class="ttdeci">VkResult vmaBindImageMemory(VmaAllocator allocator, VmaAllocation allocation, VkImage image)</div><div class="ttdoc">Binds image to allocation. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a810b009a788ee8aac72a25b42ffbe31c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a></div><div class="ttdeci">struct VmaStatInfo VmaStatInfo</div><div class="ttdoc">Calculated statistics of memory usage in entire allocator. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a></div><div class="ttdoc">Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:863</div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html_aefeabf130022008eadd75999478af3f9"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">VmaDefragmentationStats::allocationsMoved</a></div><div class="ttdeci">uint32_t allocationsMoved</div><div class="ttdoc">Number of allocations that have been moved to different places. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1641</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d">VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT</a></div><div class="ttdoc">Allocator and all objects created from it will not be synchronized internally, so you must guarantee ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1120</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_aefeabf130022008eadd75999478af3f9"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">VmaDefragmentationStats::allocationsMoved</a></div><div class="ttdeci">uint32_t allocationsMoved</div><div class="ttdoc">Number of allocations that have been moved to different places. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1954</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae5c9657d9e94756269145b01c05d16f1"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae5c9657d9e94756269145b01c05d16f1">vmaCreateLostAllocation</a></div><div class="ttdeci">void vmaCreateLostAllocation(VmaAllocator allocator, VmaAllocation *pAllocation)</div><div class="ttdoc">Creates new allocation that is in lost state from the beginning. </div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1220</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_ab4c8f52dd42ab01998f60f0b6acc722b"><div class="ttname"><a href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">VmaPoolStats::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdoc">Size of the largest continuous free memory region. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1396</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a9166390303ff42d783305bc31c2b6b90"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">VmaAllocationCreateInfo::requiredFlags</a></div><div class="ttdeci">VkMemoryPropertyFlags requiredFlags</div><div class="ttdoc">Flags that must be set in a Memory Type chosen for an allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1485</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_ab4c8f52dd42ab01998f60f0b6acc722b"><div class="ttname"><a href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">VmaPoolStats::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdoc">Size of the largest continuous free memory region. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1661</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_aa4fee7eb5253377599ef4fd38c93c2a0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa4fee7eb5253377599ef4fd38c93c2a0">vmaBuildStatsString</a></div><div class="ttdeci">void vmaBuildStatsString(VmaAllocator allocator, char **ppStatsString, VkBool32 detailedMap)</div><div class="ttdoc">Builds and returns statistics as string in JSON format. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a60d25c33bba06bb8592e6875cbaa9830"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">VmaVulkanFunctions::vkGetPhysicalDeviceMemoryProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:897</div></div>
-<div class="ttc" id="struct_vma_stat_info_html"><div class="ttname"><a href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="ttdoc">Calculated statistics of memory usage in entire allocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1036</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_aa4265160536cdb9be821b7686c16c676"><div class="ttname"><a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo::blockSize</a></div><div class="ttdeci">VkDeviceSize blockSize</div><div class="ttdoc">Size of a single VkDeviceMemory block to be allocated as part of this pool, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1345</div></div>
-<div class="ttc" id="struct_vma_device_memory_callbacks_html"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a></div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:850</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a60d25c33bba06bb8592e6875cbaa9830"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">VmaVulkanFunctions::vkGetPhysicalDeviceMemoryProperties</a></div><div class="ttdeci">PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1154</div></div>
+<div class="ttc" id="struct_vma_stat_info_html"><div class="ttname"><a href="struct_vma_stat_info.html">VmaStatInfo</a></div><div class="ttdoc">Calculated statistics of memory usage in entire allocator. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1293</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_aa4265160536cdb9be821b7686c16c676"><div class="ttname"><a href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">VmaPoolCreateInfo::blockSize</a></div><div class="ttdeci">VkDeviceSize blockSize</div><div class="ttdoc">Size of a single VkDeviceMemory block to be allocated as part of this pool, in bytes. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1610</div></div>
+<div class="ttc" id="struct_vma_device_memory_callbacks_html"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a></div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1107</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ac72ee55598617e8eecca384e746bab51"><div class="ttname"><a href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a></div><div class="ttdeci">VkResult vmaCreateBuffer(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkBuffer *pBuffer, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1194</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_aedeba931324f16589cd2416c0d2dd0d4"><div class="ttname"><a href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">VmaStatInfo::unusedRangeSizeMin</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1049</div></div>
-<div class="ttc" id="struct_vma_device_memory_callbacks_html_abe8a3328bbc916f6f712fdb6b299444c"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">VmaDeviceMemoryCallbacks::pfnFree</a></div><div class="ttdeci">PFN_vmaFreeDeviceMemoryFunction pfnFree</div><div class="ttdoc">Optional, can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:854</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_a8405139f63d078340ae74513a59f5446"><div class="ttname"><a href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo::flags</a></div><div class="ttdeci">VmaPoolCreateFlags flags</div><div class="ttdoc">Use combination of VmaPoolCreateFlagBits. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1340</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1133</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1459</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_aedeba931324f16589cd2416c0d2dd0d4"><div class="ttname"><a href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">VmaStatInfo::unusedRangeSizeMin</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1306</div></div>
+<div class="ttc" id="struct_vma_device_memory_callbacks_html_abe8a3328bbc916f6f712fdb6b299444c"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c">VmaDeviceMemoryCallbacks::pfnFree</a></div><div class="ttdeci">PFN_vmaFreeDeviceMemoryFunction pfnFree</div><div class="ttdoc">Optional, can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1111</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_a8405139f63d078340ae74513a59f5446"><div class="ttname"><a href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo::flags</a></div><div class="ttdeci">VmaPoolCreateFlags flags</div><div class="ttdoc">Use combination of VmaPoolCreateFlagBits. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1605</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27">VMA_MEMORY_USAGE_GPU_TO_CPU</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1398</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a2e5612d871d64c5624087b837a338c34"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a></div><div class="ttdeci">struct VmaPoolStats VmaPoolStats</div><div class="ttdoc">Describes parameter of existing VmaPool. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a02a94f25679275851a53e82eacbcfc73"><div class="ttname"><a href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a></div><div class="ttdeci">VkResult vmaCreateImage(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, VkImage *pImage, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaCreateBuffer(). </div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1215</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1206</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_accb8b06b1f677d858cb9af20705fa910"><div class="ttname"><a href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">VmaAllocationCreateInfo::usage</a></div><div class="ttdeci">VmaMemoryUsage usage</div><div class="ttdoc">Intended usage of memory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1480</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html"><div class="ttname"><a href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1471</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a088da83d8eaf3ce9056d9ea0b981d472"><div class="ttname"><a href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForImageInfo(VmaAllocator allocator, const VkImageCreateInfo *pImageCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkImageCreateInfo and VmaAllocationCreateInfo. </div></div>
-<div class="ttc" id="struct_vma_stat_info_html_abc4bb7cd611900778464c56e50c970a4"><div class="ttname"><a href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">VmaStatInfo::blockCount</a></div><div class="ttdeci">uint32_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory Vulkan memory blocks allocated. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1039</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a4c658701778564d62034255b5dda91b4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">VmaVulkanFunctions::vkFreeMemory</a></div><div class="ttdeci">PFN_vkFreeMemory vkFreeMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:899</div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1358</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_af1380969b5e1ea4c3184a877892d260e"><div class="ttname"><a href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a></div><div class="ttdeci">const VmaDeviceMemoryCallbacks * pDeviceMemoryCallbacks</div><div class="ttdoc">Informative callbacks for vkAllocateMemory, vkFreeMemory. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:933</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_ae4f3546ffa4d1e598b64d8e6134854f4"><div class="ttname"><a href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">VmaPoolStats::unusedRangeCount</a></div><div class="ttdeci">size_t unusedRangeCount</div><div class="ttdoc">Number of continuous memory ranges in the pool not used by any VmaAllocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1389</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a5225e5e11f8376f6a31a1791f3d6e817"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocationCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1204</div></div>
-<div class="ttc" id="struct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1239</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_abc4bb7cd611900778464c56e50c970a4"><div class="ttname"><a href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">VmaStatInfo::blockCount</a></div><div class="ttdeci">uint32_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory Vulkan memory blocks allocated. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1296</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a4c658701778564d62034255b5dda91b4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">VmaVulkanFunctions::vkFreeMemory</a></div><div class="ttdeci">PFN_vkFreeMemory vkFreeMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1156</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_ae41142f2834fcdc82baa4883c187b75c"><div class="ttname"><a href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">VmaPoolCreateInfo::maxBlockCount</a></div><div class="ttdeci">size_t maxBlockCount</div><div class="ttdoc">Maximum number of blocks that can be allocated in this pool. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1623</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_af1380969b5e1ea4c3184a877892d260e"><div class="ttname"><a href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo::pDeviceMemoryCallbacks</a></div><div class="ttdeci">const VmaDeviceMemoryCallbacks * pDeviceMemoryCallbacks</div><div class="ttdoc">Informative callbacks for vkAllocateMemory, vkFreeMemory. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1190</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_ae4f3546ffa4d1e598b64d8e6134854f4"><div class="ttname"><a href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">VmaPoolStats::unusedRangeCount</a></div><div class="ttdeci">size_t unusedRangeCount</div><div class="ttdoc">Number of continuous memory ranges in the pool not used by any VmaAllocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1654</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a5225e5e11f8376f6a31a1791f3d6e817"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a></div><div class="ttdeci">VkFlags VmaAllocationCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1469</div></div>
+<div class="ttc" id="struct_vma_allocation_create_info_html_a6272c0555cfd1fe28bff1afeb6190150"><div class="ttname"><a href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">VmaAllocationCreateInfo::pool</a></div><div class="ttdeci">VmaPool pool</div><div class="ttdoc">Pool that this allocation should be created in. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1504</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ab88db292a17974f911182543fda52d19"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab88db292a17974f911182543fda52d19">vmaGetMemoryProperties</a></div><div class="ttdeci">void vmaGetMemoryProperties(VmaAllocator allocator, const VkPhysicalDeviceMemoryProperties **ppPhysicalDeviceMemoryProperties)</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a31c192aa6cbffa33279f6d9f0c47c44b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">VmaAllocatorCreateInfo::pHeapSizeLimit</a></div><div class="ttdeci">const VkDeviceSize * pHeapSizeLimit</div><div class="ttdoc">Either NULL or a pointer to an array of limits on maximum number of bytes that can be allocated out o...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:971</div></div>
-<div class="ttc" id="struct_vma_stats_html_a13e3caf754be79352c42408756309331"><div class="ttname"><a href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">VmaStats::memoryType</a></div><div class="ttdeci">VmaStatInfo memoryType[VK_MAX_MEMORY_TYPES]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1055</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1174</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_ade8b40bd3139c04aabd2fc538a356fea"><div class="ttname"><a href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">VmaStatInfo::allocationSizeMin</a></div><div class="ttdeci">VkDeviceSize allocationSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1048</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a31c192aa6cbffa33279f6d9f0c47c44b"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b">VmaAllocatorCreateInfo::pHeapSizeLimit</a></div><div class="ttdeci">const VkDeviceSize * pHeapSizeLimit</div><div class="ttdoc">Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out o...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1228</div></div>
+<div class="ttc" id="struct_vma_stats_html_a13e3caf754be79352c42408756309331"><div class="ttname"><a href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">VmaStats::memoryType</a></div><div class="ttdeci">VmaStatInfo memoryType[VK_MAX_MEMORY_TYPES]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1312</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a></div><div class="ttdoc">Set this flag to use a memory that will be persistently mapped and retrieve pointer to it...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1439</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_ade8b40bd3139c04aabd2fc538a356fea"><div class="ttname"><a href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">VmaStatInfo::allocationSizeMin</a></div><div class="ttdeci">VkDeviceSize allocationSizeMin</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1305</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae790ab9ffaf7667fb8f62523e6897888"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a></div><div class="ttdeci">VkResult vmaFindMemoryTypeIndexForBufferInfo(VmaAllocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, const VmaAllocationCreateInfo *pAllocationCreateInfo, uint32_t *pMemoryTypeIndex)</div><div class="ttdoc">Helps to find memoryTypeIndex, given VkBufferCreateInfo and VmaAllocationCreateInfo. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a23ebe70be515b9b5010a1d691200e325"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">VmaVulkanFunctions::vkCreateImage</a></div><div class="ttdeci">PFN_vkCreateImage vkCreateImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:908</div></div>
-<div class="ttc" id="struct_vma_device_memory_callbacks_html_a4f17f7b255101e733b44d5633aceabfb"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">VmaDeviceMemoryCallbacks::pfnAllocate</a></div><div class="ttdeci">PFN_vmaAllocateDeviceMemoryFunction pfnAllocate</div><div class="ttdoc">Optional, can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:852</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a7e054606faddb07f0e8556f3ed317d45"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">VmaVulkanFunctions::vkDestroyBuffer</a></div><div class="ttdeci">PFN_vkDestroyBuffer vkDestroyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:907</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a23ebe70be515b9b5010a1d691200e325"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">VmaVulkanFunctions::vkCreateImage</a></div><div class="ttdeci">PFN_vkCreateImage vkCreateImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1165</div></div>
+<div class="ttc" id="struct_vma_device_memory_callbacks_html_a4f17f7b255101e733b44d5633aceabfb"><div class="ttname"><a href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb">VmaDeviceMemoryCallbacks::pfnAllocate</a></div><div class="ttdeci">PFN_vmaAllocateDeviceMemoryFunction pfnAllocate</div><div class="ttdoc">Optional, can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1109</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a7e054606faddb07f0e8556f3ed317d45"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">VmaVulkanFunctions::vkDestroyBuffer</a></div><div class="ttdeci">PFN_vkDestroyBuffer vkDestroyBuffer</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1164</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ad5bd1243512d099706de88168992f069"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a></div><div class="ttdeci">VkResult vmaMapMemory(VmaAllocator allocator, VmaAllocation allocation, void **ppData)</div><div class="ttdoc">Maps memory represented by given allocation and returns pointer to it. </div></div>
-<div class="ttc" id="struct_vma_pool_create_info_html_a9437e43ffbb644dbbf7fc4e50cfad6aa"><div class="ttname"><a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">VmaPoolCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1372</div></div>
+<div class="ttc" id="struct_vma_pool_create_info_html_a9437e43ffbb644dbbf7fc4e50cfad6aa"><div class="ttname"><a href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">VmaPoolCreateInfo::frameInUseCount</a></div><div class="ttdeci">uint32_t frameInUseCount</div><div class="ttdoc">Maximum number of additional frames that are in use at the same time as current frame. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1637</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a0faa3f9e5fb233d29d1e00390650febb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a></div><div class="ttdeci">VkResult vmaAllocateMemoryForImage(VmaAllocator allocator, VkImage image, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">Function similar to vmaAllocateMemoryForBuffer(). </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae0f6d1d733dded220d28134da46b4283"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a></div><div class="ttdeci">struct VmaAllocatorCreateInfo VmaAllocatorCreateInfo</div><div class="ttdoc">Description of a Allocator to be created. </div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1480</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_a8e4714298e3121cdd8b214a1ae7a637a"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo::preferredLargeHeapBlockSize</a></div><div class="ttdeci">VkDeviceSize preferredLargeHeapBlockSize</div><div class="ttdoc">Preferred size of a single VkDeviceMemory block to be allocated from large heaps &gt; 1 GiB...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:927</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a1081a039964e566c672e7a2347f9e599"><div class="ttname"><a href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">VmaStatInfo::allocationSizeAvg</a></div><div class="ttdeci">VkDeviceSize allocationSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1048</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_ab0c6c73837e5a70c749fbd4f6064895a"><div class="ttname"><a href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">VmaStatInfo::usedBytes</a></div><div class="ttdeci">VkDeviceSize usedBytes</div><div class="ttdoc">Total number of bytes occupied by all allocations. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1045</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_adc507656149c04de7ed95d0042ba2a13"><div class="ttname"><a href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13">VmaAllocationInfo::pUserData</a></div><div class="ttdeci">void * pUserData</div><div class="ttdoc">Custom general-purpose pointer that was passed as VmaAllocationCreateInfo::pUserData or set using vma...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1769</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_a8e4714298e3121cdd8b214a1ae7a637a"><div class="ttname"><a href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">VmaAllocatorCreateInfo::preferredLargeHeapBlockSize</a></div><div class="ttdeci">VkDeviceSize preferredLargeHeapBlockSize</div><div class="ttdoc">Preferred size of a single VkDeviceMemory block to be allocated from large heaps &gt; 1 GiB...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1184</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a1081a039964e566c672e7a2347f9e599"><div class="ttname"><a href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">VmaStatInfo::allocationSizeAvg</a></div><div class="ttdeci">VkDeviceSize allocationSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1305</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_ab0c6c73837e5a70c749fbd4f6064895a"><div class="ttname"><a href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">VmaStatInfo::usedBytes</a></div><div class="ttdeci">VkDeviceSize usedBytes</div><div class="ttdoc">Total number of bytes occupied by all allocations. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1302</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a5e2eb68d727cfd4df25702b027b7aa31"><div class="ttname"><a href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a></div><div class="ttdeci">struct VmaDeviceMemoryCallbacks VmaDeviceMemoryCallbacks</div><div class="ttdoc">Set of callbacks that the library will call for vkAllocateMemory and vkFreeMemory. </div></div>
-<div class="ttc" id="struct_vma_pool_stats_html"><div class="ttname"><a href="struct_vma_pool_stats.html">VmaPoolStats</a></div><div class="ttdoc">Describes parameter of existing VmaPool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1377</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_a4a3c732388dbdc7a23f9365b00825268"><div class="ttname"><a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">VmaAllocationInfo::offset</a></div><div class="ttdeci">VkDeviceSize offset</div><div class="ttdoc">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1461</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1202</div></div>
-<div class="ttc" id="struct_vma_defragmentation_stats_html_a36f9d5df2a10ba2a36b16e126d60572d"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">VmaDefragmentationStats::bytesMoved</a></div><div class="ttdeci">VkDeviceSize bytesMoved</div><div class="ttdoc">Total number of bytes that have been copied while moving allocations to different places...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1637</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html"><div class="ttname"><a href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:895</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html"><div class="ttname"><a href="struct_vma_pool_stats.html">VmaPoolStats</a></div><div class="ttdoc">Describes parameter of existing VmaPool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1642</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_a4a3c732388dbdc7a23f9365b00825268"><div class="ttname"><a href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">VmaAllocationInfo::offset</a></div><div class="ttdeci">VkDeviceSize offset</div><div class="ttdoc">Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1750</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882">VMA_ALLOCATION_CREATE_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1467</div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_a36f9d5df2a10ba2a36b16e126d60572d"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">VmaDefragmentationStats::bytesMoved</a></div><div class="ttdeci">VkDeviceSize bytesMoved</div><div class="ttdoc">Total number of bytes that have been copied while moving allocations to different places...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1950</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html"><div class="ttname"><a href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a></div><div class="ttdoc">Pointers to some Vulkan functions - a subset used by the library. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1152</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a200692051ddb34240248234f5f4c17bb"><div class="ttname"><a href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a></div><div class="ttdeci">VkResult vmaCreateAllocator(const VmaAllocatorCreateInfo *pCreateInfo, VmaAllocator *pAllocator)</div><div class="ttdoc">Creates Allocator object. </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a9d8d1b05d2b1e7e1d9b27f6f585acf9c"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a9d8d1b05d2b1e7e1d9b27f6f585acf9c">VmaVulkanFunctions::vkGetBufferMemoryRequirements2KHR</a></div><div class="ttdeci">PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:910</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_ae06129c771bfebfd6468a7f4276502a9"><div class="ttname"><a href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">VmaStatInfo::unusedRangeCount</a></div><div class="ttdeci">uint32_t unusedRangeCount</div><div class="ttdoc">Number of free ranges of memory between allocations. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1043</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1090</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a2770e325ea42e087c1b91fdf46d0292a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a></div><div class="ttdeci">VkFlags VmaPoolCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1330</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a9d8d1b05d2b1e7e1d9b27f6f585acf9c"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a9d8d1b05d2b1e7e1d9b27f6f585acf9c">VmaVulkanFunctions::vkGetBufferMemoryRequirements2KHR</a></div><div class="ttdeci">PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1167</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_ae06129c771bfebfd6468a7f4276502a9"><div class="ttname"><a href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">VmaStatInfo::unusedRangeCount</a></div><div class="ttdeci">uint32_t unusedRangeCount</div><div class="ttdoc">Number of free ranges of memory between allocations. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1300</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd">VMA_MEMORY_USAGE_UNKNOWN</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1355</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a2770e325ea42e087c1b91fdf46d0292a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a></div><div class="ttdeci">VkFlags VmaPoolCreateFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1595</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_aecabf7b6e91ea87d0316fa0a9e014fe0"><div class="ttname"><a href="vk__mem__alloc_8h.html#aecabf7b6e91ea87d0316fa0a9e014fe0">vmaGetPhysicalDeviceProperties</a></div><div class="ttdeci">void vmaGetPhysicalDeviceProperties(VmaAllocator allocator, const VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a537741e4d5cdddc1c0ab95ec650afaff"><div class="ttname"><a href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">VmaStatInfo::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of VmaAllocation allocation objects allocated. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1041</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a475f6f49f8debe4d10800592606d53f4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">VmaVulkanFunctions::vkGetImageMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:905</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a90b898227039b1dcb3520f6e91f09ffa"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">VmaVulkanFunctions::vkDestroyImage</a></div><div class="ttdeci">PFN_vkDestroyImage vkDestroyImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:909</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a></div><div class="ttdoc">Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1161</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1117</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1475</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a537741e4d5cdddc1c0ab95ec650afaff"><div class="ttname"><a href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">VmaStatInfo::allocationCount</a></div><div class="ttdeci">uint32_t allocationCount</div><div class="ttdoc">Number of VmaAllocation allocation objects allocated. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1298</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a475f6f49f8debe4d10800592606d53f4"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">VmaVulkanFunctions::vkGetImageMemoryRequirements</a></div><div class="ttdeci">PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1162</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a90b898227039b1dcb3520f6e91f09ffa"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">VmaVulkanFunctions::vkDestroyImage</a></div><div class="ttdeci">PFN_vkDestroyImage vkDestroyImage</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1166</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff">VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT</a></div><div class="ttdoc">Set this flag to only try to allocate from existing VkDeviceMemory blocks and never create new such b...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1426</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"><div class="ttname"><a href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">VMA_MEMORY_USAGE_CPU_ONLY</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1382</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_a5eeffbe2d2f30f53370ff14aefbadbe2"><div class="ttname"><a href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">VmaAllocationInfo::pMappedData</a></div><div class="ttdeci">void * pMappedData</div><div class="ttdoc">Pointer to the beginning of this allocation as mapped data. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1764</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ae50d2cb3b4a3bfd4dd40987234e50e7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ae50d2cb3b4a3bfd4dd40987234e50e7e">vmaDestroyImage</a></div><div class="ttdeci">void vmaDestroyImage(VmaAllocator allocator, VkImage image, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan image and frees allocated memory. </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a></div><div class="ttdoc">Enables usage of VK_KHR_dedicated_allocation extension. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:885</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a></div><div class="ttdoc">Enables usage of VK_KHR_dedicated_allocation extension. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1142</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ab0f9b06441c840fee560de4a2967f8c9"><div class="ttname"><a href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a></div><div class="ttdeci">struct VmaDefragmentationStats VmaDefragmentationStats</div><div class="ttdoc">Statistics returned by function vmaDefragment(). </div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a2943bf99dfd784a0e8f599d987e22e6c"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">VmaVulkanFunctions::vkAllocateMemory</a></div><div class="ttdeci">PFN_vkAllocateMemory vkAllocateMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:898</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1442</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a2943bf99dfd784a0e8f599d987e22e6c"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">VmaVulkanFunctions::vkAllocateMemory</a></div><div class="ttdeci">PFN_vkAllocateMemory vkAllocateMemory</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1155</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html"><div class="ttname"><a href="struct_vma_allocation_info.html">VmaAllocationInfo</a></div><div class="ttdoc">Parameters of VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1731</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_abf28077dbf82d0908b8acbe8ee8dd9b8"><div class="ttname"><a href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a></div><div class="ttdeci">VkResult vmaAllocateMemory(VmaAllocator allocator, const VkMemoryRequirements *pVkMemoryRequirements, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div><div class="ttdoc">General purpose memory allocation. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ade56bf8dc9f5a5eaddf5f119ed525236"><div class="ttname"><a href="vk__mem__alloc_8h.html#ade56bf8dc9f5a5eaddf5f119ed525236">vmaSetCurrentFrameIndex</a></div><div class="ttdeci">void vmaSetCurrentFrameIndex(VmaAllocator allocator, uint32_t frameIndex)</div><div class="ttdoc">Sets index of the current frame. </div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a86c44f9950b40d50088ed93a17870a7a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a></div><div class="ttdeci">struct VmaAllocationCreateInfo VmaAllocationCreateInfo</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a7fdf64415b6c3d83c454f28d2c53df7b"><div class="ttname"><a href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a></div><div class="ttdeci">VkResult vmaAllocateMemoryForBuffer(VmaAllocator allocator, VkBuffer buffer, const VmaAllocationCreateInfo *pCreateInfo, VmaAllocation *pAllocation, VmaAllocationInfo *pAllocationInfo)</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a></div><div class="ttdeci">VmaPoolCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaPoolCreateInfo::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1308</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a2f9b3452af90c9768a30b7fb6ae194fc"><div class="ttname"><a href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">VmaStatInfo::unusedRangeSizeAvg</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1049</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">TODO finish documentation... </div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1200</div></div>
-<div class="ttc" id="struct_vma_stats_html_a0e6611508c29a187f0fd14ff1a0329c0"><div class="ttname"><a href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">VmaStats::memoryHeap</a></div><div class="ttdeci">VmaStatInfo memoryHeap[VK_MAX_MEMORY_HEAPS]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1056</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a></div><div class="ttdeci">VmaPoolCreateFlagBits</div><div class="ttdoc">Flags to be passed as VmaPoolCreateInfo::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1573</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a2f9b3452af90c9768a30b7fb6ae194fc"><div class="ttname"><a href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">VmaStatInfo::unusedRangeSizeAvg</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeAvg</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1306</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a43d8ba9673c846f049089a5029d5c73a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a></div><div class="ttdeci">VkBool32 vmaTouchAllocation(VmaAllocator allocator, VmaAllocation allocation)</div><div class="ttdoc">Returns VK_TRUE if allocation is not lost and atomically marks it as used in current frame...</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520">VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1465</div></div>
+<div class="ttc" id="struct_vma_stats_html_a0e6611508c29a187f0fd14ff1a0329c0"><div class="ttname"><a href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">VmaStats::memoryHeap</a></div><div class="ttdeci">VmaStatInfo memoryHeap[VK_MAX_MEMORY_HEAPS]</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1313</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a0d9f4e4ba5bf9aab1f1c746387753d77"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d9f4e4ba5bf9aab1f1c746387753d77">vmaDestroyBuffer</a></div><div class="ttdeci">void vmaDestroyBuffer(VmaAllocator allocator, VkBuffer buffer, VmaAllocation allocation)</div><div class="ttdoc">Destroys Vulkan buffer and frees allocated memory. </div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_ad7c54874724fce7b06aba526202d82a8"><div class="ttname"><a href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">VmaPoolStats::unusedSize</a></div><div class="ttdeci">VkDeviceSize unusedSize</div><div class="ttdoc">Total number of bytes in the pool not used by any VmaAllocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1383</div></div>
-<div class="ttc" id="struct_vma_stat_info_html_a5ba1a2476c4d39b10f7e2f7ebbb72ac4"><div class="ttname"><a href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">VmaStatInfo::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1049</div></div>
-<div class="ttc" id="struct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1447</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_ad7c54874724fce7b06aba526202d82a8"><div class="ttname"><a href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">VmaPoolStats::unusedSize</a></div><div class="ttdeci">VkDeviceSize unusedSize</div><div class="ttdoc">Total number of bytes in the pool not used by any VmaAllocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1648</div></div>
+<div class="ttc" id="struct_vma_stat_info_html_a5ba1a2476c4d39b10f7e2f7ebbb72ac4"><div class="ttname"><a href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">VmaStatInfo::unusedRangeSizeMax</a></div><div class="ttdeci">VkDeviceSize unusedRangeSizeMax</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1306</div></div>
+<div class="ttc" id="struct_vma_allocation_info_html_a7f6b0aa58c135e488e6b40a388dad9d5"><div class="ttname"><a href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">VmaAllocationInfo::memoryType</a></div><div class="ttdeci">uint32_t memoryType</div><div class="ttdoc">Memory type index that this allocation was allocated from. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1736</div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/docs/html/vk_khr_dedicated_allocation.html b/docs/html/vk_khr_dedicated_allocation.html
index 6b0002f..6f94725 100644
--- a/docs/html/vk_khr_dedicated_allocation.html
+++ b/docs/html/vk_khr_dedicated_allocation.html
@@ -74,7 +74,7 @@
 <li>VK_KHR_dedicated_allocation</li>
 </ul>
 <p>If you enabled these extensions:</p>
-<p>2 . Use <code>VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</code> flag when creating your <code>VmaAllocator</code> to inform the library that you enabled required extensions and you want the library to use them.</p>
+<p>2 . Use <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878" title="Enables usage of VK_KHR_dedicated_allocation extension. ">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a> flag when creating your <a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a>`to inform the library that you enabled required extensions and you want the library to use them.</p>
 <div class="fragment"><div class="line">allocatorInfo.<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> |= <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT</a>;</div><div class="line"></div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(&amp;allocatorInfo, &amp;allocator);</div></div><!-- fragment --><p>That's all. The extension will be automatically used whenever you create a buffer using <a class="el" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer()</a> or image using <a class="el" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73" title="Function similar to vmaCreateBuffer(). ">vmaCreateImage()</a>.</p>
 <p>When using the extension together with Vulkan Validation Layer, you will receive warnings like this: </p><pre class="fragment">vkBindBufferMemory(): Binding memory to buffer 0x33 but vkGetBufferMemoryRequirements() has not been called on that buffer.
 </pre><p>It is OK, you should just ignore it. It happens because you use function <code>vkGetBufferMemoryRequirements2KHR()</code> instead of standard <code>vkGetBufferMemoryRequirements()</code>, while the validation layer seems to be unaware of it.</p>
diff --git a/src/Common.cpp b/src/Common.cpp
new file mode 100644
index 0000000..ea7b9a1
--- /dev/null
+++ b/src/Common.cpp
@@ -0,0 +1,158 @@
+#include "Common.h"

+

+#ifdef _WIN32

+

+void ReadFile(std::vector<char>& out, const char* fileName)

+{

+    std::ifstream file(fileName, std::ios::ate | std::ios::binary);

+    assert(file.is_open());

+    size_t fileSize = (size_t)file.tellg();

+    if(fileSize > 0)

+    {

+        out.resize(fileSize);

+        file.seekg(0);

+        file.read(out.data(), fileSize);

+    }

+    else

+        out.clear();

+}

+

+void SetConsoleColor(CONSOLE_COLOR color)

+{

+    WORD attr = 0;

+    switch(color)

+    {

+    case CONSOLE_COLOR::INFO:

+        attr = FOREGROUND_INTENSITY;;

+        break;

+    case CONSOLE_COLOR::NORMAL:

+        attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;

+        break;

+    case CONSOLE_COLOR::WARNING:

+        attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;

+        break;

+    case CONSOLE_COLOR::ERROR_:

+        attr = FOREGROUND_RED | FOREGROUND_INTENSITY;

+        break;

+    default:

+        assert(0);

+    }

+

+    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);

+    SetConsoleTextAttribute(out, attr);

+}

+

+void PrintMessage(CONSOLE_COLOR color, const char* msg)

+{

+    if(color != CONSOLE_COLOR::NORMAL)

+        SetConsoleColor(color);

+    

+    printf("%s\n", msg);

+    

+    if (color != CONSOLE_COLOR::NORMAL)

+        SetConsoleColor(CONSOLE_COLOR::NORMAL);

+}

+

+void PrintMessage(CONSOLE_COLOR color, const wchar_t* msg)

+{

+    if(color != CONSOLE_COLOR::NORMAL)

+        SetConsoleColor(color);

+    

+    wprintf(L"%s\n", msg);

+    

+    if (color != CONSOLE_COLOR::NORMAL)

+        SetConsoleColor(CONSOLE_COLOR::NORMAL);

+}

+

+static const size_t CONSOLE_SMALL_BUF_SIZE = 256;

+

+void PrintMessageV(CONSOLE_COLOR color, const char* format, va_list argList)

+{

+	size_t dstLen = (size_t)::_vscprintf(format, argList);

+	if(dstLen)

+	{

+		bool useSmallBuf = dstLen < CONSOLE_SMALL_BUF_SIZE;

+		char smallBuf[CONSOLE_SMALL_BUF_SIZE];

+		std::vector<char> bigBuf(useSmallBuf ? 0 : dstLen + 1);

+		char* bufPtr = useSmallBuf ? smallBuf : bigBuf.data();

+		::vsprintf_s(bufPtr, dstLen + 1, format, argList);

+		PrintMessage(color, bufPtr);

+	}

+}

+

+void PrintMessageV(CONSOLE_COLOR color, const wchar_t* format, va_list argList)

+{

+	size_t dstLen = (size_t)::_vcwprintf(format, argList);

+	if(dstLen)

+	{

+		bool useSmallBuf = dstLen < CONSOLE_SMALL_BUF_SIZE;

+		wchar_t smallBuf[CONSOLE_SMALL_BUF_SIZE];

+		std::vector<wchar_t> bigBuf(useSmallBuf ? 0 : dstLen + 1);

+		wchar_t* bufPtr = useSmallBuf ? smallBuf : bigBuf.data();

+		::vswprintf_s(bufPtr, dstLen + 1, format, argList);

+		PrintMessage(color, bufPtr);

+	}

+}

+

+void PrintMessageF(CONSOLE_COLOR color, const char* format, ...)

+{

+	va_list argList;

+	va_start(argList, format);

+	PrintMessageV(color, format, argList);

+	va_end(argList);

+}

+

+void PrintMessageF(CONSOLE_COLOR color, const wchar_t* format, ...)

+{

+	va_list argList;

+	va_start(argList, format);

+	PrintMessageV(color, format, argList);

+	va_end(argList);

+}

+

+void PrintWarningF(const char* format, ...)

+{

+	va_list argList;

+	va_start(argList, format);

+	PrintMessageV(CONSOLE_COLOR::WARNING, format, argList);

+	va_end(argList);

+}

+

+void PrintWarningF(const wchar_t* format, ...)

+{

+	va_list argList;

+	va_start(argList, format);

+	PrintMessageV(CONSOLE_COLOR::WARNING, format, argList);

+	va_end(argList);

+}

+

+void PrintErrorF(const char* format, ...)

+{

+	va_list argList;

+	va_start(argList, format);

+	PrintMessageV(CONSOLE_COLOR::WARNING, format, argList);

+	va_end(argList);

+}

+

+void PrintErrorF(const wchar_t* format, ...)

+{

+	va_list argList;

+	va_start(argList, format);

+	PrintMessageV(CONSOLE_COLOR::WARNING, format, argList);

+	va_end(argList);

+}

+

+void SaveFile(const wchar_t* filePath, const void* data, size_t dataSize)

+{

+    FILE* f = nullptr;

+    _wfopen_s(&f, filePath, L"wb");

+    if(f)

+    {

+        fwrite(data, 1, dataSize, f);

+        fclose(f);

+    }

+    else

+        assert(0);

+}

+

+#endif // #ifdef _WIN32

diff --git a/src/Common.h b/src/Common.h
new file mode 100644
index 0000000..aa8e504
--- /dev/null
+++ b/src/Common.h
@@ -0,0 +1,105 @@
+#ifndef COMMON_H_

+#define COMMON_H_

+

+#include "VmaUsage.h"

+

+#ifdef _WIN32

+

+#define MATHFU_COMPILE_WITHOUT_SIMD_SUPPORT

+#include <mathfu/glsl_mappings.h>

+#include <mathfu/constants.h>

+

+#include <iostream>

+#include <fstream>

+#include <vector>

+#include <memory>

+#include <algorithm>

+#include <numeric>

+#include <array>

+#include <type_traits>

+#include <utility>

+#include <chrono>

+#include <string>

+

+#include <cassert>

+#include <cstdlib>

+#include <cstdio>

+#include <cstdarg>

+

+typedef std::chrono::high_resolution_clock::time_point time_point;

+typedef std::chrono::high_resolution_clock::duration duration;

+

+#define ERR_GUARD_VULKAN(Expr) do { VkResult res__ = (Expr); if (res__ < 0) assert(0); } while(0)

+

+extern VkPhysicalDevice g_hPhysicalDevice;

+extern VkDevice g_hDevice;

+extern VmaAllocator g_hAllocator;

+extern bool g_MemoryAliasingWarningEnabled;

+

+inline float ToFloatSeconds(duration d)

+{

+    return std::chrono::duration_cast<std::chrono::duration<float>>(d).count();

+}

+

+template <typename T>

+inline T ceil_div(T x, T y)

+{

+	return (x+y-1) / y;

+}

+

+template <typename T>

+static inline T align_up(T val, T align)

+{

+	return (val + align - 1) / align * align;

+}

+

+class RandomNumberGenerator

+{

+public:

+    RandomNumberGenerator() : m_Value{GetTickCount()} {}

+    RandomNumberGenerator(uint32_t seed) : m_Value{seed} { }

+    void Seed(uint32_t seed) { m_Value = seed; }

+    uint32_t Generate() { return GenerateFast() ^ (GenerateFast() >> 7); }

+

+private:

+    uint32_t m_Value;

+    uint32_t GenerateFast() { return m_Value = (m_Value * 196314165 + 907633515); }

+};

+

+void ReadFile(std::vector<char>& out, const char* fileName);

+

+enum class CONSOLE_COLOR

+{

+    INFO,

+    NORMAL,

+    WARNING,

+    ERROR_,

+    COUNT

+};

+

+void SetConsoleColor(CONSOLE_COLOR color);

+

+void PrintMessage(CONSOLE_COLOR color, const char* msg);

+void PrintMessage(CONSOLE_COLOR color, const wchar_t* msg);

+

+inline void Print(const char* msg) { PrintMessage(CONSOLE_COLOR::NORMAL, msg); }

+inline void Print(const wchar_t* msg) { PrintMessage(CONSOLE_COLOR::NORMAL, msg); }

+inline void PrintWarning(const char* msg) { PrintMessage(CONSOLE_COLOR::WARNING, msg); }

+inline void PrintWarning(const wchar_t* msg) { PrintMessage(CONSOLE_COLOR::WARNING, msg); }

+inline void PrintError(const char* msg) { PrintMessage(CONSOLE_COLOR::ERROR_, msg); }

+inline void PrintError(const wchar_t* msg) { PrintMessage(CONSOLE_COLOR::ERROR_, msg); }

+

+void PrintMessageV(CONSOLE_COLOR color, const char* format, va_list argList);

+void PrintMessageV(CONSOLE_COLOR color, const wchar_t* format, va_list argList);

+void PrintMessageF(CONSOLE_COLOR color, const char* format, ...);

+void PrintMessageF(CONSOLE_COLOR color, const wchar_t* format, ...);

+void PrintWarningF(const char* format, ...);

+void PrintWarningF(const wchar_t* format, ...);

+void PrintErrorF(const char* format, ...);

+void PrintErrorF(const wchar_t* format, ...);

+

+void SaveFile(const wchar_t* filePath, const void* data, size_t dataSize);

+

+#endif // #ifdef _WIN32

+

+#endif

diff --git a/src/Tests.cpp b/src/Tests.cpp
new file mode 100644
index 0000000..46b456e
--- /dev/null
+++ b/src/Tests.cpp
@@ -0,0 +1,2967 @@
+#include "Tests.h"

+#include "VmaUsage.h"

+#include "Common.h"

+#include <atomic>

+#include <thread>

+#include <mutex>

+

+#ifdef _WIN32

+

+enum class FREE_ORDER { FORWARD, BACKWARD, RANDOM, COUNT };

+

+struct AllocationSize

+{

+    uint32_t Probability;

+    VkDeviceSize BufferSizeMin, BufferSizeMax;

+    uint32_t ImageSizeMin, ImageSizeMax;

+};

+

+struct Config

+{

+    uint32_t RandSeed;

+    VkDeviceSize BeginBytesToAllocate;

+    uint32_t AdditionalOperationCount;

+    VkDeviceSize MaxBytesToAllocate;

+    uint32_t MemUsageProbability[4]; // For VMA_MEMORY_USAGE_*

+    std::vector<AllocationSize> AllocationSizes;

+    uint32_t ThreadCount;

+    uint32_t ThreadsUsingCommonAllocationsProbabilityPercent;

+    FREE_ORDER FreeOrder;

+};

+

+struct Result

+{

+    duration TotalTime;

+    duration AllocationTimeMin, AllocationTimeAvg, AllocationTimeMax;

+    duration DeallocationTimeMin, DeallocationTimeAvg, DeallocationTimeMax;

+    VkDeviceSize TotalMemoryAllocated;

+    VkDeviceSize FreeRangeSizeAvg, FreeRangeSizeMax;

+};

+

+void TestDefragmentationSimple();

+void TestDefragmentationFull();

+

+struct PoolTestConfig

+{

+    uint32_t RandSeed;

+    uint32_t ThreadCount;

+    VkDeviceSize PoolSize;

+    uint32_t FrameCount;

+    uint32_t TotalItemCount;

+    // Range for number of items used in each frame.

+    uint32_t UsedItemCountMin, UsedItemCountMax;

+    // Percent of items to make unused, and possibly make some others used in each frame.

+    uint32_t ItemsToMakeUnusedPercent;

+    std::vector<AllocationSize> AllocationSizes;

+

+    VkDeviceSize CalcAvgResourceSize() const

+    {

+        uint32_t probabilitySum = 0;

+        VkDeviceSize sizeSum = 0;

+        for(size_t i = 0; i < AllocationSizes.size(); ++i)

+        {

+            const AllocationSize& allocSize = AllocationSizes[i];

+            if(allocSize.BufferSizeMax > 0)

+                sizeSum += (allocSize.BufferSizeMin + allocSize.BufferSizeMax) / 2 * allocSize.Probability;

+            else

+            {

+                const VkDeviceSize avgDimension = (allocSize.ImageSizeMin + allocSize.ImageSizeMax) / 2;

+                sizeSum += avgDimension * avgDimension * 4 * allocSize.Probability;

+            }

+            probabilitySum += allocSize.Probability;

+        }

+        return sizeSum / probabilitySum;

+    }

+

+    bool UsesBuffers() const

+    {

+        for(size_t i = 0; i < AllocationSizes.size(); ++i)

+            if(AllocationSizes[i].BufferSizeMax > 0)

+                return true;

+        return false;

+    }

+

+    bool UsesImages() const

+    {

+        for(size_t i = 0; i < AllocationSizes.size(); ++i)

+            if(AllocationSizes[i].ImageSizeMax > 0)

+                return true;

+        return false;

+    }

+};

+

+struct PoolTestResult

+{

+    duration TotalTime;

+    duration AllocationTimeMin, AllocationTimeAvg, AllocationTimeMax;

+    duration DeallocationTimeMin, DeallocationTimeAvg, DeallocationTimeMax;

+    size_t LostAllocationCount, LostAllocationTotalSize;

+    size_t FailedAllocationCount, FailedAllocationTotalSize;

+};

+

+static const uint32_t IMAGE_BYTES_PER_PIXEL = 1;

+

+struct BufferInfo

+{

+    VkBuffer Buffer = VK_NULL_HANDLE;

+    VmaAllocation Allocation = VK_NULL_HANDLE;

+};

+

+static void InitResult(Result& outResult)

+{

+    outResult.TotalTime = duration::zero();

+    outResult.AllocationTimeMin = duration::max();

+    outResult.AllocationTimeAvg = duration::zero();

+    outResult.AllocationTimeMax = duration::min();

+    outResult.DeallocationTimeMin = duration::max();

+    outResult.DeallocationTimeAvg = duration::zero();

+    outResult.DeallocationTimeMax = duration::min();

+    outResult.TotalMemoryAllocated = 0;

+    outResult.FreeRangeSizeAvg = 0;

+    outResult.FreeRangeSizeMax = 0;

+}

+

+class TimeRegisterObj

+{

+public:

+    TimeRegisterObj(duration& min, duration& sum, duration& max) :

+        m_Min(min),

+        m_Sum(sum),

+        m_Max(max),

+        m_TimeBeg(std::chrono::high_resolution_clock::now())

+    {

+    }

+

+    ~TimeRegisterObj()

+    {

+        duration d = std::chrono::high_resolution_clock::now() - m_TimeBeg;

+        m_Sum += d;

+        if(d < m_Min) m_Min = d;

+        if(d > m_Max) m_Max = d;

+    }

+

+private:

+    duration& m_Min;

+    duration& m_Sum;

+    duration& m_Max;

+    time_point m_TimeBeg;

+};

+

+struct PoolTestThreadResult

+{

+    duration AllocationTimeMin, AllocationTimeSum, AllocationTimeMax;

+    duration DeallocationTimeMin, DeallocationTimeSum, DeallocationTimeMax;

+    size_t AllocationCount, DeallocationCount;

+    size_t LostAllocationCount, LostAllocationTotalSize;

+    size_t FailedAllocationCount, FailedAllocationTotalSize;

+};

+

+class AllocationTimeRegisterObj : public TimeRegisterObj

+{

+public:

+    AllocationTimeRegisterObj(Result& result) :

+        TimeRegisterObj(result.AllocationTimeMin, result.AllocationTimeAvg, result.AllocationTimeMax)

+    {

+    }

+};

+

+class DeallocationTimeRegisterObj : public TimeRegisterObj

+{

+public:

+    DeallocationTimeRegisterObj(Result& result) :

+        TimeRegisterObj(result.DeallocationTimeMin, result.DeallocationTimeAvg, result.DeallocationTimeMax)

+    {

+    }

+};

+

+class PoolAllocationTimeRegisterObj : public TimeRegisterObj

+{

+public:

+    PoolAllocationTimeRegisterObj(PoolTestThreadResult& result) :

+        TimeRegisterObj(result.AllocationTimeMin, result.AllocationTimeSum, result.AllocationTimeMax)

+    {

+    }

+};

+

+class PoolDeallocationTimeRegisterObj : public TimeRegisterObj

+{

+public:

+    PoolDeallocationTimeRegisterObj(PoolTestThreadResult& result) :

+        TimeRegisterObj(result.DeallocationTimeMin, result.DeallocationTimeSum, result.DeallocationTimeMax)

+    {

+    }

+};

+

+VkResult MainTest(Result& outResult, const Config& config)

+{

+    assert(config.ThreadCount > 0);

+

+    InitResult(outResult);

+

+    RandomNumberGenerator mainRand{config.RandSeed};

+

+    time_point timeBeg = std::chrono::high_resolution_clock::now();

+

+    std::atomic<size_t> allocationCount = 0;

+    VkResult res = VK_SUCCESS;

+

+    uint32_t memUsageProbabilitySum =

+        config.MemUsageProbability[0] + config.MemUsageProbability[1] +

+        config.MemUsageProbability[2] + config.MemUsageProbability[3];

+    assert(memUsageProbabilitySum > 0);

+

+    uint32_t allocationSizeProbabilitySum = std::accumulate(

+        config.AllocationSizes.begin(),

+        config.AllocationSizes.end(),

+        0u,

+        [](uint32_t sum, const AllocationSize& allocSize) {

+            return sum + allocSize.Probability;

+        });

+

+    struct Allocation

+    {

+        VkBuffer Buffer;

+        VkImage Image;

+        VmaAllocation Alloc;

+    };

+

+    std::vector<Allocation> commonAllocations;

+    std::mutex commonAllocationsMutex;

+

+    auto Allocate = [&](

+        VkDeviceSize bufferSize,

+        const VkExtent2D imageExtent,

+        RandomNumberGenerator& localRand,

+        VkDeviceSize& totalAllocatedBytes,

+        std::vector<Allocation>& allocations) -> VkResult

+    {

+        assert((bufferSize == 0) != (imageExtent.width == 0 && imageExtent.height == 0));

+

+        uint32_t memUsageIndex = 0;

+        uint32_t memUsageRand = localRand.Generate() % memUsageProbabilitySum;

+        while(memUsageRand >= config.MemUsageProbability[memUsageIndex])

+            memUsageRand -= config.MemUsageProbability[memUsageIndex++];

+

+        VmaAllocationCreateInfo memReq = {};

+        memReq.usage = (VmaMemoryUsage)(VMA_MEMORY_USAGE_GPU_ONLY + memUsageIndex);

+

+        Allocation allocation = {};

+        VmaAllocationInfo allocationInfo;

+

+        // Buffer

+        if(bufferSize > 0)

+        {

+            assert(imageExtent.width == 0);

+            VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+            bufferInfo.size = bufferSize;

+            bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;

+

+            {

+                AllocationTimeRegisterObj timeRegisterObj{outResult};

+                res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &memReq, &allocation.Buffer, &allocation.Alloc, &allocationInfo);

+            }

+        }

+        // Image

+        else

+        {

+            VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };

+            imageInfo.imageType = VK_IMAGE_TYPE_2D;

+            imageInfo.extent.width = imageExtent.width;

+            imageInfo.extent.height = imageExtent.height;

+            imageInfo.extent.depth = 1;

+            imageInfo.mipLevels = 1;

+            imageInfo.arrayLayers = 1;

+            imageInfo.format = VK_FORMAT_R8G8B8A8_UNORM;

+            imageInfo.tiling = memReq.usage == VMA_MEMORY_USAGE_GPU_ONLY ?

+                VK_IMAGE_TILING_OPTIMAL :

+                VK_IMAGE_TILING_LINEAR;

+            imageInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;

+            switch(memReq.usage)

+            {

+            case VMA_MEMORY_USAGE_GPU_ONLY:

+                switch(localRand.Generate() % 3)

+                {

+                case 0:

+                    imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;

+                    break;

+                case 1:

+                    imageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;

+                    break;

+                case 2:

+                    imageInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;

+                    break;

+                }

+                break;

+            case VMA_MEMORY_USAGE_CPU_ONLY:

+            case VMA_MEMORY_USAGE_CPU_TO_GPU:

+                imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;

+                break;

+            case VMA_MEMORY_USAGE_GPU_TO_CPU:

+                imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;

+                break;

+            }

+            imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;

+            imageInfo.flags = 0;

+

+            {

+                AllocationTimeRegisterObj timeRegisterObj{outResult};

+                res = vmaCreateImage(g_hAllocator, &imageInfo, &memReq, &allocation.Image, &allocation.Alloc, &allocationInfo);

+            }

+        }

+

+        if(res == VK_SUCCESS)

+        {

+            ++allocationCount;

+            totalAllocatedBytes += allocationInfo.size;

+            bool useCommonAllocations = localRand.Generate() % 100 < config.ThreadsUsingCommonAllocationsProbabilityPercent;

+            if(useCommonAllocations)

+            {

+                std::unique_lock<std::mutex> lock(commonAllocationsMutex);

+                commonAllocations.push_back(allocation);

+            }

+            else

+                allocations.push_back(allocation);

+        }

+        else

+        {

+            assert(0);

+        }

+        return res;

+    };

+

+    auto GetNextAllocationSize = [&](

+        VkDeviceSize& outBufSize,

+        VkExtent2D& outImageSize,

+        RandomNumberGenerator& localRand)

+    {

+        outBufSize = 0;

+        outImageSize = {0, 0};

+

+        uint32_t allocSizeIndex = 0;

+        uint32_t r = localRand.Generate() % allocationSizeProbabilitySum;

+        while(r >= config.AllocationSizes[allocSizeIndex].Probability)

+            r -= config.AllocationSizes[allocSizeIndex++].Probability;

+

+        const AllocationSize& allocSize = config.AllocationSizes[allocSizeIndex];

+        if(allocSize.BufferSizeMax > 0)

+        {

+            assert(allocSize.ImageSizeMax == 0);

+            if(allocSize.BufferSizeMax == allocSize.BufferSizeMin)

+                outBufSize = allocSize.BufferSizeMin;

+            else

+            {

+                outBufSize = allocSize.BufferSizeMin + localRand.Generate() % (allocSize.BufferSizeMax - allocSize.BufferSizeMin);

+                outBufSize = outBufSize / 16 * 16;

+            }

+        }

+        else

+        {

+            if(allocSize.ImageSizeMax == allocSize.ImageSizeMin)

+                outImageSize.width = outImageSize.height = allocSize.ImageSizeMax;

+            else

+            {

+                outImageSize.width  = allocSize.ImageSizeMin + localRand.Generate() % (allocSize.ImageSizeMax - allocSize.ImageSizeMin);

+                outImageSize.height = allocSize.ImageSizeMin + localRand.Generate() % (allocSize.ImageSizeMax - allocSize.ImageSizeMin);

+            }

+        }

+    };

+

+    std::atomic<uint32_t> numThreadsReachedMaxAllocations = 0;

+    HANDLE threadsFinishEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

+

+    auto ThreadProc = [&](uint32_t randSeed) -> void

+    {

+        RandomNumberGenerator threadRand(randSeed);

+        VkDeviceSize threadTotalAllocatedBytes = 0;

+        std::vector<Allocation> threadAllocations;

+        VkDeviceSize threadBeginBytesToAllocate = config.BeginBytesToAllocate / config.ThreadCount;

+        VkDeviceSize threadMaxBytesToAllocate = config.MaxBytesToAllocate / config.ThreadCount;

+        uint32_t threadAdditionalOperationCount = config.AdditionalOperationCount / config.ThreadCount;

+

+        // BEGIN ALLOCATIONS

+        for(;;)

+        {

+            VkDeviceSize bufferSize = 0;

+            VkExtent2D imageExtent = {};

+            GetNextAllocationSize(bufferSize, imageExtent, threadRand);

+            if(threadTotalAllocatedBytes + bufferSize + imageExtent.width * imageExtent.height * IMAGE_BYTES_PER_PIXEL <

+                threadBeginBytesToAllocate)

+            {

+                if(Allocate(bufferSize, imageExtent, threadRand, threadTotalAllocatedBytes, threadAllocations) != VK_SUCCESS)

+                    break;

+            }

+            else

+                break;

+        }

+

+        // ADDITIONAL ALLOCATIONS AND FREES

+        for(size_t i = 0; i < threadAdditionalOperationCount; ++i)

+        {

+            VkDeviceSize bufferSize = 0;

+            VkExtent2D imageExtent = {};

+            GetNextAllocationSize(bufferSize, imageExtent, threadRand);

+

+            // true = allocate, false = free

+            bool allocate = threadRand.Generate() % 2 != 0;

+

+            if(allocate)

+            {

+                if(threadTotalAllocatedBytes +

+                    bufferSize +

+                    imageExtent.width * imageExtent.height * IMAGE_BYTES_PER_PIXEL <

+                    threadMaxBytesToAllocate)

+                {

+                    if(Allocate(bufferSize, imageExtent, threadRand, threadTotalAllocatedBytes, threadAllocations) != VK_SUCCESS)

+                        break;

+                }

+            }

+            else

+            {

+                bool useCommonAllocations = threadRand.Generate() % 100 < config.ThreadsUsingCommonAllocationsProbabilityPercent;

+                if(useCommonAllocations)

+                {

+                    std::unique_lock<std::mutex> lock(commonAllocationsMutex);

+                    if(!commonAllocations.empty())

+                    {

+                        size_t indexToFree = threadRand.Generate() % commonAllocations.size();

+                        VmaAllocationInfo allocationInfo;

+                        vmaGetAllocationInfo(g_hAllocator, commonAllocations[indexToFree].Alloc, &allocationInfo);

+                        if(threadTotalAllocatedBytes >= allocationInfo.size)

+                        {

+                            DeallocationTimeRegisterObj timeRegisterObj{outResult};

+                            if(commonAllocations[indexToFree].Buffer != VK_NULL_HANDLE)

+                                vmaDestroyBuffer(g_hAllocator, commonAllocations[indexToFree].Buffer, commonAllocations[indexToFree].Alloc);

+                            else

+                                vmaDestroyImage(g_hAllocator, commonAllocations[indexToFree].Image, commonAllocations[indexToFree].Alloc);

+                            threadTotalAllocatedBytes -= allocationInfo.size;

+                            commonAllocations.erase(commonAllocations.begin() + indexToFree);

+                        }

+                    }

+                }

+                else

+                {

+                    if(!threadAllocations.empty())

+                    {

+                        size_t indexToFree = threadRand.Generate() % threadAllocations.size();

+                        VmaAllocationInfo allocationInfo;

+                        vmaGetAllocationInfo(g_hAllocator, threadAllocations[indexToFree].Alloc, &allocationInfo);

+                        if(threadTotalAllocatedBytes >= allocationInfo.size)

+                        {

+                            DeallocationTimeRegisterObj timeRegisterObj{outResult};

+                            if(threadAllocations[indexToFree].Buffer != VK_NULL_HANDLE)

+                                vmaDestroyBuffer(g_hAllocator, threadAllocations[indexToFree].Buffer, threadAllocations[indexToFree].Alloc);

+                            else

+                                vmaDestroyImage(g_hAllocator, threadAllocations[indexToFree].Image, threadAllocations[indexToFree].Alloc);

+                            threadTotalAllocatedBytes -= allocationInfo.size;

+                            threadAllocations.erase(threadAllocations.begin() + indexToFree);

+                        }

+                    }

+                }

+            }

+        }

+

+        ++numThreadsReachedMaxAllocations;

+

+        WaitForSingleObject(threadsFinishEvent, INFINITE);

+

+        // DEALLOCATION

+        while(!threadAllocations.empty())

+        {

+            size_t indexToFree = 0;

+            switch(config.FreeOrder)

+            {

+            case FREE_ORDER::FORWARD:

+                indexToFree = 0;

+                break;

+            case FREE_ORDER::BACKWARD:

+                indexToFree = threadAllocations.size() - 1;

+                break;

+            case FREE_ORDER::RANDOM:

+                indexToFree = mainRand.Generate() % threadAllocations.size();

+                break;

+            }

+

+            {

+                DeallocationTimeRegisterObj timeRegisterObj{outResult};

+                if(threadAllocations[indexToFree].Buffer != VK_NULL_HANDLE)

+                    vmaDestroyBuffer(g_hAllocator, threadAllocations[indexToFree].Buffer, threadAllocations[indexToFree].Alloc);

+                else

+                    vmaDestroyImage(g_hAllocator, threadAllocations[indexToFree].Image, threadAllocations[indexToFree].Alloc);

+            }

+            threadAllocations.erase(threadAllocations.begin() + indexToFree);

+        }

+    };

+

+    uint32_t threadRandSeed = mainRand.Generate();

+    std::vector<std::thread> bkgThreads;

+    for(size_t i = 0; i < config.ThreadCount; ++i)

+    {

+        bkgThreads.emplace_back(std::bind(ThreadProc, threadRandSeed + (uint32_t)i));

+    }

+    

+    // Wait for threads reached max allocations

+    while(numThreadsReachedMaxAllocations < config.ThreadCount)

+        Sleep(0);

+

+    // CALCULATE MEMORY STATISTICS ON FINAL USAGE

+    VmaStats vmaStats = {};

+    vmaCalculateStats(g_hAllocator, &vmaStats);

+    outResult.TotalMemoryAllocated = vmaStats.total.usedBytes + vmaStats.total.unusedBytes;

+    outResult.FreeRangeSizeMax = vmaStats.total.unusedRangeSizeMax;

+    outResult.FreeRangeSizeAvg = vmaStats.total.unusedRangeSizeAvg;

+

+    // Signal threads to deallocate

+    SetEvent(threadsFinishEvent);

+

+    // Wait for threads finished

+    for(size_t i = 0; i < bkgThreads.size(); ++i)

+        bkgThreads[i].join();

+    bkgThreads.clear();

+

+    CloseHandle(threadsFinishEvent);

+

+    // Deallocate remaining common resources

+    while(!commonAllocations.empty())

+    {

+        size_t indexToFree = 0;

+        switch(config.FreeOrder)

+        {

+        case FREE_ORDER::FORWARD:

+            indexToFree = 0;

+            break;

+        case FREE_ORDER::BACKWARD:

+            indexToFree = commonAllocations.size() - 1;

+            break;

+        case FREE_ORDER::RANDOM:

+            indexToFree = mainRand.Generate() % commonAllocations.size();

+            break;

+        }

+

+        {

+            DeallocationTimeRegisterObj timeRegisterObj{outResult};

+            if(commonAllocations[indexToFree].Buffer != VK_NULL_HANDLE)

+                vmaDestroyBuffer(g_hAllocator, commonAllocations[indexToFree].Buffer, commonAllocations[indexToFree].Alloc);

+            else

+                vmaDestroyImage(g_hAllocator, commonAllocations[indexToFree].Image, commonAllocations[indexToFree].Alloc);

+        }

+        commonAllocations.erase(commonAllocations.begin() + indexToFree);

+    }

+

+    if(allocationCount)

+    {

+        outResult.AllocationTimeAvg /= allocationCount;

+        outResult.DeallocationTimeAvg /= allocationCount;

+    }

+

+    outResult.TotalTime = std::chrono::high_resolution_clock::now() - timeBeg;

+

+    return res;

+}

+

+static void SaveAllocatorStatsToFile(VmaAllocator alloc, const wchar_t* filePath)

+{

+    char* stats;

+    vmaBuildStatsString(alloc, &stats, VK_TRUE);

+    SaveFile(filePath, stats, strlen(stats));

+    vmaFreeStatsString(alloc, stats);

+}

+

+struct AllocInfo

+{

+    VmaAllocation m_Allocation;

+    VkBuffer m_Buffer;

+    VkImage m_Image;

+    uint32_t m_StartValue;

+    union

+    {

+        VkBufferCreateInfo m_BufferInfo;

+        VkImageCreateInfo m_ImageInfo;

+    };

+};

+

+static void GetMemReq(VmaAllocationCreateInfo& outMemReq)

+{

+    outMemReq = {};

+    outMemReq.usage = VMA_MEMORY_USAGE_CPU_TO_GPU;

+    //outMemReq.flags = VMA_ALLOCATION_CREATE_PERSISTENT_MAP_BIT;

+}

+

+static void CreateBuffer(

+    VmaPool pool,

+    const VkBufferCreateInfo& bufCreateInfo,

+    bool persistentlyMapped,

+    AllocInfo& outAllocInfo)

+{

+    outAllocInfo = {};

+    outAllocInfo.m_BufferInfo = bufCreateInfo;

+    

+    VmaAllocationCreateInfo allocCreateInfo = {};

+    allocCreateInfo.pool = pool;

+    if(persistentlyMapped)

+        allocCreateInfo.flags = VMA_ALLOCATION_CREATE_MAPPED_BIT;

+

+    VmaAllocationInfo vmaAllocInfo = {};

+    ERR_GUARD_VULKAN( vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &outAllocInfo.m_Buffer, &outAllocInfo.m_Allocation, &vmaAllocInfo) );

+

+    // Setup StartValue and fill.

+    {

+        outAllocInfo.m_StartValue = (uint32_t)rand();

+        uint32_t* data = (uint32_t*)vmaAllocInfo.pMappedData;

+        assert((data != nullptr) == persistentlyMapped);

+        if(!persistentlyMapped)

+        {

+            ERR_GUARD_VULKAN( vmaMapMemory(g_hAllocator, outAllocInfo.m_Allocation, (void**)&data) );

+        }

+

+        uint32_t value = outAllocInfo.m_StartValue;

+        assert(bufCreateInfo.size % 4 == 0);

+        for(size_t i = 0; i < bufCreateInfo.size / sizeof(uint32_t); ++i)

+            data[i] = value++;

+

+        if(!persistentlyMapped)

+            vmaUnmapMemory(g_hAllocator, outAllocInfo.m_Allocation);

+    }

+}

+

+static void CreateAllocation(AllocInfo& outAllocation, VmaAllocator allocator)

+{

+    outAllocation.m_Allocation = nullptr;

+    outAllocation.m_Buffer = nullptr;

+    outAllocation.m_Image = nullptr;

+    outAllocation.m_StartValue = (uint32_t)rand();

+

+    VmaAllocationCreateInfo vmaMemReq;

+    GetMemReq(vmaMemReq);

+

+    VmaAllocationInfo allocInfo;

+

+    const bool isBuffer = true;//(rand() & 0x1) != 0;

+    const bool isLarge = (rand() % 16) == 0;

+    if(isBuffer)

+    {

+        const uint32_t bufferSize = isLarge ?

+            (rand() % 10 + 1) * (1024 * 1024) : // 1 MB ... 10 MB

+            (rand() % 1024 + 1) * 1024; // 1 KB ... 1 MB

+

+        VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+        bufferInfo.size = bufferSize;

+        bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

+

+        VkResult res = vmaCreateBuffer(allocator, &bufferInfo, &vmaMemReq, &outAllocation.m_Buffer, &outAllocation.m_Allocation, &allocInfo);

+        outAllocation.m_BufferInfo = bufferInfo;

+        assert(res == VK_SUCCESS);

+    }

+    else

+    {

+        const uint32_t imageSizeX = isLarge ?

+            1024 + rand() % (4096 - 1024) : // 1024 ... 4096

+            rand() % 1024 + 1; // 1 ... 1024

+        const uint32_t imageSizeY = isLarge ?

+            1024 + rand() % (4096 - 1024) : // 1024 ... 4096

+            rand() % 1024 + 1; // 1 ... 1024

+

+        VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };

+        imageInfo.imageType = VK_IMAGE_TYPE_2D;

+        imageInfo.format = VK_FORMAT_R8G8B8A8_UNORM;

+        imageInfo.extent.width = imageSizeX;

+        imageInfo.extent.height = imageSizeY;

+        imageInfo.extent.depth = 1;

+        imageInfo.mipLevels = 1;

+        imageInfo.arrayLayers = 1;

+        imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;

+        imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;

+        imageInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;

+        imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;

+

+        VkResult res = vmaCreateImage(allocator, &imageInfo, &vmaMemReq, &outAllocation.m_Image, &outAllocation.m_Allocation, &allocInfo);

+        outAllocation.m_ImageInfo = imageInfo;

+        assert(res == VK_SUCCESS);

+    }

+

+    uint32_t* data = (uint32_t*)allocInfo.pMappedData;

+    if(allocInfo.pMappedData == nullptr)

+    {

+        VkResult res = vmaMapMemory(allocator, outAllocation.m_Allocation, (void**)&data);

+        assert(res == VK_SUCCESS);

+    }

+

+    uint32_t value = outAllocation.m_StartValue;

+    assert(allocInfo.size % 4 == 0);

+    for(size_t i = 0; i < allocInfo.size / sizeof(uint32_t); ++i)

+        data[i] = value++;

+

+    if(allocInfo.pMappedData == nullptr)

+        vmaUnmapMemory(allocator, outAllocation.m_Allocation);

+}

+

+static void DestroyAllocation(const AllocInfo& allocation)

+{

+    if(allocation.m_Buffer)

+        vmaDestroyBuffer(g_hAllocator, allocation.m_Buffer, allocation.m_Allocation);

+    else

+        vmaDestroyImage(g_hAllocator, allocation.m_Image, allocation.m_Allocation);

+}

+

+static void DestroyAllAllocations(std::vector<AllocInfo>& allocations)

+{

+    for(size_t i = allocations.size(); i--; )

+        DestroyAllocation(allocations[i]);

+    allocations.clear();

+}

+

+static void ValidateAllocationData(const AllocInfo& allocation)

+{

+    VmaAllocationInfo allocInfo;

+    vmaGetAllocationInfo(g_hAllocator, allocation.m_Allocation, &allocInfo);

+

+    uint32_t* data = (uint32_t*)allocInfo.pMappedData;

+    if(allocInfo.pMappedData == nullptr)

+    {

+        VkResult res = vmaMapMemory(g_hAllocator, allocation.m_Allocation, (void**)&data);

+        assert(res == VK_SUCCESS);

+    }

+

+    uint32_t value = allocation.m_StartValue;

+    bool ok = true;

+    size_t i;

+    assert(allocInfo.size % 4 == 0);

+    for(i = 0; i < allocInfo.size / sizeof(uint32_t); ++i)

+    {

+        if(data[i] != value++)

+        {

+            ok = false;

+            break;

+        }

+    }

+    assert(ok);

+

+    if(allocInfo.pMappedData == nullptr)

+        vmaUnmapMemory(g_hAllocator, allocation.m_Allocation);

+}

+

+static void RecreateAllocationResource(AllocInfo& allocation)

+{

+    VmaAllocationInfo allocInfo;

+    vmaGetAllocationInfo(g_hAllocator, allocation.m_Allocation, &allocInfo);

+

+    if(allocation.m_Buffer)

+    {

+        vkDestroyBuffer(g_hDevice, allocation.m_Buffer, nullptr);

+

+        VkResult res = vkCreateBuffer(g_hDevice, &allocation.m_BufferInfo, nullptr, &allocation.m_Buffer);

+        assert(res == VK_SUCCESS);

+

+        // Just to silence validation layer warnings.

+        VkMemoryRequirements vkMemReq;

+        vkGetBufferMemoryRequirements(g_hDevice, allocation.m_Buffer, &vkMemReq);

+        assert(vkMemReq.size == allocation.m_BufferInfo.size);

+

+        res = vkBindBufferMemory(g_hDevice, allocation.m_Buffer, allocInfo.deviceMemory, allocInfo.offset);

+        assert(res == VK_SUCCESS);

+    }

+    else

+    {

+        vkDestroyImage(g_hDevice, allocation.m_Image, nullptr);

+

+        VkResult res = vkCreateImage(g_hDevice, &allocation.m_ImageInfo, nullptr, &allocation.m_Image);

+        assert(res == VK_SUCCESS);

+

+        // Just to silence validation layer warnings.

+        VkMemoryRequirements vkMemReq;

+        vkGetImageMemoryRequirements(g_hDevice, allocation.m_Image, &vkMemReq);

+

+        res = vkBindImageMemory(g_hDevice, allocation.m_Image, allocInfo.deviceMemory, allocInfo.offset);

+        assert(res == VK_SUCCESS);

+    }

+}

+

+static void Defragment(AllocInfo* allocs, size_t allocCount,

+    const VmaDefragmentationInfo* defragmentationInfo = nullptr,

+    VmaDefragmentationStats* defragmentationStats = nullptr)

+{

+    std::vector<VmaAllocation> vmaAllocs(allocCount);

+    for(size_t i = 0; i < allocCount; ++i)

+        vmaAllocs[i] = allocs[i].m_Allocation;

+

+    std::vector<VkBool32> allocChanged(allocCount);

+    

+    ERR_GUARD_VULKAN( vmaDefragment(g_hAllocator, vmaAllocs.data(), allocCount, allocChanged.data(),

+        defragmentationInfo, defragmentationStats) );

+

+    for(size_t i = 0; i < allocCount; ++i)

+    {

+        if(allocChanged[i])

+        {

+            RecreateAllocationResource(allocs[i]);

+        }

+    }

+}

+

+static void ValidateAllocationsData(const AllocInfo* allocs, size_t allocCount)

+{

+    std::for_each(allocs, allocs + allocCount, [](const AllocInfo& allocInfo) {

+        ValidateAllocationData(allocInfo);

+    });

+}

+

+void TestDefragmentationSimple()

+{

+    wprintf(L"Test defragmentation simple\n");

+

+    RandomNumberGenerator rand(667);

+

+    const VkDeviceSize BUF_SIZE = 0x10000;

+    const VkDeviceSize BLOCK_SIZE = BUF_SIZE * 8;

+    

+    const VkDeviceSize MIN_BUF_SIZE = 32;

+    const VkDeviceSize MAX_BUF_SIZE = BUF_SIZE * 4;

+    auto RandomBufSize = [&]() -> VkDeviceSize {

+        return align_up<VkDeviceSize>(rand.Generate() % (MAX_BUF_SIZE - MIN_BUF_SIZE + 1) + MIN_BUF_SIZE, 32);

+    };

+

+    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+    bufCreateInfo.size = BUF_SIZE;

+    bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

+

+    VmaAllocationCreateInfo exampleAllocCreateInfo = {};

+    exampleAllocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+

+    uint32_t memTypeIndex = UINT32_MAX;

+    vmaFindMemoryTypeIndexForBufferInfo(g_hAllocator, &bufCreateInfo, &exampleAllocCreateInfo, &memTypeIndex);

+

+    VmaPoolCreateInfo poolCreateInfo = {};

+    poolCreateInfo.blockSize = BLOCK_SIZE;

+    poolCreateInfo.memoryTypeIndex = memTypeIndex;

+

+    VmaPool pool;

+    ERR_GUARD_VULKAN( vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool) );

+

+    std::vector<AllocInfo> allocations;

+

+    // persistentlyMappedOption = 0 - not persistently mapped.

+    // persistentlyMappedOption = 1 - persistently mapped.

+    for(uint32_t persistentlyMappedOption = 0; persistentlyMappedOption < 2; ++persistentlyMappedOption)

+    {

+        wprintf(L"  Persistently mapped option = %u\n", persistentlyMappedOption);

+        const bool persistentlyMapped = persistentlyMappedOption != 0;

+

+        // # Test 1

+        // Buffers of fixed size.

+        // Fill 2 blocks. Remove odd buffers. Defragment everything.

+        // Expected result: at least 1 block freed.

+        {

+            for(size_t i = 0; i < BLOCK_SIZE / BUF_SIZE * 2; ++i)

+            {

+                AllocInfo allocInfo;

+                CreateBuffer(pool, bufCreateInfo, persistentlyMapped, allocInfo);

+                allocations.push_back(allocInfo);

+            }

+

+            for(size_t i = 1; i < allocations.size(); ++i)

+            {

+                DestroyAllocation(allocations[i]);

+                allocations.erase(allocations.begin() + i);

+            }

+

+            VmaDefragmentationStats defragStats;

+            Defragment(allocations.data(), allocations.size(), nullptr, &defragStats);

+            assert(defragStats.allocationsMoved > 0 && defragStats.bytesMoved > 0);

+            assert(defragStats.deviceMemoryBlocksFreed >= 1);

+

+            ValidateAllocationsData(allocations.data(), allocations.size());

+

+            DestroyAllAllocations(allocations);

+        }

+

+        // # Test 2

+        // Buffers of fixed size.

+        // Fill 2 blocks. Remove odd buffers. Defragment one buffer at time.

+        // Expected result: Each of 4 interations makes some progress.

+        {

+            for(size_t i = 0; i < BLOCK_SIZE / BUF_SIZE * 2; ++i)

+            {

+                AllocInfo allocInfo;

+                CreateBuffer(pool, bufCreateInfo, persistentlyMapped, allocInfo);

+                allocations.push_back(allocInfo);

+            }

+

+            for(size_t i = 1; i < allocations.size(); ++i)

+            {

+                DestroyAllocation(allocations[i]);

+                allocations.erase(allocations.begin() + i);

+            }

+

+            VmaDefragmentationInfo defragInfo = {};

+            defragInfo.maxAllocationsToMove = 1;

+            defragInfo.maxBytesToMove = BUF_SIZE;

+

+            for(size_t i = 0; i < BLOCK_SIZE / BUF_SIZE / 2; ++i)

+            {

+                VmaDefragmentationStats defragStats;

+                Defragment(allocations.data(), allocations.size(), &defragInfo, &defragStats);

+                assert(defragStats.allocationsMoved > 0 && defragStats.bytesMoved > 0);

+            }

+

+            ValidateAllocationsData(allocations.data(), allocations.size());

+

+            DestroyAllAllocations(allocations);

+        }

+

+        // # Test 3

+        // Buffers of variable size.

+        // Create a number of buffers. Remove some percent of them.

+        // Defragment while having some percent of them unmovable.

+        // Expected result: Just simple validation.

+        {

+            for(size_t i = 0; i < 100; ++i)

+            {

+                VkBufferCreateInfo localBufCreateInfo = bufCreateInfo;

+                localBufCreateInfo.size = RandomBufSize();

+

+                AllocInfo allocInfo;

+                CreateBuffer(pool, bufCreateInfo, persistentlyMapped, allocInfo);

+                allocations.push_back(allocInfo);

+            }

+

+            const uint32_t percentToDelete = 60;

+            const size_t numberToDelete = allocations.size() * percentToDelete / 100;

+            for(size_t i = 0; i < numberToDelete; ++i)

+            {

+                size_t indexToDelete = rand.Generate() % (uint32_t)allocations.size();

+                DestroyAllocation(allocations[indexToDelete]);

+                allocations.erase(allocations.begin() + indexToDelete);

+            }

+

+            // Non-movable allocations will be at the beginning of allocations array.

+            const uint32_t percentNonMovable = 20;

+            const size_t numberNonMovable = allocations.size() * percentNonMovable / 100;

+            for(size_t i = 0; i < numberNonMovable; ++i)

+            {

+                size_t indexNonMovable = i + rand.Generate() % (uint32_t)(allocations.size() - i);

+                if(indexNonMovable != i)

+                    std::swap(allocations[i], allocations[indexNonMovable]);

+            }

+

+            VmaDefragmentationStats defragStats;

+            Defragment(

+                allocations.data() + numberNonMovable,

+                allocations.size() - numberNonMovable,

+                nullptr, &defragStats);

+

+            ValidateAllocationsData(allocations.data(), allocations.size());

+

+            DestroyAllAllocations(allocations);

+        }

+    }

+

+    vmaDestroyPool(g_hAllocator, pool);

+}

+

+void TestDefragmentationFull()

+{

+    std::vector<AllocInfo> allocations;

+

+    // Create initial allocations.

+    for(size_t i = 0; i < 400; ++i)

+    {

+        AllocInfo allocation;

+        CreateAllocation(allocation, g_hAllocator);

+        allocations.push_back(allocation);

+    }

+

+    // Delete random allocations

+    const size_t allocationsToDeletePercent = 80;

+    size_t allocationsToDelete = allocations.size() * allocationsToDeletePercent / 100;

+    for(size_t i = 0; i < allocationsToDelete; ++i)

+    {

+        size_t index = (size_t)rand() % allocations.size();

+        DestroyAllocation(allocations[index]);

+        allocations.erase(allocations.begin() + index);

+    }

+

+    for(size_t i = 0; i < allocations.size(); ++i)

+        ValidateAllocationData(allocations[i]);

+

+    SaveAllocatorStatsToFile(g_hAllocator, L"Before.csv");

+

+    {

+        std::vector<VmaAllocation> vmaAllocations(allocations.size());

+        for(size_t i = 0; i < allocations.size(); ++i)

+            vmaAllocations[i] = allocations[i].m_Allocation;

+

+        const size_t nonMovablePercent = 0;

+        size_t nonMovableCount = vmaAllocations.size() * nonMovablePercent / 100;

+        for(size_t i = 0; i < nonMovableCount; ++i)

+        {

+            size_t index = (size_t)rand() % vmaAllocations.size();

+            vmaAllocations.erase(vmaAllocations.begin() + index);

+        }

+

+        const uint32_t defragCount = 1;

+        for(uint32_t defragIndex = 0; defragIndex < defragCount; ++defragIndex)

+        {

+            std::vector<VkBool32> allocationsChanged(vmaAllocations.size());

+

+            VmaDefragmentationInfo defragmentationInfo;

+            defragmentationInfo.maxAllocationsToMove = UINT_MAX;

+            defragmentationInfo.maxBytesToMove = SIZE_MAX;

+

+            wprintf(L"Defragmentation #%u\n", defragIndex);

+

+            time_point begTime = std::chrono::high_resolution_clock::now();

+

+            VmaDefragmentationStats stats;

+            VkResult res = vmaDefragment(g_hAllocator, vmaAllocations.data(), vmaAllocations.size(), allocationsChanged.data(), &defragmentationInfo, &stats);

+            assert(res >= 0);

+

+            float defragmentDuration = ToFloatSeconds(std::chrono::high_resolution_clock::now() - begTime);

+

+            wprintf(L"Moved allocations %u, bytes %llu\n", stats.allocationsMoved, stats.bytesMoved);

+            wprintf(L"Freed blocks %u, bytes %llu\n", stats.deviceMemoryBlocksFreed, stats.bytesFreed);

+            wprintf(L"Time: %.2f s\n", defragmentDuration);

+

+            for(size_t i = 0; i < vmaAllocations.size(); ++i)

+            {

+                if(allocationsChanged[i])

+                {

+                    RecreateAllocationResource(allocations[i]);

+                }

+            }

+

+            for(size_t i = 0; i < allocations.size(); ++i)

+                ValidateAllocationData(allocations[i]);

+

+            wchar_t fileName[MAX_PATH];

+            swprintf(fileName, MAX_PATH, L"After_%02u.csv", defragIndex);

+            SaveAllocatorStatsToFile(g_hAllocator, fileName);

+        }

+    }

+

+    // Destroy all remaining allocations.

+    DestroyAllAllocations(allocations);

+}

+

+static void TestUserData()

+{

+    VkResult res;

+

+    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+    bufCreateInfo.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;

+    bufCreateInfo.size = 0x10000;

+

+    for(uint32_t testIndex = 0; testIndex < 2; ++testIndex)

+    {

+        // Opaque pointer

+        {

+

+            void* numberAsPointer = (void*)(size_t)0xC2501FF3u;

+            void* pointerToSomething = &res;

+

+            VmaAllocationCreateInfo allocCreateInfo = {};

+            allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+            allocCreateInfo.pUserData = numberAsPointer;

+            if(testIndex == 1)

+                allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

+

+            VkBuffer buf; VmaAllocation alloc; VmaAllocationInfo allocInfo;

+            res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+            assert(res == VK_SUCCESS);

+            assert(allocInfo.pUserData = numberAsPointer);

+

+            vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

+            assert(allocInfo.pUserData == numberAsPointer);

+

+            vmaSetAllocationUserData(g_hAllocator, alloc, pointerToSomething);

+            vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

+            assert(allocInfo.pUserData == pointerToSomething);

+

+            vmaDestroyBuffer(g_hAllocator, buf, alloc);

+        }

+

+        // String

+        {

+            const char* name1 = "Buffer name \\\"\'<>&% \nSecond line .,;=";

+            const char* name2 = "2";

+            const size_t name1Len = strlen(name1);

+

+            char* name1Buf = new char[name1Len + 1];

+            strcpy_s(name1Buf, name1Len + 1, name1);

+

+            VmaAllocationCreateInfo allocCreateInfo = {};

+            allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+            allocCreateInfo.flags = VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT;

+            allocCreateInfo.pUserData = name1Buf;

+            if(testIndex == 1)

+                allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

+

+            VkBuffer buf; VmaAllocation alloc; VmaAllocationInfo allocInfo;

+            res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+            assert(res == VK_SUCCESS);

+            assert(allocInfo.pUserData != nullptr && allocInfo.pUserData != name1Buf);

+            assert(strcmp(name1, (const char*)allocInfo.pUserData) == 0);

+

+            delete[] name1Buf;

+

+            vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

+            assert(strcmp(name1, (const char*)allocInfo.pUserData) == 0);

+

+            vmaSetAllocationUserData(g_hAllocator, alloc, (void*)name2);

+            vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

+            assert(strcmp(name2, (const char*)allocInfo.pUserData) == 0);

+

+            vmaSetAllocationUserData(g_hAllocator, alloc, nullptr);

+            vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

+            assert(allocInfo.pUserData == nullptr);

+

+            vmaDestroyBuffer(g_hAllocator, buf, alloc);

+        }

+    }

+}

+

+static void TestMemoryRequirements()

+{

+    VkResult res;

+    VkBuffer buf;

+    VmaAllocation alloc;

+    VmaAllocationInfo allocInfo;

+

+    const VkPhysicalDeviceMemoryProperties* memProps;

+    vmaGetMemoryProperties(g_hAllocator, &memProps);

+

+    VkBufferCreateInfo bufInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+    bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

+    bufInfo.size = 128;

+

+    VmaAllocationCreateInfo allocCreateInfo = {};

+

+    // No requirements.

+    res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+    assert(res == VK_SUCCESS);

+    vmaDestroyBuffer(g_hAllocator, buf, alloc);

+

+    // Usage.

+    allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+    allocCreateInfo.requiredFlags = 0;

+    allocCreateInfo.preferredFlags = 0;

+    allocCreateInfo.memoryTypeBits = UINT32_MAX;

+

+    res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+    assert(res == VK_SUCCESS);

+    assert(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);

+    vmaDestroyBuffer(g_hAllocator, buf, alloc);

+

+    // Required flags, preferred flags.

+    allocCreateInfo.usage = VMA_MEMORY_USAGE_UNKNOWN;

+    allocCreateInfo.requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;

+    allocCreateInfo.preferredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;

+    allocCreateInfo.memoryTypeBits = 0;

+

+    res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+    assert(res == VK_SUCCESS);

+    assert(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);

+    assert(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);

+    vmaDestroyBuffer(g_hAllocator, buf, alloc);

+

+    // memoryTypeBits.

+    const uint32_t memType = allocInfo.memoryType;

+    allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+    allocCreateInfo.requiredFlags = 0;

+    allocCreateInfo.preferredFlags = 0;

+    allocCreateInfo.memoryTypeBits = 1u << memType;

+

+    res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+    assert(res == VK_SUCCESS);

+    assert(allocInfo.memoryType == memType);

+    vmaDestroyBuffer(g_hAllocator, buf, alloc);

+

+}

+

+static void TestBasics()

+{

+    VkResult res;

+

+    TestMemoryRequirements();

+

+    // Lost allocation

+    {

+        VmaAllocation alloc = VK_NULL_HANDLE;

+        vmaCreateLostAllocation(g_hAllocator, &alloc);

+        assert(alloc != VK_NULL_HANDLE);

+

+        VmaAllocationInfo allocInfo;

+        vmaGetAllocationInfo(g_hAllocator, alloc, &allocInfo);

+        assert(allocInfo.deviceMemory == VK_NULL_HANDLE);

+        assert(allocInfo.size == 0);

+

+        vmaFreeMemory(g_hAllocator, alloc);

+    }

+    

+    // Allocation that is MAPPED and not necessarily HOST_VISIBLE.

+    {

+        VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+        bufCreateInfo.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;

+        bufCreateInfo.size = 128;

+

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;

+        allocCreateInfo.flags = VMA_ALLOCATION_CREATE_MAPPED_BIT;

+

+        VkBuffer buf; VmaAllocation alloc; VmaAllocationInfo allocInfo;

+        res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+        assert(res == VK_SUCCESS);

+

+        vmaDestroyBuffer(g_hAllocator, buf, alloc);

+

+        // Same with OWN_MEMORY.

+        allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

+

+        res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+        assert(res == VK_SUCCESS);

+

+        vmaDestroyBuffer(g_hAllocator, buf, alloc);

+    }

+

+    TestUserData();

+}

+

+void TestHeapSizeLimit()

+{

+    const VkDeviceSize HEAP_SIZE_LIMIT = 1ull * 1024 * 1024 * 1024; // 1 GB

+    const VkDeviceSize BLOCK_SIZE      = 128ull * 1024 * 1024;      // 128 MB

+

+    VkDeviceSize heapSizeLimit[VK_MAX_MEMORY_HEAPS];

+    for(uint32_t i = 0; i < VK_MAX_MEMORY_HEAPS; ++i)

+    {

+        heapSizeLimit[i] = HEAP_SIZE_LIMIT;

+    }

+

+    VmaAllocatorCreateInfo allocatorCreateInfo = {};

+    allocatorCreateInfo.physicalDevice = g_hPhysicalDevice;

+    allocatorCreateInfo.device = g_hDevice;

+    allocatorCreateInfo.pHeapSizeLimit = heapSizeLimit;

+

+    VmaAllocator hAllocator;

+    VkResult res = vmaCreateAllocator(&allocatorCreateInfo, &hAllocator);

+    assert(res == VK_SUCCESS);

+

+    struct Item

+    {

+        VkBuffer hBuf;

+        VmaAllocation hAlloc;

+    };

+    std::vector<Item> items;

+

+    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+    bufCreateInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;

+

+    // 1. Allocate two blocks of Own Memory, half the size of BLOCK_SIZE.

+    VmaAllocationInfo ownAllocInfo;

+    {

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;

+        allocCreateInfo.flags = VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

+

+        bufCreateInfo.size = BLOCK_SIZE / 2;

+

+        for(size_t i = 0; i < 2; ++i)

+        {

+            Item item;

+            res = vmaCreateBuffer(hAllocator, &bufCreateInfo, &allocCreateInfo, &item.hBuf, &item.hAlloc, &ownAllocInfo);

+            assert(res == VK_SUCCESS);

+            items.push_back(item);

+        }

+    }

+

+    // Create pool to make sure allocations must be out of this memory type.

+    VmaPoolCreateInfo poolCreateInfo = {};

+    poolCreateInfo.memoryTypeIndex = ownAllocInfo.memoryType;

+    poolCreateInfo.blockSize = BLOCK_SIZE;

+

+    VmaPool hPool;

+    res = vmaCreatePool(hAllocator, &poolCreateInfo, &hPool);

+    assert(res == VK_SUCCESS);

+

+    // 2. Allocate normal buffers from all the remaining memory.

+    {

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.pool = hPool;

+

+        bufCreateInfo.size = BLOCK_SIZE / 2;

+

+        const size_t bufCount = ((HEAP_SIZE_LIMIT / BLOCK_SIZE) - 1) * 2;

+        for(size_t i = 0; i < bufCount; ++i)

+        {

+            Item item;

+            res = vmaCreateBuffer(hAllocator, &bufCreateInfo, &allocCreateInfo, &item.hBuf, &item.hAlloc, nullptr);

+            assert(res == VK_SUCCESS);

+            items.push_back(item);

+        }

+    }

+

+    // 3. Allocation of one more (even small) buffer should fail.

+    {

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.pool = hPool;

+

+        bufCreateInfo.size = 128;

+

+        VkBuffer hBuf;

+        VmaAllocation hAlloc;

+        res = vmaCreateBuffer(hAllocator, &bufCreateInfo, &allocCreateInfo, &hBuf, &hAlloc, nullptr);

+        assert(res == VK_ERROR_OUT_OF_DEVICE_MEMORY);

+    }

+

+    // Destroy everything.

+    for(size_t i = items.size(); i--; )

+    {

+        vmaDestroyBuffer(hAllocator, items[i].hBuf, items[i].hAlloc);

+    }

+

+    vmaDestroyPool(hAllocator, hPool);

+

+    vmaDestroyAllocator(hAllocator);

+}

+

+static void TestPool_SameSize()

+{

+    const VkDeviceSize BUF_SIZE = 1024 * 1024;

+    const size_t BUF_COUNT = 100;

+    VkResult res;

+

+    RandomNumberGenerator rand{123};

+

+    VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+    bufferInfo.size = BUF_SIZE;

+    bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;

+

+    uint32_t memoryTypeBits = UINT32_MAX;

+    {

+        VkBuffer dummyBuffer;

+        res = vkCreateBuffer(g_hDevice, &bufferInfo, nullptr, &dummyBuffer);

+        assert(res == VK_SUCCESS);

+

+        VkMemoryRequirements memReq;

+        vkGetBufferMemoryRequirements(g_hDevice, dummyBuffer, &memReq);

+        memoryTypeBits = memReq.memoryTypeBits;

+

+        vkDestroyBuffer(g_hDevice, dummyBuffer, nullptr);

+    }

+

+    VmaAllocationCreateInfo poolAllocInfo = {};

+    poolAllocInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+    uint32_t memTypeIndex;

+    res = vmaFindMemoryTypeIndex(

+        g_hAllocator,

+        memoryTypeBits,

+        &poolAllocInfo,

+        &memTypeIndex);

+

+    VmaPoolCreateInfo poolCreateInfo = {};

+    poolCreateInfo.memoryTypeIndex = memTypeIndex;

+    poolCreateInfo.blockSize = BUF_SIZE * BUF_COUNT / 4;

+    poolCreateInfo.minBlockCount = 1;

+    poolCreateInfo.maxBlockCount = 4;

+    poolCreateInfo.frameInUseCount = 0;

+

+    VmaPool pool;

+    res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

+    assert(res == VK_SUCCESS);

+

+    vmaSetCurrentFrameIndex(g_hAllocator, 1);

+

+    VmaAllocationCreateInfo allocInfo = {};

+    allocInfo.pool = pool;

+    allocInfo.flags = VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT |

+        VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT;

+

+    struct BufItem

+    {

+        VkBuffer Buf;

+        VmaAllocation Alloc;

+    };

+    std::vector<BufItem> items;

+

+    // Fill entire pool.

+    for(size_t i = 0; i < BUF_COUNT; ++i)

+    {

+        BufItem item;

+        res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

+        assert(res == VK_SUCCESS);

+        items.push_back(item);

+    }

+

+    // Make sure that another allocation would fail.

+    {

+        BufItem item;

+        res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

+        assert(res == VK_ERROR_OUT_OF_DEVICE_MEMORY);

+    }

+

+    // Validate that no buffer is lost. Also check that they are not mapped.

+    for(size_t i = 0; i < items.size(); ++i)

+    {

+        VmaAllocationInfo allocInfo;

+        vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

+        assert(allocInfo.deviceMemory != VK_NULL_HANDLE);

+        assert(allocInfo.pMappedData == nullptr);

+    }

+

+    // Free some percent of random items.

+    {

+        const size_t PERCENT_TO_FREE = 10;

+        size_t itemsToFree = items.size() * PERCENT_TO_FREE / 100;

+        for(size_t i = 0; i < itemsToFree; ++i)

+        {

+            size_t index = (size_t)rand.Generate() % items.size();

+            vmaDestroyBuffer(g_hAllocator, items[index].Buf, items[index].Alloc);

+            items.erase(items.begin() + index);

+        }

+    }

+

+    // Randomly allocate and free items.

+    {

+        const size_t OPERATION_COUNT = BUF_COUNT;

+        for(size_t i = 0; i < OPERATION_COUNT; ++i)

+        {

+            bool allocate = rand.Generate() % 2 != 0;

+            if(allocate)

+            {

+                if(items.size() < BUF_COUNT)

+                {

+                    BufItem item;

+                    res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

+                    assert(res == VK_SUCCESS);

+                    items.push_back(item);

+               }

+            }

+            else // Free

+            {

+                if(!items.empty())

+                {

+                    size_t index = (size_t)rand.Generate() % items.size();

+                    vmaDestroyBuffer(g_hAllocator, items[index].Buf, items[index].Alloc);

+                    items.erase(items.begin() + index);

+                }

+            }

+        }

+    }

+

+    // Allocate up to maximum.

+    while(items.size() < BUF_COUNT)

+    {

+        BufItem item;

+        res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

+        assert(res == VK_SUCCESS);

+        items.push_back(item);

+    }

+

+    // Validate that no buffer is lost.

+    for(size_t i = 0; i < items.size(); ++i)

+    {

+        VmaAllocationInfo allocInfo;

+        vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

+        assert(allocInfo.deviceMemory != VK_NULL_HANDLE);

+    }

+    

+    // Next frame.

+    vmaSetCurrentFrameIndex(g_hAllocator, 2);

+

+    // Allocate another BUF_COUNT buffers.

+    for(size_t i = 0; i < BUF_COUNT; ++i)

+    {

+        BufItem item;

+        res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

+        assert(res == VK_SUCCESS);

+        items.push_back(item);

+    }

+

+    // Make sure the first BUF_COUNT is lost. Delete them.

+    for(size_t i = 0; i < BUF_COUNT; ++i)

+    {

+        VmaAllocationInfo allocInfo;

+        vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

+        assert(allocInfo.deviceMemory == VK_NULL_HANDLE);

+        vmaDestroyBuffer(g_hAllocator, items[i].Buf, items[i].Alloc);

+    }

+    items.erase(items.begin(), items.begin() + BUF_COUNT);

+

+    // Validate that no buffer is lost.

+    for(size_t i = 0; i < items.size(); ++i)

+    {

+        VmaAllocationInfo allocInfo;

+        vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

+        assert(allocInfo.deviceMemory != VK_NULL_HANDLE);

+    }

+

+    // Free one item.

+    vmaDestroyBuffer(g_hAllocator, items.back().Buf, items.back().Alloc);

+    items.pop_back();

+

+    // Validate statistics.

+    {

+        VmaPoolStats poolStats = {};

+        vmaGetPoolStats(g_hAllocator, pool, &poolStats);

+        assert(poolStats.allocationCount == items.size());

+        assert(poolStats.size = BUF_COUNT * BUF_SIZE);

+        assert(poolStats.unusedRangeCount == 1);

+        assert(poolStats.unusedRangeSizeMax == BUF_SIZE);

+        assert(poolStats.unusedSize == BUF_SIZE);

+    }

+

+    // Free all remaining items.

+    for(size_t i = items.size(); i--; )

+        vmaDestroyBuffer(g_hAllocator, items[i].Buf, items[i].Alloc);

+    items.clear();

+

+    // Allocate maximum items again.

+    for(size_t i = 0; i < BUF_COUNT; ++i)

+    {

+        BufItem item;

+        res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

+        assert(res == VK_SUCCESS);

+        items.push_back(item);

+    }

+

+    // Delete every other item.

+    for(size_t i = 0; i < BUF_COUNT / 2; ++i)

+    {

+        vmaDestroyBuffer(g_hAllocator, items[i].Buf, items[i].Alloc);

+        items.erase(items.begin() + i);

+    }

+

+    // Defragment!

+    {

+        std::vector<VmaAllocation> allocationsToDefragment(items.size());

+        for(size_t i = 0; i < items.size(); ++i)

+            allocationsToDefragment[i] = items[i].Alloc;

+

+        VmaDefragmentationStats defragmentationStats;

+        res = vmaDefragment(g_hAllocator, allocationsToDefragment.data(), items.size(), nullptr, nullptr, &defragmentationStats);

+        assert(res == VK_SUCCESS);

+        assert(defragmentationStats.deviceMemoryBlocksFreed == 2);

+    }

+

+    // Free all remaining items.

+    for(size_t i = items.size(); i--; )

+        vmaDestroyBuffer(g_hAllocator, items[i].Buf, items[i].Alloc);

+    items.clear();

+

+    ////////////////////////////////////////////////////////////////////////////////

+    // Test for vmaMakePoolAllocationsLost

+

+    // Allocate 4 buffers on frame 10.

+    vmaSetCurrentFrameIndex(g_hAllocator, 10);

+    for(size_t i = 0; i < 4; ++i)

+    {

+        BufItem item;

+        res = vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocInfo, &item.Buf, &item.Alloc, nullptr);

+        assert(res == VK_SUCCESS);

+        items.push_back(item);

+    }

+

+    // Touch first 2 of them on frame 11.

+    vmaSetCurrentFrameIndex(g_hAllocator, 11);

+    for(size_t i = 0; i < 2; ++i)

+    {

+        VmaAllocationInfo allocInfo;

+        vmaGetAllocationInfo(g_hAllocator, items[i].Alloc, &allocInfo);

+    }

+

+    // vmaMakePoolAllocationsLost. Only remaining 2 should be lost.

+    size_t lostCount = 0xDEADC0DE;

+    vmaMakePoolAllocationsLost(g_hAllocator, pool, &lostCount);

+    assert(lostCount == 2);

+

+    // Make another call. Now 0 should be lost.

+    vmaMakePoolAllocationsLost(g_hAllocator, pool, &lostCount);

+    assert(lostCount == 0);

+

+    // Make another call, with null count. Should not crash.

+    vmaMakePoolAllocationsLost(g_hAllocator, pool, nullptr);

+

+    // END: Free all remaining items.

+    for(size_t i = items.size(); i--; )

+        vmaDestroyBuffer(g_hAllocator, items[i].Buf, items[i].Alloc);

+

+    items.clear();

+

+    vmaDestroyPool(g_hAllocator, pool);

+}

+

+static void TestPool_Benchmark(

+    PoolTestResult& outResult,

+    const PoolTestConfig& config)

+{

+    assert(config.ThreadCount > 0);

+

+    RandomNumberGenerator mainRand{config.RandSeed};

+

+    uint32_t allocationSizeProbabilitySum = std::accumulate(

+        config.AllocationSizes.begin(),

+        config.AllocationSizes.end(),

+        0u,

+        [](uint32_t sum, const AllocationSize& allocSize) {

+            return sum + allocSize.Probability;

+        });

+

+    VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+    bufferInfo.size = 256; // Whatever.

+    bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;

+

+    VkImageCreateInfo imageInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };

+    imageInfo.imageType = VK_IMAGE_TYPE_2D;

+    imageInfo.extent.width = 256; // Whatever.

+    imageInfo.extent.height = 256; // Whatever.

+    imageInfo.extent.depth = 1;

+    imageInfo.mipLevels = 1;

+    imageInfo.arrayLayers = 1;

+    imageInfo.format = VK_FORMAT_R8G8B8A8_UNORM;

+    imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; // LINEAR if CPU memory.

+    imageInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;

+    imageInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; // TRANSFER_SRC if CPU memory.

+    imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;

+

+    uint32_t bufferMemoryTypeBits = UINT32_MAX;

+    {

+        VkBuffer dummyBuffer;

+        VkResult res = vkCreateBuffer(g_hDevice, &bufferInfo, nullptr, &dummyBuffer);

+        assert(res == VK_SUCCESS);

+

+        VkMemoryRequirements memReq;

+        vkGetBufferMemoryRequirements(g_hDevice, dummyBuffer, &memReq);

+        bufferMemoryTypeBits = memReq.memoryTypeBits;

+

+        vkDestroyBuffer(g_hDevice, dummyBuffer, nullptr);

+    }

+

+    uint32_t imageMemoryTypeBits = UINT32_MAX;

+    {

+        VkImage dummyImage;

+        VkResult res = vkCreateImage(g_hDevice, &imageInfo, nullptr, &dummyImage);

+        assert(res == VK_SUCCESS);

+

+        VkMemoryRequirements memReq;

+        vkGetImageMemoryRequirements(g_hDevice, dummyImage, &memReq);

+        imageMemoryTypeBits = memReq.memoryTypeBits;

+

+        vkDestroyImage(g_hDevice, dummyImage, nullptr);

+    }

+

+    uint32_t memoryTypeBits = 0;

+    if(config.UsesBuffers() && config.UsesImages())

+    {

+        memoryTypeBits = bufferMemoryTypeBits & imageMemoryTypeBits;

+        if(memoryTypeBits == 0)

+        {

+            PrintWarning(L"Cannot test buffers + images in the same memory pool on this GPU.");

+            return;

+        }

+    }

+    else if(config.UsesBuffers())

+        memoryTypeBits = bufferMemoryTypeBits;

+    else if(config.UsesImages())

+        memoryTypeBits = imageMemoryTypeBits;

+    else

+        assert(0);

+

+    VmaPoolCreateInfo poolCreateInfo = {};

+    poolCreateInfo.memoryTypeIndex = 0;

+    poolCreateInfo.minBlockCount = 1;

+    poolCreateInfo.maxBlockCount = 1;

+    poolCreateInfo.blockSize = config.PoolSize;

+    poolCreateInfo.frameInUseCount = 1;

+

+    VmaAllocationCreateInfo dummyAllocCreateInfo = {};

+    dummyAllocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;

+    vmaFindMemoryTypeIndex(g_hAllocator, memoryTypeBits, &dummyAllocCreateInfo, &poolCreateInfo.memoryTypeIndex);

+

+    VmaPool pool;

+    VkResult res = vmaCreatePool(g_hAllocator, &poolCreateInfo, &pool);

+    assert(res == VK_SUCCESS);

+

+    // Start time measurement - after creating pool and initializing data structures.

+    time_point timeBeg = std::chrono::high_resolution_clock::now();

+

+    ////////////////////////////////////////////////////////////////////////////////

+    // ThreadProc

+    auto ThreadProc = [&](

+        PoolTestThreadResult* outThreadResult,

+        uint32_t randSeed,

+        HANDLE frameStartEvent,

+        HANDLE frameEndEvent) -> void

+    {

+        RandomNumberGenerator threadRand{randSeed};

+

+        outThreadResult->AllocationTimeMin = duration::max();

+        outThreadResult->AllocationTimeSum = duration::zero();

+        outThreadResult->AllocationTimeMax = duration::min();

+        outThreadResult->DeallocationTimeMin = duration::max();

+        outThreadResult->DeallocationTimeSum = duration::zero();

+        outThreadResult->DeallocationTimeMax = duration::min();

+        outThreadResult->AllocationCount = 0;

+        outThreadResult->DeallocationCount = 0;

+        outThreadResult->LostAllocationCount = 0;

+        outThreadResult->LostAllocationTotalSize = 0;

+        outThreadResult->FailedAllocationCount = 0;

+        outThreadResult->FailedAllocationTotalSize = 0;

+

+        struct Item

+        {

+            VkDeviceSize BufferSize;

+            VkExtent2D ImageSize;

+            VkBuffer Buf;

+            VkImage Image;

+            VmaAllocation Alloc;

+            

+            VkDeviceSize CalcSizeBytes() const

+            {

+                return BufferSize +

+                    ImageSize.width * ImageSize.height * 4;

+            }

+        };

+        std::vector<Item> unusedItems, usedItems;

+

+        const size_t threadTotalItemCount = config.TotalItemCount / config.ThreadCount;

+

+        // Create all items - all unused, not yet allocated.

+        for(size_t i = 0; i < threadTotalItemCount; ++i)

+        {

+            Item item = {};

+

+            uint32_t allocSizeIndex = 0;

+            uint32_t r = threadRand.Generate() % allocationSizeProbabilitySum;

+            while(r >= config.AllocationSizes[allocSizeIndex].Probability)

+                r -= config.AllocationSizes[allocSizeIndex++].Probability;

+

+            const AllocationSize& allocSize = config.AllocationSizes[allocSizeIndex];

+            if(allocSize.BufferSizeMax > 0)

+            {

+                assert(allocSize.BufferSizeMin > 0);

+                assert(allocSize.ImageSizeMin == 0 && allocSize.ImageSizeMax == 0);

+                if(allocSize.BufferSizeMax == allocSize.BufferSizeMin)

+                    item.BufferSize = allocSize.BufferSizeMin;

+                else

+                {

+                    item.BufferSize = allocSize.BufferSizeMin + threadRand.Generate() % (allocSize.BufferSizeMax - allocSize.BufferSizeMin);

+                    item.BufferSize = item.BufferSize / 16 * 16;

+                }

+            }

+            else

+            {

+                assert(allocSize.ImageSizeMin > 0 && allocSize.ImageSizeMax > 0);

+                if(allocSize.ImageSizeMax == allocSize.ImageSizeMin)

+                    item.ImageSize.width = item.ImageSize.height = allocSize.ImageSizeMax;

+                else

+                {

+                    item.ImageSize.width  = allocSize.ImageSizeMin + threadRand.Generate() % (allocSize.ImageSizeMax - allocSize.ImageSizeMin);

+                    item.ImageSize.height = allocSize.ImageSizeMin + threadRand.Generate() % (allocSize.ImageSizeMax - allocSize.ImageSizeMin);

+                }

+            }

+

+            unusedItems.push_back(item);

+        }

+

+        auto Allocate = [&](Item& item) -> VkResult

+        {

+            VmaAllocationCreateInfo allocCreateInfo = {};

+            allocCreateInfo.pool = pool;

+            allocCreateInfo.flags = VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT |

+                VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT;

+

+            if(item.BufferSize)

+            {

+                bufferInfo.size = item.BufferSize;

+                PoolAllocationTimeRegisterObj timeRegisterObj(*outThreadResult);

+                return vmaCreateBuffer(g_hAllocator, &bufferInfo, &allocCreateInfo, &item.Buf, &item.Alloc, nullptr);

+            }

+            else

+            {

+                assert(item.ImageSize.width && item.ImageSize.height);

+

+                imageInfo.extent.width = item.ImageSize.width;

+                imageInfo.extent.height = item.ImageSize.height;

+                PoolAllocationTimeRegisterObj timeRegisterObj(*outThreadResult);

+                return vmaCreateImage(g_hAllocator, &imageInfo, &allocCreateInfo, &item.Image, &item.Alloc, nullptr);

+            }

+        };

+

+        ////////////////////////////////////////////////////////////////////////////////

+        // Frames

+        for(uint32_t frameIndex = 0; frameIndex < config.FrameCount; ++frameIndex)

+        {

+            WaitForSingleObject(frameStartEvent, INFINITE);

+

+            // Always make some percent of used bufs unused, to choose different used ones.

+            const size_t bufsToMakeUnused = usedItems.size() * config.ItemsToMakeUnusedPercent / 100;

+            for(size_t i = 0; i < bufsToMakeUnused; ++i)

+            {

+                size_t index = threadRand.Generate() % usedItems.size();

+                unusedItems.push_back(usedItems[index]);

+                usedItems.erase(usedItems.begin() + index);

+            }

+

+            // Determine which bufs we want to use in this frame.

+            const size_t usedBufCount = (threadRand.Generate() % (config.UsedItemCountMax - config.UsedItemCountMin) + config.UsedItemCountMin)

+                / config.ThreadCount;

+            assert(usedBufCount < usedItems.size() + unusedItems.size());

+            // Move some used to unused.

+            while(usedBufCount < usedItems.size())

+            {

+                size_t index = threadRand.Generate() % usedItems.size();

+                unusedItems.push_back(usedItems[index]);

+                usedItems.erase(usedItems.begin() + index);

+            }

+            // Move some unused to used.

+            while(usedBufCount > usedItems.size())

+            {

+                size_t index = threadRand.Generate() % unusedItems.size();

+                usedItems.push_back(unusedItems[index]);

+                unusedItems.erase(unusedItems.begin() + index);

+            }

+

+            uint32_t touchExistingCount = 0;

+            uint32_t touchLostCount = 0;

+            uint32_t createSucceededCount = 0;

+            uint32_t createFailedCount = 0;

+

+            // Touch all used bufs. If not created or lost, allocate.

+            for(size_t i = 0; i < usedItems.size(); ++i)

+            {

+                Item& item = usedItems[i];

+                // Not yet created.

+                if(item.Alloc == VK_NULL_HANDLE)

+                {

+                    res = Allocate(item);

+                    ++outThreadResult->AllocationCount;

+                    if(res != VK_SUCCESS)

+                    {

+                        item.Alloc = VK_NULL_HANDLE;

+                        item.Buf = VK_NULL_HANDLE;

+                        ++outThreadResult->FailedAllocationCount;

+                        outThreadResult->FailedAllocationTotalSize += item.CalcSizeBytes();

+                        ++createFailedCount;

+                    }

+                    else

+                        ++createSucceededCount;

+                }

+                else

+                {

+                    // Touch.

+                    VmaAllocationInfo allocInfo;

+                    vmaGetAllocationInfo(g_hAllocator, item.Alloc, &allocInfo);

+                    // Lost.

+                    if(allocInfo.deviceMemory == VK_NULL_HANDLE)

+                    {

+                        ++touchLostCount;

+

+                        // Destroy.

+                        {

+                            PoolDeallocationTimeRegisterObj timeRegisterObj(*outThreadResult);

+                            if(item.Buf)

+                                vmaDestroyBuffer(g_hAllocator, item.Buf, item.Alloc);

+                            else

+                                vmaDestroyImage(g_hAllocator, item.Image, item.Alloc);

+                            ++outThreadResult->DeallocationCount;

+                        }

+                        item.Alloc = VK_NULL_HANDLE;

+                        item.Buf = VK_NULL_HANDLE;

+

+                        ++outThreadResult->LostAllocationCount;

+                        outThreadResult->LostAllocationTotalSize += item.CalcSizeBytes();

+

+                        // Recreate.

+                        res = Allocate(item);

+                        ++outThreadResult->AllocationCount;

+                        // Creation failed.

+                        if(res != VK_SUCCESS)

+                        {

+                            ++outThreadResult->FailedAllocationCount;

+                            outThreadResult->FailedAllocationTotalSize += item.CalcSizeBytes();

+                            ++createFailedCount;

+                        }

+                        else

+                            ++createSucceededCount;

+                    }

+                    else

+                        ++touchExistingCount;

+                }

+            }

+ 

+            /*

+            printf("Thread %u frame %u: Touch existing %u lost %u, create succeeded %u failed %u\n",

+                randSeed, frameIndex,

+                touchExistingCount, touchLostCount,

+                createSucceededCount, createFailedCount);

+            */

+

+            SetEvent(frameEndEvent);

+        }

+

+        // Free all remaining items.

+        for(size_t i = usedItems.size(); i--; )

+        {

+            PoolDeallocationTimeRegisterObj timeRegisterObj(*outThreadResult);

+            if(usedItems[i].Buf)

+                vmaDestroyBuffer(g_hAllocator, usedItems[i].Buf, usedItems[i].Alloc);

+            else

+                vmaDestroyImage(g_hAllocator, usedItems[i].Image, usedItems[i].Alloc);

+            ++outThreadResult->DeallocationCount;

+        }

+        for(size_t i = unusedItems.size(); i--; )

+        {

+            PoolDeallocationTimeRegisterObj timeRegisterOb(*outThreadResult);

+            if(unusedItems[i].Buf)

+                vmaDestroyBuffer(g_hAllocator, unusedItems[i].Buf, unusedItems[i].Alloc);

+            else

+                vmaDestroyImage(g_hAllocator, unusedItems[i].Image, unusedItems[i].Alloc);

+            ++outThreadResult->DeallocationCount;

+        }

+    };

+

+    // Launch threads.

+    uint32_t threadRandSeed = mainRand.Generate();

+    std::vector<HANDLE> frameStartEvents{config.ThreadCount};

+    std::vector<HANDLE> frameEndEvents{config.ThreadCount};

+    std::vector<std::thread> bkgThreads;

+    std::vector<PoolTestThreadResult> threadResults{config.ThreadCount};

+    for(uint32_t threadIndex = 0; threadIndex < config.ThreadCount; ++threadIndex)

+    {

+        frameStartEvents[threadIndex] = CreateEvent(NULL, FALSE, FALSE, NULL);

+        frameEndEvents[threadIndex] = CreateEvent(NULL, FALSE, FALSE, NULL);

+        bkgThreads.emplace_back(std::bind(

+            ThreadProc,

+            &threadResults[threadIndex],

+            threadRandSeed + threadIndex,

+            frameStartEvents[threadIndex],

+            frameEndEvents[threadIndex]));

+    }

+

+    // Execute frames.

+    assert(config.ThreadCount <= MAXIMUM_WAIT_OBJECTS);

+    for(uint32_t frameIndex = 0; frameIndex < config.FrameCount; ++frameIndex)

+    {

+        vmaSetCurrentFrameIndex(g_hAllocator, frameIndex);

+        for(size_t threadIndex = 0; threadIndex < config.ThreadCount; ++threadIndex)

+            SetEvent(frameStartEvents[threadIndex]);

+        WaitForMultipleObjects(config.ThreadCount, &frameEndEvents[0], TRUE, INFINITE);

+    }

+

+    // Wait for threads finished

+    for(size_t i = 0; i < bkgThreads.size(); ++i)

+    {

+        bkgThreads[i].join();

+        CloseHandle(frameEndEvents[i]);

+        CloseHandle(frameStartEvents[i]);

+    }

+    bkgThreads.clear();

+

+    // Finish time measurement - before destroying pool.

+    outResult.TotalTime = std::chrono::high_resolution_clock::now() - timeBeg;

+

+    vmaDestroyPool(g_hAllocator, pool);

+

+    outResult.AllocationTimeMin = duration::max();

+    outResult.AllocationTimeAvg = duration::zero();

+    outResult.AllocationTimeMax = duration::min();

+    outResult.DeallocationTimeMin = duration::max();

+    outResult.DeallocationTimeAvg = duration::zero();

+    outResult.DeallocationTimeMax = duration::min();

+    outResult.LostAllocationCount = 0;

+    outResult.LostAllocationTotalSize = 0;

+    outResult.FailedAllocationCount = 0;

+    outResult.FailedAllocationTotalSize = 0;

+    size_t allocationCount = 0;

+    size_t deallocationCount = 0;

+    for(size_t threadIndex = 0; threadIndex < config.ThreadCount; ++threadIndex)

+    {

+        const PoolTestThreadResult& threadResult = threadResults[threadIndex];

+        outResult.AllocationTimeMin = std::min(outResult.AllocationTimeMin, threadResult.AllocationTimeMin);

+        outResult.AllocationTimeMax = std::max(outResult.AllocationTimeMax, threadResult.AllocationTimeMax);

+        outResult.AllocationTimeAvg += threadResult.AllocationTimeSum;

+        outResult.DeallocationTimeMin = std::min(outResult.DeallocationTimeMin, threadResult.DeallocationTimeMin);

+        outResult.DeallocationTimeMax = std::max(outResult.DeallocationTimeMax, threadResult.DeallocationTimeMax);

+        outResult.DeallocationTimeAvg += threadResult.DeallocationTimeSum;

+        allocationCount += threadResult.AllocationCount;

+        deallocationCount += threadResult.DeallocationCount;

+        outResult.FailedAllocationCount += threadResult.FailedAllocationCount;

+        outResult.FailedAllocationTotalSize += threadResult.FailedAllocationTotalSize;

+        outResult.LostAllocationCount += threadResult.LostAllocationCount;

+        outResult.LostAllocationTotalSize += threadResult.LostAllocationTotalSize;

+    }

+    if(allocationCount)

+        outResult.AllocationTimeAvg /= allocationCount;

+    if(deallocationCount)

+        outResult.DeallocationTimeAvg /= deallocationCount;

+}

+

+static inline bool MemoryRegionsOverlap(char* ptr1, size_t size1, char* ptr2, size_t size2)

+{

+    if(ptr1 < ptr2)

+        return ptr1 + size1 > ptr2;

+    else if(ptr2 < ptr1)

+        return ptr2 + size2 > ptr1;

+    else

+        return true;

+}

+

+static void TestMapping()

+{

+    wprintf(L"Testing mapping...\n");

+

+    VkResult res;

+    uint32_t memTypeIndex = UINT32_MAX;

+

+    enum TEST

+    {

+        TEST_NORMAL,

+        TEST_POOL,

+        TEST_DEDICATED,

+        TEST_COUNT

+    };

+    for(uint32_t testIndex = 0; testIndex < TEST_COUNT; ++testIndex)

+    {

+        VmaPool pool = nullptr;

+        if(testIndex == TEST_POOL)

+        {

+            assert(memTypeIndex != UINT32_MAX);

+            VmaPoolCreateInfo poolInfo = {};

+            poolInfo.memoryTypeIndex = memTypeIndex;

+            res = vmaCreatePool(g_hAllocator, &poolInfo, &pool);

+            assert(res == VK_SUCCESS);

+        }

+

+        VkBufferCreateInfo bufInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+        bufInfo.size = 0x10000;

+        bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

+    

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+        allocCreateInfo.pool = pool;

+        if(testIndex == TEST_DEDICATED)

+            allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

+    

+        VmaAllocationInfo allocInfo;

+    

+        // Mapped manually

+

+        // Create 2 buffers.

+        BufferInfo bufferInfos[3];

+        for(size_t i = 0; i < 2; ++i)

+        {

+            res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo,

+                &bufferInfos[i].Buffer, &bufferInfos[i].Allocation, &allocInfo);

+            assert(res == VK_SUCCESS);

+            assert(allocInfo.pMappedData == nullptr);

+            memTypeIndex = allocInfo.memoryType;

+        }

+    

+        // Map buffer 0.

+        char* data00 = nullptr;

+        res = vmaMapMemory(g_hAllocator, bufferInfos[0].Allocation, (void**)&data00);

+        assert(res == VK_SUCCESS && data00 != nullptr);

+        data00[0xFFFF] = data00[0];

+

+        // Map buffer 0 second time.

+        char* data01 = nullptr;

+        res = vmaMapMemory(g_hAllocator, bufferInfos[0].Allocation, (void**)&data01);

+        assert(res == VK_SUCCESS && data01 == data00);

+

+        // Map buffer 1.

+        char* data1 = nullptr;

+        res = vmaMapMemory(g_hAllocator, bufferInfos[1].Allocation, (void**)&data1);

+        assert(res == VK_SUCCESS && data1 != nullptr);

+        assert(!MemoryRegionsOverlap(data00, (size_t)bufInfo.size, data1, (size_t)bufInfo.size));

+        data1[0xFFFF] = data1[0];

+

+        // Unmap buffer 0 two times.

+        vmaUnmapMemory(g_hAllocator, bufferInfos[0].Allocation);

+        vmaUnmapMemory(g_hAllocator, bufferInfos[0].Allocation);

+        vmaGetAllocationInfo(g_hAllocator, bufferInfos[0].Allocation, &allocInfo);

+        assert(allocInfo.pMappedData == nullptr);

+

+        // Unmap buffer 1.

+        vmaUnmapMemory(g_hAllocator, bufferInfos[1].Allocation);

+        vmaGetAllocationInfo(g_hAllocator, bufferInfos[1].Allocation, &allocInfo);

+        assert(allocInfo.pMappedData == nullptr);

+

+        // Create 3rd buffer - persistently mapped.

+        allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT;

+        res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo,

+            &bufferInfos[2].Buffer, &bufferInfos[2].Allocation, &allocInfo);

+        assert(res == VK_SUCCESS && allocInfo.pMappedData != nullptr);

+

+        // Map buffer 2.

+        char* data2 = nullptr;

+        res = vmaMapMemory(g_hAllocator, bufferInfos[2].Allocation, (void**)&data2);

+        assert(res == VK_SUCCESS && data2 == allocInfo.pMappedData);

+        data2[0xFFFF] = data2[0];

+

+        // Unmap buffer 2.

+        vmaUnmapMemory(g_hAllocator, bufferInfos[2].Allocation);

+        vmaGetAllocationInfo(g_hAllocator, bufferInfos[2].Allocation, &allocInfo);

+        assert(allocInfo.pMappedData == data2);

+

+        // Destroy all buffers.

+        for(size_t i = 3; i--; )

+            vmaDestroyBuffer(g_hAllocator, bufferInfos[i].Buffer, bufferInfos[i].Allocation);

+

+        vmaDestroyPool(g_hAllocator, pool);

+    }

+}

+

+static void TestMappingMultithreaded()

+{

+    wprintf(L"Testing mapping multithreaded...\n");

+

+    static const uint32_t threadCount = 16;

+    static const uint32_t bufferCount = 1024;

+    static const uint32_t threadBufferCount = bufferCount / threadCount;

+

+    VkResult res;

+    volatile uint32_t memTypeIndex = UINT32_MAX;

+

+    enum TEST

+    {

+        TEST_NORMAL,

+        TEST_POOL,

+        TEST_DEDICATED,

+        TEST_COUNT

+    };

+    for(uint32_t testIndex = 0; testIndex < TEST_COUNT; ++testIndex)

+    {

+        VmaPool pool = nullptr;

+        if(testIndex == TEST_POOL)

+        {

+            assert(memTypeIndex != UINT32_MAX);

+            VmaPoolCreateInfo poolInfo = {};

+            poolInfo.memoryTypeIndex = memTypeIndex;

+            res = vmaCreatePool(g_hAllocator, &poolInfo, &pool);

+            assert(res == VK_SUCCESS);

+        }

+

+        VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+        bufCreateInfo.size = 0x10000;

+        bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

+    

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+        allocCreateInfo.pool = pool;

+        if(testIndex == TEST_DEDICATED)

+            allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;

+    

+        std::thread threads[threadCount];

+        for(uint32_t threadIndex = 0; threadIndex < threadCount; ++threadIndex)

+        {

+            threads[threadIndex] = std::thread([=, &memTypeIndex](){

+                // ======== THREAD FUNCTION ========

+

+                RandomNumberGenerator rand{threadIndex};

+                

+                enum class MODE

+                {

+                    // Don't map this buffer at all.

+                    DONT_MAP,

+                    // Map and quickly unmap.

+                    MAP_FOR_MOMENT,

+                    // Map and unmap before destruction.

+                    MAP_FOR_LONGER,

+                    // Map two times. Quickly unmap, second unmap before destruction.

+                    MAP_TWO_TIMES,

+                    // Create this buffer as persistently mapped.

+                    PERSISTENTLY_MAPPED,

+                    COUNT

+                };

+                std::vector<BufferInfo> bufInfos{threadBufferCount};

+                std::vector<MODE> bufModes{threadBufferCount};

+                

+                for(uint32_t bufferIndex = 0; bufferIndex < threadBufferCount; ++bufferIndex)

+                {

+                    BufferInfo& bufInfo = bufInfos[bufferIndex];

+                    const MODE mode = (MODE)(rand.Generate() % (uint32_t)MODE::COUNT);

+                    bufModes[bufferIndex] = mode;

+

+                    VmaAllocationCreateInfo localAllocCreateInfo = allocCreateInfo;

+                    if(mode == MODE::PERSISTENTLY_MAPPED)

+                        localAllocCreateInfo.flags |= VMA_ALLOCATION_CREATE_MAPPED_BIT;

+                    

+                    VmaAllocationInfo allocInfo;

+                    VkResult res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &localAllocCreateInfo,

+                        &bufInfo.Buffer, &bufInfo.Allocation, &allocInfo);

+                    assert(res == VK_SUCCESS);

+                    

+                    if(memTypeIndex == UINT32_MAX)

+                        memTypeIndex = allocInfo.memoryType;

+

+                    char* data = nullptr;

+

+                    if(mode == MODE::PERSISTENTLY_MAPPED)

+                    {

+                        data = (char*)allocInfo.pMappedData;

+                        assert(data != nullptr);

+                    }

+                    else if(mode == MODE::MAP_FOR_MOMENT || mode == MODE::MAP_FOR_LONGER ||

+                        mode == MODE::MAP_TWO_TIMES)

+                    {

+                        assert(data == nullptr);

+                        res = vmaMapMemory(g_hAllocator, bufInfo.Allocation, (void**)&data);

+                        assert(res == VK_SUCCESS && data != nullptr);

+

+                        if(mode == MODE::MAP_TWO_TIMES)

+                        {

+                            char* data2 = nullptr;

+                            res = vmaMapMemory(g_hAllocator, bufInfo.Allocation, (void**)&data2);

+                            assert(res == VK_SUCCESS && data2 == data);

+                        }

+                    }

+                    else if(mode == MODE::DONT_MAP)

+                    {

+                        assert(allocInfo.pMappedData == nullptr);

+                    }

+                    else

+                        assert(0);

+

+                    // Test if reading and writing from the beginning and end of mapped memory doesn't crash.

+                    if(data)

+                        data[0xFFFF] = data[0];

+

+                    if(mode == MODE::MAP_FOR_MOMENT || mode == MODE::MAP_TWO_TIMES)

+                    {

+                        vmaUnmapMemory(g_hAllocator, bufInfo.Allocation);

+

+                        VmaAllocationInfo allocInfo;

+                        vmaGetAllocationInfo(g_hAllocator, bufInfo.Allocation, &allocInfo);

+                        if(mode == MODE::MAP_FOR_MOMENT)

+                            assert(allocInfo.pMappedData == nullptr);

+                        else

+                            assert(allocInfo.pMappedData == data);

+                    }

+

+                    switch(rand.Generate() % 3)

+                    {

+                    case 0: Sleep(0); break; // Yield.

+                    case 1: Sleep(10); break; // 10 ms

+                    // default: No sleep.

+                    }

+

+                    // Test if reading and writing from the beginning and end of mapped memory doesn't crash.

+                    if(data)

+                        data[0xFFFF] = data[0];

+                }

+

+                for(size_t bufferIndex = threadBufferCount; bufferIndex--; )

+                {

+                    if(bufModes[bufferIndex] == MODE::MAP_FOR_LONGER ||

+                        bufModes[bufferIndex] == MODE::MAP_TWO_TIMES)

+                    {

+                        vmaUnmapMemory(g_hAllocator, bufInfos[bufferIndex].Allocation);

+

+                        VmaAllocationInfo allocInfo;

+                        vmaGetAllocationInfo(g_hAllocator, bufInfos[bufferIndex].Allocation, &allocInfo);

+                        assert(allocInfo.pMappedData == nullptr);

+                    }

+

+                    vmaDestroyBuffer(g_hAllocator, bufInfos[bufferIndex].Buffer, bufInfos[bufferIndex].Allocation);

+                }

+            });

+        }

+

+        for(uint32_t threadIndex = 0; threadIndex < threadCount; ++threadIndex)

+            threads[threadIndex].join();

+    

+        vmaDestroyPool(g_hAllocator, pool);

+    }

+}

+

+static void WriteMainTestResultHeader(FILE* file)

+{

+    fprintf(file,

+        "Code,Test,Time,"

+        "Config,"

+        "Total Time (us),"

+        "Allocation Time Min (us),"

+        "Allocation Time Avg (us),"

+        "Allocation Time Max (us),"

+        "Deallocation Time Min (us),"

+        "Deallocation Time Avg (us),"

+        "Deallocation Time Max (us),"

+        "Total Memory Allocated (B),"

+        "Free Range Size Avg (B),"

+        "Free Range Size Max (B)\n");

+}

+

+static void WriteMainTestResult(

+    FILE* file,

+    const char* codeDescription,

+    const char* testDescription,

+    const Config& config, const Result& result)

+{

+    float totalTimeSeconds = ToFloatSeconds(result.TotalTime);

+    float allocationTimeMinSeconds = ToFloatSeconds(result.AllocationTimeMin);

+    float allocationTimeAvgSeconds = ToFloatSeconds(result.AllocationTimeAvg);

+    float allocationTimeMaxSeconds = ToFloatSeconds(result.AllocationTimeMax);

+    float deallocationTimeMinSeconds = ToFloatSeconds(result.DeallocationTimeMin);

+    float deallocationTimeAvgSeconds = ToFloatSeconds(result.DeallocationTimeAvg);

+    float deallocationTimeMaxSeconds = ToFloatSeconds(result.DeallocationTimeMax);

+

+    time_t rawTime; time(&rawTime);

+    struct tm timeInfo; localtime_s(&timeInfo, &rawTime);

+    char timeStr[128];

+    strftime(timeStr, _countof(timeStr), "%c", &timeInfo);

+

+    fprintf(file,

+        "%s,%s,%s,"

+        "BeginBytesToAllocate=%I64u MaxBytesToAllocate=%I64u AdditionalOperationCount=%u ThreadCount=%u FreeOrder=%d,"

+        "%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%I64u,%I64u,%I64u\n",

+        codeDescription,

+        testDescription,

+        timeStr,

+        config.BeginBytesToAllocate, config.MaxBytesToAllocate, config.AdditionalOperationCount, config.ThreadCount, (uint32_t)config.FreeOrder,

+        totalTimeSeconds * 1e6f,

+        allocationTimeMinSeconds * 1e6f,

+        allocationTimeAvgSeconds * 1e6f,

+        allocationTimeMaxSeconds * 1e6f,

+        deallocationTimeMinSeconds * 1e6f,

+        deallocationTimeAvgSeconds * 1e6f,

+        deallocationTimeMaxSeconds * 1e6f,

+        result.TotalMemoryAllocated,

+        result.FreeRangeSizeAvg,

+        result.FreeRangeSizeMax);

+}

+

+static void WritePoolTestResultHeader(FILE* file)

+{

+    fprintf(file,

+        "Code,Test,Time,"

+        "Config,"

+        "Total Time (us),"

+        "Allocation Time Min (us),"

+        "Allocation Time Avg (us),"

+        "Allocation Time Max (us),"

+        "Deallocation Time Min (us),"

+        "Deallocation Time Avg (us),"

+        "Deallocation Time Max (us),"

+        "Lost Allocation Count,"

+        "Lost Allocation Total Size (B),"

+        "Failed Allocation Count,"

+        "Failed Allocation Total Size (B)\n");

+}

+

+static void WritePoolTestResult(

+    FILE* file,

+    const char* codeDescription,

+    const char* testDescription,

+    const PoolTestConfig& config,

+    const PoolTestResult& result)

+{

+    float totalTimeSeconds = ToFloatSeconds(result.TotalTime);

+    float allocationTimeMinSeconds = ToFloatSeconds(result.AllocationTimeMin);

+    float allocationTimeAvgSeconds = ToFloatSeconds(result.AllocationTimeAvg);

+    float allocationTimeMaxSeconds = ToFloatSeconds(result.AllocationTimeMax);

+    float deallocationTimeMinSeconds = ToFloatSeconds(result.DeallocationTimeMin);

+    float deallocationTimeAvgSeconds = ToFloatSeconds(result.DeallocationTimeAvg);

+    float deallocationTimeMaxSeconds = ToFloatSeconds(result.DeallocationTimeMax);

+

+    time_t rawTime; time(&rawTime);

+    struct tm timeInfo; localtime_s(&timeInfo, &rawTime);

+    char timeStr[128];

+    strftime(timeStr, _countof(timeStr), "%c", &timeInfo);

+

+    fprintf(file,

+        "%s,%s,%s,"

+        "ThreadCount=%u PoolSize=%llu FrameCount=%u TotalItemCount=%u UsedItemCount=%u...%u ItemsToMakeUnusedPercent=%u,"

+        "%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%I64u,%I64u,%I64u,%I64u\n",

+        // General

+        codeDescription,

+        testDescription,

+        timeStr,

+        // Config

+        config.ThreadCount,

+        (unsigned long long)config.PoolSize,

+        config.FrameCount,

+        config.TotalItemCount,

+        config.UsedItemCountMin,

+        config.UsedItemCountMax,

+        config.ItemsToMakeUnusedPercent,

+        // Results

+        totalTimeSeconds * 1e6f,

+        allocationTimeMinSeconds * 1e6f,

+        allocationTimeAvgSeconds * 1e6f,

+        allocationTimeMaxSeconds * 1e6f,

+        deallocationTimeMinSeconds * 1e6f,

+        deallocationTimeAvgSeconds * 1e6f,

+        deallocationTimeMaxSeconds * 1e6f,

+        result.LostAllocationCount,

+        result.LostAllocationTotalSize,

+        result.FailedAllocationCount,

+        result.FailedAllocationTotalSize);

+}

+

+static void PerformCustomMainTest(FILE* file)

+{

+    Config config{};

+    config.RandSeed = 65735476;

+    //config.MaxBytesToAllocate = 4ull * 1024 * 1024; // 4 MB

+    config.MaxBytesToAllocate = 4ull * 1024 * 1024 * 1024; // 4 GB

+    config.MemUsageProbability[0] = 1; // VMA_MEMORY_USAGE_GPU_ONLY

+    config.FreeOrder = FREE_ORDER::FORWARD;

+    config.ThreadCount = 16;

+    config.ThreadsUsingCommonAllocationsProbabilityPercent = 50;

+

+    // Buffers

+    //config.AllocationSizes.push_back({4, 16, 1024});

+    config.AllocationSizes.push_back({4, 0x10000, 0xA00000}); // 64 KB ... 10 MB

+

+    // Images

+    //config.AllocationSizes.push_back({4, 0, 0, 4, 32});

+    //config.AllocationSizes.push_back({4, 0, 0, 256, 2048});

+

+    config.BeginBytesToAllocate = config.MaxBytesToAllocate * 5 / 100;

+    config.AdditionalOperationCount = 1024;

+

+    Result result{};

+    VkResult res = MainTest(result, config);

+    assert(res == VK_SUCCESS);

+    WriteMainTestResult(file, "Foo", "CustomTest", config, result);

+}

+

+static void PerformCustomPoolTest(FILE* file)

+{

+    PoolTestConfig config;

+    config.PoolSize = 100 * 1024 * 1024;

+    config.RandSeed = 2345764;

+    config.ThreadCount = 1;

+    config.FrameCount = 200;

+    config.ItemsToMakeUnusedPercent = 2;

+    

+    AllocationSize allocSize = {};

+    allocSize.BufferSizeMin = 1024;

+    allocSize.BufferSizeMax = 1024 * 1024;

+    allocSize.Probability = 1;

+    config.AllocationSizes.push_back(allocSize);

+

+    allocSize.BufferSizeMin = 0;

+    allocSize.BufferSizeMax = 0;

+    allocSize.ImageSizeMin = 128;

+    allocSize.ImageSizeMax = 1024;

+    allocSize.Probability = 1;

+    config.AllocationSizes.push_back(allocSize);

+

+    config.PoolSize = config.CalcAvgResourceSize() * 200;

+    config.UsedItemCountMax = 160;

+    config.TotalItemCount = config.UsedItemCountMax * 10;

+    config.UsedItemCountMin = config.UsedItemCountMax * 80 / 100;

+

+    g_MemoryAliasingWarningEnabled = false;

+    PoolTestResult result = {};

+    TestPool_Benchmark(result, config);

+    g_MemoryAliasingWarningEnabled = true;

+

+    WritePoolTestResult(file, "Code desc", "Test desc", config, result);

+}

+

+enum CONFIG_TYPE {

+    CONFIG_TYPE_MINIMUM,

+    CONFIG_TYPE_SMALL,

+    CONFIG_TYPE_AVERAGE,

+    CONFIG_TYPE_LARGE,

+    CONFIG_TYPE_MAXIMUM,

+    CONFIG_TYPE_COUNT

+};

+

+static constexpr CONFIG_TYPE ConfigType = CONFIG_TYPE_SMALL;

+//static constexpr CONFIG_TYPE ConfigType = CONFIG_TYPE_LARGE;

+static const char* CODE_DESCRIPTION = "Foo";

+

+static void PerformMainTests(FILE* file)

+{

+    uint32_t repeatCount = 1;

+    if(ConfigType >= CONFIG_TYPE_MAXIMUM) repeatCount = 3;

+

+    Config config{};

+    config.RandSeed = 65735476;

+    config.MemUsageProbability[0] = 1; // VMA_MEMORY_USAGE_GPU_ONLY

+    config.FreeOrder = FREE_ORDER::FORWARD;

+

+    size_t threadCountCount = 1;

+    switch(ConfigType)

+    {

+    case CONFIG_TYPE_MINIMUM: threadCountCount = 1; break;

+    case CONFIG_TYPE_SMALL:   threadCountCount = 2; break;

+    case CONFIG_TYPE_AVERAGE: threadCountCount = 3; break;

+    case CONFIG_TYPE_LARGE:   threadCountCount = 5; break;

+    case CONFIG_TYPE_MAXIMUM: threadCountCount = 7; break;

+    default: assert(0);

+    }

+    for(size_t threadCountIndex = 0; threadCountIndex < threadCountCount; ++threadCountIndex)

+    {

+        std::string desc1;

+

+        switch(threadCountIndex)

+        {

+        case 0:

+            desc1 += "1_thread";

+            config.ThreadCount = 1;

+            config.ThreadsUsingCommonAllocationsProbabilityPercent = 0;

+            break;

+        case 1:

+            desc1 += "16_threads+0%_common";

+            config.ThreadCount = 16;

+            config.ThreadsUsingCommonAllocationsProbabilityPercent = 0;

+            break;

+        case 2:

+            desc1 += "16_threads+50%_common";

+            config.ThreadCount = 16;

+            config.ThreadsUsingCommonAllocationsProbabilityPercent = 50;

+            break;

+        case 3:

+            desc1 += "16_threads+100%_common";

+            config.ThreadCount = 16;

+            config.ThreadsUsingCommonAllocationsProbabilityPercent = 100;

+            break;

+        case 4:

+            desc1 += "2_threads+0%_common";

+            config.ThreadCount = 2;

+            config.ThreadsUsingCommonAllocationsProbabilityPercent = 0;

+            break;

+        case 5:

+            desc1 += "2_threads+50%_common";

+            config.ThreadCount = 2;

+            config.ThreadsUsingCommonAllocationsProbabilityPercent = 50;

+            break;

+        case 6:

+            desc1 += "2_threads+100%_common";

+            config.ThreadCount = 2;

+            config.ThreadsUsingCommonAllocationsProbabilityPercent = 100;

+            break;

+        default:

+            assert(0);

+        }

+

+        // 0 = buffers, 1 = images, 2 = buffers and images

+        size_t buffersVsImagesCount = 2;

+        if(ConfigType >= CONFIG_TYPE_LARGE) ++buffersVsImagesCount;

+        for(size_t buffersVsImagesIndex = 0; buffersVsImagesIndex < buffersVsImagesCount; ++buffersVsImagesIndex)

+        {

+            std::string desc2 = desc1;

+            switch(buffersVsImagesIndex)

+            {

+            case 0: desc2 += " Buffers"; break;

+            case 1: desc2 += " Images"; break;

+            case 2: desc2 += " Buffers+Images"; break;

+            default: assert(0);

+            }

+

+            // 0 = small, 1 = large, 2 = small and large

+            size_t smallVsLargeCount = 2;

+            if(ConfigType >= CONFIG_TYPE_LARGE) ++smallVsLargeCount;

+            for(size_t smallVsLargeIndex = 0; smallVsLargeIndex < smallVsLargeCount; ++smallVsLargeIndex)

+            {

+                std::string desc3 = desc2;

+                switch(smallVsLargeIndex)

+                {

+                case 0: desc3 += " Small"; break;

+                case 1: desc3 += " Large"; break;

+                case 2: desc3 += " Small+Large"; break;

+                default: assert(0);

+                }

+

+                if(smallVsLargeIndex == 1 || smallVsLargeIndex == 2)

+                    config.MaxBytesToAllocate = 4ull * 1024 * 1024 * 1024; // 4 GB

+                else

+                    config.MaxBytesToAllocate = 4ull * 1024 * 1024;

+

+                // 0 = varying sizes min...max, 1 = set of constant sizes

+                size_t constantSizesCount = 1;

+                if(ConfigType >= CONFIG_TYPE_SMALL) ++constantSizesCount;

+                for(size_t constantSizesIndex = 0; constantSizesIndex < constantSizesCount; ++constantSizesIndex)

+                {

+                    std::string desc4 = desc3;

+                    switch(constantSizesIndex)

+                    {

+                    case 0: desc4 += " Varying_sizes"; break;

+                    case 1: desc4 += " Constant_sizes"; break;

+                    default: assert(0);

+                    }

+

+                    config.AllocationSizes.clear();

+                    // Buffers present

+                    if(buffersVsImagesIndex == 0 || buffersVsImagesIndex == 2)

+                    {

+                        // Small

+                        if(smallVsLargeIndex == 0 || smallVsLargeIndex == 2)

+                        {

+                            // Varying size

+                            if(constantSizesIndex == 0)

+                                config.AllocationSizes.push_back({4, 16, 1024});

+                            // Constant sizes

+                            else

+                            {

+                                config.AllocationSizes.push_back({1, 16, 16});

+                                config.AllocationSizes.push_back({1, 64, 64});

+                                config.AllocationSizes.push_back({1, 256, 256});

+                                config.AllocationSizes.push_back({1, 1024, 1024});

+                            }

+                        }

+                        // Large

+                        if(smallVsLargeIndex == 1 || smallVsLargeIndex == 2)

+                        {

+                            // Varying size

+                            if(constantSizesIndex == 0)

+                                config.AllocationSizes.push_back({4, 0x10000, 0xA00000}); // 64 KB ... 10 MB

+                            // Constant sizes

+                            else

+                            {

+                                config.AllocationSizes.push_back({1, 0x10000, 0x10000});

+                                config.AllocationSizes.push_back({1, 0x80000, 0x80000});

+                                config.AllocationSizes.push_back({1, 0x200000, 0x200000});

+                                config.AllocationSizes.push_back({1, 0xA00000, 0xA00000});

+                            }

+                        }

+                    }

+                    // Images present

+                    if(buffersVsImagesIndex == 1 || buffersVsImagesIndex == 2)

+                    {

+                        // Small

+                        if(smallVsLargeIndex == 0 || smallVsLargeIndex == 2)

+                        {

+                            // Varying size

+                            if(constantSizesIndex == 0)

+                                config.AllocationSizes.push_back({4, 0, 0, 4, 32});

+                            // Constant sizes

+                            else

+                            {

+                                config.AllocationSizes.push_back({1, 0, 0,  4,  4});

+                                config.AllocationSizes.push_back({1, 0, 0,  8,  8});

+                                config.AllocationSizes.push_back({1, 0, 0, 16, 16});

+                                config.AllocationSizes.push_back({1, 0, 0, 32, 32});

+                            }

+                        }

+                        // Large

+                        if(smallVsLargeIndex == 1 || smallVsLargeIndex == 2)

+                        {

+                            // Varying size

+                            if(constantSizesIndex == 0)

+                                config.AllocationSizes.push_back({4, 0, 0, 256, 2048});

+                            // Constant sizes

+                            else

+                            {

+                                config.AllocationSizes.push_back({1, 0, 0,  256,  256});

+                                config.AllocationSizes.push_back({1, 0, 0,  512,  512});

+                                config.AllocationSizes.push_back({1, 0, 0, 1024, 1024});

+                                config.AllocationSizes.push_back({1, 0, 0, 2048, 2048});

+                            }

+                        }

+                    }

+

+                    // 0 = 100%, additional_operations = 0, 1 = 50%, 2 = 5%, 3 = 95% additional_operations = a lot

+                    size_t beginBytesToAllocateCount = 1;

+                    if(ConfigType >= CONFIG_TYPE_SMALL) ++beginBytesToAllocateCount;

+                    if(ConfigType >= CONFIG_TYPE_AVERAGE) ++beginBytesToAllocateCount;

+                    if(ConfigType >= CONFIG_TYPE_LARGE) ++beginBytesToAllocateCount;

+                    for(size_t beginBytesToAllocateIndex = 0; beginBytesToAllocateIndex < beginBytesToAllocateCount; ++beginBytesToAllocateIndex)

+                    {

+                        std::string desc5 = desc4;

+

+                        switch(beginBytesToAllocateIndex)

+                        {

+                        case 0:

+                            desc5 += " Allocate_100%";

+                            config.BeginBytesToAllocate = config.MaxBytesToAllocate;

+                            config.AdditionalOperationCount = 0;

+                            break;

+                        case 1:

+                            desc5 += " Allocate_50%+Operations";

+                            config.BeginBytesToAllocate = config.MaxBytesToAllocate * 50 / 100;

+                            config.AdditionalOperationCount = 1024;

+                            break;

+                        case 2:

+                            desc5 += " Allocate_5%+Operations";

+                            config.BeginBytesToAllocate = config.MaxBytesToAllocate *  5 / 100;

+                            config.AdditionalOperationCount = 1024;

+                            break;

+                        case 3:

+                            desc5 += " Allocate_95%+Operations";

+                            config.BeginBytesToAllocate = config.MaxBytesToAllocate * 95 / 100;

+                            config.AdditionalOperationCount = 1024;

+                            break;

+                        default:

+                            assert(0);

+                        }

+

+                        const char* testDescription = desc5.c_str();

+

+                        for(size_t repeat = 0; repeat < repeatCount; ++repeat)

+                        {

+                            printf("%s Repeat %u\n", testDescription, (uint32_t)repeat);

+

+                            Result result{};

+                            VkResult res = MainTest(result, config);

+                            assert(res == VK_SUCCESS);

+                            WriteMainTestResult(file, CODE_DESCRIPTION, testDescription, config, result);

+                        }

+                    }

+                }

+            }

+        }

+    }

+}

+

+static void PerformPoolTests(FILE* file)

+{

+    const size_t AVG_RESOURCES_PER_POOL = 300;

+

+    uint32_t repeatCount = 1;

+    if(ConfigType >= CONFIG_TYPE_MAXIMUM) repeatCount = 3;

+

+    PoolTestConfig config{};

+    config.RandSeed = 2346343;

+    config.FrameCount = 200;

+    config.ItemsToMakeUnusedPercent = 2;

+

+    size_t threadCountCount = 1;

+    switch(ConfigType)

+    {

+    case CONFIG_TYPE_MINIMUM: threadCountCount = 1; break;

+    case CONFIG_TYPE_SMALL:   threadCountCount = 2; break;

+    case CONFIG_TYPE_AVERAGE: threadCountCount = 2; break;

+    case CONFIG_TYPE_LARGE:   threadCountCount = 3; break;

+    case CONFIG_TYPE_MAXIMUM: threadCountCount = 3; break;

+    default: assert(0);

+    }

+    for(size_t threadCountIndex = 0; threadCountIndex < threadCountCount; ++threadCountIndex)

+    {

+        std::string desc1;

+

+        switch(threadCountIndex)

+        {

+        case 0:

+            desc1 += "1_thread";

+            config.ThreadCount = 1;

+            break;

+        case 1:

+            desc1 += "16_threads";

+            config.ThreadCount = 16;

+            break;

+        case 2:

+            desc1 += "2_threads";

+            config.ThreadCount = 2;

+            break;

+        default:

+            assert(0);

+        }

+

+        // 0 = buffers, 1 = images, 2 = buffers and images

+        size_t buffersVsImagesCount = 2;

+        if(ConfigType >= CONFIG_TYPE_LARGE) ++buffersVsImagesCount;

+        for(size_t buffersVsImagesIndex = 0; buffersVsImagesIndex < buffersVsImagesCount; ++buffersVsImagesIndex)

+        {

+            std::string desc2 = desc1;

+            switch(buffersVsImagesIndex)

+            {

+            case 0: desc2 += " Buffers"; break;

+            case 1: desc2 += " Images"; break;

+            case 2: desc2 += " Buffers+Images"; break;

+            default: assert(0);

+            }

+

+            // 0 = small, 1 = large, 2 = small and large

+            size_t smallVsLargeCount = 2;

+            if(ConfigType >= CONFIG_TYPE_LARGE) ++smallVsLargeCount;

+            for(size_t smallVsLargeIndex = 0; smallVsLargeIndex < smallVsLargeCount; ++smallVsLargeIndex)

+            {

+                std::string desc3 = desc2;

+                switch(smallVsLargeIndex)

+                {

+                case 0: desc3 += " Small"; break;

+                case 1: desc3 += " Large"; break;

+                case 2: desc3 += " Small+Large"; break;

+                default: assert(0);

+                }

+

+                if(smallVsLargeIndex == 1 || smallVsLargeIndex == 2)

+                    config.PoolSize = 6ull * 1024 * 1024 * 1024; // 6 GB

+                else

+                    config.PoolSize = 4ull * 1024 * 1024;

+

+                // 0 = varying sizes min...max, 1 = set of constant sizes

+                size_t constantSizesCount = 1;

+                if(ConfigType >= CONFIG_TYPE_SMALL) ++constantSizesCount;

+                for(size_t constantSizesIndex = 0; constantSizesIndex < constantSizesCount; ++constantSizesIndex)

+                {

+                    std::string desc4 = desc3;

+                    switch(constantSizesIndex)

+                    {

+                    case 0: desc4 += " Varying_sizes"; break;

+                    case 1: desc4 += " Constant_sizes"; break;

+                    default: assert(0);

+                    }

+

+                    config.AllocationSizes.clear();

+                    // Buffers present

+                    if(buffersVsImagesIndex == 0 || buffersVsImagesIndex == 2)

+                    {

+                        // Small

+                        if(smallVsLargeIndex == 0 || smallVsLargeIndex == 2)

+                        {

+                            // Varying size

+                            if(constantSizesIndex == 0)

+                                config.AllocationSizes.push_back({4, 16, 1024});

+                            // Constant sizes

+                            else

+                            {

+                                config.AllocationSizes.push_back({1, 16, 16});

+                                config.AllocationSizes.push_back({1, 64, 64});

+                                config.AllocationSizes.push_back({1, 256, 256});

+                                config.AllocationSizes.push_back({1, 1024, 1024});

+                            }

+                        }

+                        // Large

+                        if(smallVsLargeIndex == 1 || smallVsLargeIndex == 2)

+                        {

+                            // Varying size

+                            if(constantSizesIndex == 0)

+                                config.AllocationSizes.push_back({4, 0x10000, 0xA00000}); // 64 KB ... 10 MB

+                            // Constant sizes

+                            else

+                            {

+                                config.AllocationSizes.push_back({1, 0x10000, 0x10000});

+                                config.AllocationSizes.push_back({1, 0x80000, 0x80000});

+                                config.AllocationSizes.push_back({1, 0x200000, 0x200000});

+                                config.AllocationSizes.push_back({1, 0xA00000, 0xA00000});

+                            }

+                        }

+                    }

+                    // Images present

+                    if(buffersVsImagesIndex == 1 || buffersVsImagesIndex == 2)

+                    {

+                        // Small

+                        if(smallVsLargeIndex == 0 || smallVsLargeIndex == 2)

+                        {

+                            // Varying size

+                            if(constantSizesIndex == 0)

+                                config.AllocationSizes.push_back({4, 0, 0, 4, 32});

+                            // Constant sizes

+                            else

+                            {

+                                config.AllocationSizes.push_back({1, 0, 0,  4,  4});

+                                config.AllocationSizes.push_back({1, 0, 0,  8,  8});

+                                config.AllocationSizes.push_back({1, 0, 0, 16, 16});

+                                config.AllocationSizes.push_back({1, 0, 0, 32, 32});

+                            }

+                        }

+                        // Large

+                        if(smallVsLargeIndex == 1 || smallVsLargeIndex == 2)

+                        {

+                            // Varying size

+                            if(constantSizesIndex == 0)

+                                config.AllocationSizes.push_back({4, 0, 0, 256, 2048});

+                            // Constant sizes

+                            else

+                            {

+                                config.AllocationSizes.push_back({1, 0, 0,  256,  256});

+                                config.AllocationSizes.push_back({1, 0, 0,  512,  512});

+                                config.AllocationSizes.push_back({1, 0, 0, 1024, 1024});

+                                config.AllocationSizes.push_back({1, 0, 0, 2048, 2048});

+                            }

+                        }

+                    }

+

+                    const VkDeviceSize avgResourceSize = config.CalcAvgResourceSize();

+                    config.PoolSize = avgResourceSize * AVG_RESOURCES_PER_POOL;

+

+                    // 0 = 66%, 1 = 133%, 2 = 100%, 3 = 33%, 4 = 166%

+                    size_t subscriptionModeCount;

+                    switch(ConfigType)

+                    {

+                    case CONFIG_TYPE_MINIMUM: subscriptionModeCount = 2; break;

+                    case CONFIG_TYPE_SMALL:   subscriptionModeCount = 2; break;

+                    case CONFIG_TYPE_AVERAGE: subscriptionModeCount = 3; break;

+                    case CONFIG_TYPE_LARGE:   subscriptionModeCount = 5; break;

+                    case CONFIG_TYPE_MAXIMUM: subscriptionModeCount = 5; break;

+                    default: assert(0);

+                    }

+                    for(size_t subscriptionModeIndex = 0; subscriptionModeIndex < subscriptionModeCount; ++subscriptionModeIndex)

+                    {

+                        std::string desc5 = desc4;

+

+                        switch(subscriptionModeIndex)

+                        {

+                        case 0:

+                            desc5 += " Subscription_66%";

+                            config.UsedItemCountMax = AVG_RESOURCES_PER_POOL * 66 / 100;

+                            break;

+                        case 1:

+                            desc5 += " Subscription_133%";

+                            config.UsedItemCountMax = AVG_RESOURCES_PER_POOL * 133 / 100;

+                            break;

+                        case 2:

+                            desc5 += " Subscription_100%";

+                            config.UsedItemCountMax = AVG_RESOURCES_PER_POOL;

+                            break;

+                        case 3:

+                            desc5 += " Subscription_33%";

+                            config.UsedItemCountMax = AVG_RESOURCES_PER_POOL * 33 / 100;

+                            break;

+                        case 4:

+                            desc5 += " Subscription_166%";

+                            config.UsedItemCountMax = AVG_RESOURCES_PER_POOL * 166 / 100;

+                            break;

+                        default:

+                            assert(0);

+                        }

+

+                        config.TotalItemCount = config.UsedItemCountMax * 5;

+                        config.UsedItemCountMin = config.UsedItemCountMax * 80 / 100;

+

+                        const char* testDescription = desc5.c_str();

+

+                        for(size_t repeat = 0; repeat < repeatCount; ++repeat)

+                        {

+                            printf("%s Repeat %u\n", testDescription, (uint32_t)repeat);

+

+                            PoolTestResult result{};

+                            g_MemoryAliasingWarningEnabled = false;

+                            TestPool_Benchmark(result, config);

+                            g_MemoryAliasingWarningEnabled = true;

+                            WritePoolTestResult(file, CODE_DESCRIPTION, testDescription, config, result);

+                        }

+                    }

+                }

+            }

+        }

+    }

+}

+

+void Test()

+{

+    wprintf(L"TESTING:\n");

+

+    // # Simple tests

+

+    TestBasics();

+    TestPool_SameSize();

+    TestHeapSizeLimit();

+    TestMapping();

+    TestMappingMultithreaded();

+    TestDefragmentationSimple();

+    TestDefragmentationFull();

+

+    // # Detailed tests

+    FILE* file;

+    fopen_s(&file, "Results.csv", "w");

+    assert(file != NULL);

+    

+    WriteMainTestResultHeader(file);

+    PerformMainTests(file);

+    //PerformCustomMainTest(file);

+

+    WritePoolTestResultHeader(file);

+    PerformPoolTests(file);

+    //PerformCustomPoolTest(file);

+    

+    fclose(file);

+

+    wprintf(L"Done.\n");

+}

+

+#endif // #ifdef _WIN32

diff --git a/src/Tests.h b/src/Tests.h
new file mode 100644
index 0000000..9da4f6f
--- /dev/null
+++ b/src/Tests.h
@@ -0,0 +1,10 @@
+#ifndef TESTS_H_

+#define TESTS_H_

+

+#ifdef _WIN32

+

+void Test();

+

+#endif // #ifdef _WIN32

+

+#endif

diff --git a/src/VmaUsage.cpp b/src/VmaUsage.cpp
new file mode 100644
index 0000000..2ebf69c
--- /dev/null
+++ b/src/VmaUsage.cpp
@@ -0,0 +1,8 @@
+/*

+In exactly one CPP file define macro VMA_IMPLEMENTATION and then include

+vk_mem_alloc.h to include definitions of its internal implementation

+*/

+

+#define VMA_IMPLEMENTATION

+

+#include "VmaUsage.h"

diff --git a/src/VmaUsage.h b/src/VmaUsage.h
new file mode 100644
index 0000000..70c8849
--- /dev/null
+++ b/src/VmaUsage.h
@@ -0,0 +1,39 @@
+#ifndef VMA_USAGE_H_

+#define VMA_USAGE_H_

+

+#ifdef _WIN32

+

+#define NOMINMAX

+#define WIN32_LEAN_AND_MEAN

+#include <Windows.h>

+#define VK_USE_PLATFORM_WIN32_KHR

+

+#include <vulkan/vulkan.h>

+

+/*

+In every place where you want to use Vulkan Memory Allocator, define appropriate

+macros if you want to configure the library and then include its header to

+include all public interface declarations. Example:

+*/

+

+//#define VMA_USE_STL_CONTAINERS 1

+

+//#define VMA_HEAVY_ASSERT(expr)

+

+#pragma warning(push, 4)

+#pragma warning(disable: 4127) // conditional expression is constant

+#pragma warning(disable: 4100) // unreferenced formal parameter

+#pragma warning(disable: 4189) // local variable is initialized but not referenced

+

+#include "vk_mem_alloc.h"

+

+#pragma warning(pop)

+

+#else // #ifdef _WIN32

+

+#include <vulkan/vulkan.h>

+#include "vk_mem_alloc.h"

+

+#endif // #ifdef _WIN32

+

+#endif

diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index f4a0a28..d3937b7 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -20,62 +20,38 @@
 // THE SOFTWARE.

 //

 

-#ifdef WIN32

+#ifdef _WIN32

 

-#define NOMINMAX

-#define WIN32_LEAN_AND_MEAN

-#include <Windows.h>

-

-#define VK_USE_PLATFORM_WIN32_KHR

-#include <vulkan/vulkan.h>

-

-#pragma warning(push, 4)

-#pragma warning(disable: 4127) // warning C4127: conditional expression is constant

-#pragma warning(disable: 4100) // warning C4100: '...': unreferenced formal parameter

-#pragma warning(disable: 4189) // warning C4189: '...': local variable is initialized but not referenced

-#define VMA_IMPLEMENTATION

-#include "vk_mem_alloc.h"

-#pragma warning(pop)

-

-#define MATHFU_COMPILE_WITHOUT_SIMD_SUPPORT

-#include <mathfu/glsl_mappings.h>

-#include <mathfu/constants.h>

-

-#include <fstream>

-#include <vector>

-#include <string>

-#include <memory>

-#include <algorithm>

-#include <numeric>

-#include <array>

-#include <type_traits>

-#include <utility>

-

-#include <cmath>

-#include <cassert>

-#include <cstdlib>

-#include <cstdio>

-

-#define ERR_GUARD_VULKAN(Expr) do { VkResult res__ = (Expr); if (res__ < 0) assert(0); } while(0)

+#include "Tests.h"

+#include "VmaUsage.h"

+#include "Common.h"

 

 static const char* const SHADER_PATH1 = "./";

 static const char* const SHADER_PATH2 = "../bin/";

 static const wchar_t* const WINDOW_CLASS_NAME = L"VULKAN_MEMORY_ALLOCATOR_SAMPLE";

 static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_LUNARG_standard_validation";

-static const char* const APP_TITLE_A =     "Vulkan Memory Allocator Sample 1.0";

-static const wchar_t* const APP_TITLE_W = L"Vulkan Memory Allocator Sample 1.0";

+static const char* const APP_TITLE_A =     "Vulkan Memory Allocator Sample 2.0";

+static const wchar_t* const APP_TITLE_W = L"Vulkan Memory Allocator Sample 2.0";

 

 static const bool VSYNC = true;

 static const uint32_t COMMAND_BUFFER_COUNT = 2;

+static void* const CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA = (void*)(intptr_t)43564544;

+static const bool USE_CUSTOM_CPU_ALLOCATION_CALLBACKS = false;

+

+VkPhysicalDevice g_hPhysicalDevice;

+VkDevice g_hDevice;

+VmaAllocator g_hAllocator;

+bool g_MemoryAliasingWarningEnabled = true;

 

 static bool g_EnableValidationLayer = true;

+static bool VK_KHR_get_memory_requirements2_enabled = false;

+static bool VK_KHR_dedicated_allocation_enabled = false;

 

 static HINSTANCE g_hAppInstance;

 static HWND g_hWnd;

 static LONG g_SizeX = 1280, g_SizeY = 720;

 static VkInstance g_hVulkanInstance;

 static VkSurfaceKHR g_hSurface;

-static VkPhysicalDevice g_hPhysicalDevice;

 static VkQueue g_hPresentQueue;

 static VkSurfaceFormatKHR g_SurfaceFormat;

 static VkExtent2D g_Extent;

@@ -109,8 +85,6 @@
 static PFN_vkDestroyDebugReportCallbackEXT g_pvkDestroyDebugReportCallbackEXT;

 static VkDebugReportCallbackEXT g_hCallback;

 

-static VkDevice g_hDevice;

-static VmaAllocator g_hAllocator;

 static VkQueue g_hGraphicsQueue;

 static VkCommandBuffer g_hTemporaryCommandBuffer;

 

@@ -129,6 +103,28 @@
 static VmaAllocation g_hTextureImageAlloc;

 static VkImageView g_hTextureImageView;

 

+static void* CustomCpuAllocation(

+    void* pUserData, size_t size, size_t alignment,

+    VkSystemAllocationScope allocationScope)

+{

+    assert(pUserData == CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA);

+    return _aligned_malloc(size, alignment);

+}

+

+static void* CustomCpuReallocation(

+    void* pUserData, void* pOriginal, size_t size, size_t alignment,

+    VkSystemAllocationScope allocationScope)

+{

+    assert(pUserData == CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA);

+    return _aligned_realloc(pOriginal, size, alignment);

+}

+

+static void CustomCpuFree(void* pUserData, void* pMemory)

+{

+    assert(pUserData == CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA);

+    _aligned_free(pMemory);

+}

+

 static void BeginSingleTimeCommands()

 {

     VkCommandBufferBeginInfo cmdBufBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };

@@ -176,10 +172,43 @@
     const char* pMessage,

     void* pUserData)

 {

+    // "Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug."

+    if(!g_MemoryAliasingWarningEnabled && flags == VK_DEBUG_REPORT_WARNING_BIT_EXT &&

+        (strstr(pMessage, " is aliased with non-linear ") || strstr(pMessage, " is aliased with linear ")))

+    {

+        return VK_FALSE;

+    }

+

+    // Ignoring because when VK_KHR_dedicated_allocation extension is enabled,

+    // vkGetBufferMemoryRequirements2KHR function is used instead, while Validation

+    // Layer seems to be unaware of it.

+    if (strstr(pMessage, "but vkGetBufferMemoryRequirements() has not been called on that buffer") != nullptr)

+    {

+        return VK_FALSE;

+    }

+    if (strstr(pMessage, "but vkGetImageMemoryRequirements() has not been called on that image") != nullptr)

+    {

+        return VK_FALSE;

+    }

+    

+    switch(flags)

+    {

+    case VK_DEBUG_REPORT_WARNING_BIT_EXT:

+        SetConsoleColor(CONSOLE_COLOR::WARNING);

+        break;

+    case VK_DEBUG_REPORT_ERROR_BIT_EXT:

+        SetConsoleColor(CONSOLE_COLOR::ERROR_);

+        break;

+    default:

+        SetConsoleColor(CONSOLE_COLOR::INFO);

+    }

+

     printf("%s \xBA %s\n", pLayerPrefix, pMessage);

 

-    if((flags == VK_DEBUG_REPORT_WARNING_BIT_EXT) ||

-        (flags == VK_DEBUG_REPORT_ERROR_BIT_EXT))

+    SetConsoleColor(CONSOLE_COLOR::NORMAL);

+

+    if(flags == VK_DEBUG_REPORT_WARNING_BIT_EXT ||

+        flags == VK_DEBUG_REPORT_ERROR_BIT_EXT)

     {

         OutputDebugStringA(pMessage);

         OutputDebugStringA("\n");

@@ -1205,14 +1234,39 @@
     deviceFeatures.fillModeNonSolid = VK_TRUE;

     deviceFeatures.samplerAnisotropy = VK_TRUE;

 

+    // Determine list of device extensions to enable.

     std::vector<const char*> enabledDeviceExtensions;

     enabledDeviceExtensions.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);

+    {

+        uint32_t propertyCount = 0;

+        ERR_GUARD_VULKAN( vkEnumerateDeviceExtensionProperties(g_hPhysicalDevice, nullptr, &propertyCount, nullptr) );

+

+        if(propertyCount)

+        {

+            std::vector<VkExtensionProperties> properties{propertyCount};

+            ERR_GUARD_VULKAN( vkEnumerateDeviceExtensionProperties(g_hPhysicalDevice, nullptr, &propertyCount, properties.data()) );

+

+            for(uint32_t i = 0; i < propertyCount; ++i)

+            {

+                if(strcmp(properties[i].extensionName, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME) == 0)

+                {

+                    enabledDeviceExtensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);

+                    VK_KHR_get_memory_requirements2_enabled = true;

+                }

+                else if(strcmp(properties[i].extensionName, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0)

+                {

+                    enabledDeviceExtensions.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);

+                    VK_KHR_dedicated_allocation_enabled = true;

+                }

+            }

+        }

+    }

 

     VkDeviceCreateInfo deviceCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };

     deviceCreateInfo.enabledLayerCount = 0;

     deviceCreateInfo.ppEnabledLayerNames = nullptr;

     deviceCreateInfo.enabledExtensionCount = (uint32_t)enabledDeviceExtensions.size();

-    deviceCreateInfo.ppEnabledExtensionNames = enabledDeviceExtensions.data();

+    deviceCreateInfo.ppEnabledExtensionNames = !enabledDeviceExtensions.empty() ? enabledDeviceExtensions.data() : nullptr;

     deviceCreateInfo.queueCreateInfoCount = g_PresentQueueFamilyIndex != g_GraphicsQueueFamilyIndex ? 2 : 1;

     deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfo;

     deviceCreateInfo.pEnabledFeatures = &deviceFeatures;

@@ -1224,6 +1278,22 @@
     VmaAllocatorCreateInfo allocatorInfo = {};

     allocatorInfo.physicalDevice = g_hPhysicalDevice;

     allocatorInfo.device = g_hDevice;

+

+    if(VK_KHR_dedicated_allocation_enabled)

+    {

+        allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT;

+    }

+

+    VkAllocationCallbacks cpuAllocationCallbacks = {};

+    if(USE_CUSTOM_CPU_ALLOCATION_CALLBACKS)

+    {

+        cpuAllocationCallbacks.pUserData = CUSTOM_CPU_ALLOCATION_CALLBACK_USER_DATA;

+        cpuAllocationCallbacks.pfnAllocation = &CustomCpuAllocation;

+        cpuAllocationCallbacks.pfnReallocation = &CustomCpuReallocation;

+        cpuAllocationCallbacks.pfnFree = &CustomCpuFree;

+        allocatorInfo.pAllocationCallbacks = &cpuAllocationCallbacks;

+    }

+

     ERR_GUARD_VULKAN( vmaCreateAllocator(&allocatorInfo, &g_hAllocator) );

 

     // Retrieve queue (doesn't need to be destroyed)

@@ -1634,8 +1704,15 @@
         return 0;

 

     case WM_KEYDOWN:

-        if(wParam == VK_ESCAPE)

+        switch(wParam)

+        {

+        case VK_ESCAPE:

             PostMessage(hWnd, WM_CLOSE, 0, 0);

+            break;

+        case 'T':

+            Test();

+            break;

+        }

         return 0;

 

     default:

@@ -1689,14 +1766,12 @@
     return 0;

 }

 

-#else // #ifdef WIN32

+#else // #ifdef _WIN32

 

-#define VMA_IMPLEMENTATION

-#include "vk_mem_alloc.h"

+#include "VmaUsage.h"

 

 int main()

 {

 }

 

-#endif // #ifdef WIN32

-

+#endif // #ifdef _WIN32

diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 25b94ae..b621fe7 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -36,50 +36,88 @@
 

 Documentation of all members: vk_mem_alloc.h

 

-Table of contents:

+\section main_table_of_contents Table of contents

 

-- User guide

+- <b>User guide</b>

   - \subpage quick_start

+    - [Project setup](@ref quick_start_project_setup)

+    - [Initialization](@ref quick_start_initialization)

+    - [Resource allocation](@ref quick_start_resource_allocation)

   - \subpage choosing_memory_type

+    - [Usage](@ref choosing_memory_type_usage)

+    - [Required and preferred flags](@ref choosing_memory_type_required_preferred_flags)

+    - [Explicit memory types](@ref choosing_memory_type_explicit_memory_types)

+    - [Custom memory pools](@ref choosing_memory_type_custom_memory_pools)

   - \subpage memory_mapping

+    - [Mapping functions](@ref memory_mapping_mapping_functions)

+    - [Persistently mapped memory](@ref memory_mapping_persistently_mapped_memory)

+    - [Cache control](@ref memory_mapping_cache_control)

+    - [Finding out if memory is mappable](@ref memory_mapping_finding_if_memory_mappable)

   - \subpage custom_memory_pools

+    - [Choosing memory type index](@ref custom_memory_pools_MemTypeIndex)

   - \subpage defragmentation

   - \subpage lost_allocations

+  - \subpage statistics

+    - [Numeric statistics](@ref statistics_numeric_statistics)

+    - [JSON dump](@ref statistics_json_dump)

   - \subpage allocation_annotation

+    - [Allocation user data](@ref allocation_user_data)

+    - [Allocation names](@ref allocation_names)

+- \subpage usage_patterns

+  - [Simple patterns](@ref usage_patterns_simple)

+  - [Advanced patterns](@ref usage_patterns_advanced)

 - \subpage configuration

+  - [Pointers to Vulkan functions](@ref config_Vulkan_functions)

+  - [Custom host memory allocator](@ref custom_memory_allocator)

+  - [Device memory allocation callbacks](@ref allocation_callbacks)

+  - [Device heap memory limit](@ref heap_memory_limit)

   - \subpage vk_khr_dedicated_allocation

-- \subpage thread_safety

-- \subpage about_the_library

+- \subpage general_considerations

+  - [Thread safety](@ref general_considerations_thread_safety)

+  - [Allocation algorithm](@ref general_considerations_allocation_algorithm)

+  - [Features not supported](@ref general_considerations_features_not_supported)

 

-See also:

+\section main_see_also See also

 

-- [Source repository on GitHub](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)

 - [Product page on GPUOpen](https://gpuopen.com/gaming-product/vulkan-memory-allocator/)

+- [Source repository on GitHub](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)

 

 

 

 

 \page quick_start Quick start

 

-\section project_setup Project setup

+\section quick_start_project_setup Project setup

 

-In your project code:

+Vulkan Memory Allocator comes in form of a single header file.

+You don't need to build it as a separate library project.

+You can add this file directly to your project and submit it to code repository next to your other source files.

 

--# Include "vk_mem_alloc.h" file wherever you want to use the library.

--# In exacly one C++ file define following macro before include to build library

-   implementation.

+"Single header" doesn't mean that everything is contained in C/C++ declarations,

+like it tends to be in case of inline functions or C++ templates.

+It means that implementation is bundled with interface in a single file and needs to be extracted using preprocessor macro.

+If you don't do it properly, you will get linker errors.

+

+To do it properly:

+

+-# Include "vk_mem_alloc.h" file in each CPP file where you want to use the library.

+   This includes declarations of all members of the library.

+-# In exacly one CPP file define following macro before this include.

+   It enables also internal definitions.

 

 \code

 #define VMA_IMPLEMENTATION

 #include "vk_mem_alloc.h"

 \endcode

 

-\section initialization Initialization

+It may be a good idea to create dedicated CPP file just for this purpose.

+

+\section quick_start_initialization Initialization

 

 At program startup:

 

 -# Initialize Vulkan to have `VkPhysicalDevice` and `VkDevice` object.

--# Fill VmaAllocatorCreateInfo structure and create `VmaAllocator` object by

+-# Fill VmaAllocatorCreateInfo structure and create #VmaAllocator object by

    calling vmaCreateAllocator().

 

 \code

@@ -91,7 +129,7 @@
 vmaCreateAllocator(&allocatorInfo, &allocator);

 \endcode

 

-\section resource_allocation Resource allocation

+\section quick_start_resource_allocation Resource allocation

 

 When you want to create a buffer or image:

 

@@ -137,6 +175,7 @@
 -# 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().

+   For binding you should use functions: vmaBindBufferMemory(), vmaBindImageMemory().

 -# 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.

@@ -208,7 +247,7 @@
 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

+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.

@@ -251,7 +290,7 @@
 

 \section memory_mapping_mapping_functions Mapping functions

 

-The library provides following functions for mapping of a specific `VmaAllocation`: vmaMapMemory(), vmaUnmapMemory().

+The library provides following functions for mapping of a specific #VmaAllocation: vmaMapMemory(), vmaUnmapMemory().

 They are safer and more convenient to use than standard Vulkan functions.

 You can map an allocation multiple times simultaneously - mapping is reference-counted internally.

 You can also map different allocations simultaneously regardless of whether they use the same `VkDeviceMemory` block.

@@ -285,7 +324,7 @@
 Kepping your memory persistently mapped is generally OK in Vulkan.

 You don't need to unmap it before using its data on the GPU.

 The library provides a special feature designed for that:

-Allocations made with `VMA_ALLOCATION_CREATE_MAPPED_BIT` flag set in

+Allocations made with #VMA_ALLOCATION_CREATE_MAPPED_BIT flag set in

 VmaAllocationCreateInfo::flags stay mapped all the time,

 so you can just access CPU pointer to it any time

 without a need to call any "map" or "unmap" function.

@@ -314,7 +353,7 @@
 - When operating system is Windows 7 or 8.x (Windows 10 is not affected because it uses WDDM2),

   device is discrete AMD GPU,

   and memory type is the special 256 MiB pool of `DEVICE_LOCAL + HOST_VISIBLE` memory

-  (selected when you use `VMA_MEMORY_USAGE_CPU_TO_GPU`),

+  (selected when you use #VMA_MEMORY_USAGE_CPU_TO_GPU),

   then whenever a memory block allocated from this memory type stays mapped

   for the time of any call to `vkQueueSubmit()` or `vkQueuePresentKHR()`, this

   block is migrated by WDDM to system RAM, which degrades performance. It doesn't

@@ -347,7 +386,7 @@
 }

 \endcode

 

-Please note that memory allocated with `VMA_MEMORY_USAGE_CPU_ONLY` is guaranteed to be host coherent.

+Please note that memory allocated with #VMA_MEMORY_USAGE_CPU_ONLY is guaranteed to be host coherent.

 

 Also, Windows drivers from all 3 PC GPU vendors (AMD, Intel, NVIDIA)

 currently provide `VK_MEMORY_PROPERTY_HOST_COHERENT_BIT` flag on all memory types that are

@@ -365,8 +404,38 @@
 In order to do that: inspect `allocInfo.memoryType`, call vmaGetMemoryTypeProperties(),

 and look for `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` flag in properties of that memory type.

 

-You can even use `VMA_ALLOCATION_CREATE_MAPPED_BIT` flag while creating allocations

-that are not necessarily `HOST_VISIBLE` (e.g. using `VMA_MEMORY_USAGE_GPU_ONLY`).

+\code

+VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+bufCreateInfo.size = sizeof(ConstantBuffer);

+bufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;

+

+VmaAllocationCreateInfo allocCreateInfo = {};

+allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;

+

+VkBuffer buf;

+VmaAllocation alloc;

+VmaAllocationInfo allocInfo;

+vmaCreateBuffer(allocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, &allocInfo);

+

+VkMemoryPropertyFlags memFlags;

+vmaGetMemoryTypeProperties(allocator, allocInfo.memoryType, &memFlags);

+if((memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)

+{

+    // Allocation ended up in mappable memory. You can map it and access it directly.

+    void* mappedData;

+    vmaMapMemory(allocator, alloc, &mappedData);

+    memcpy(mappedData, &constantBufferData, sizeof(constantBufferData));

+    vmaUnmapMemory(allocator, alloc);

+}

+else

+{

+    // Allocation ended up in non-mappable memory.

+    // You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.

+}

+\endcode

+

+You can even use #VMA_ALLOCATION_CREATE_MAPPED_BIT flag while creating allocations

+that are not necessarily `HOST_VISIBLE` (e.g. using #VMA_MEMORY_USAGE_GPU_ONLY).

 If the allocation ends up in memory type that is `HOST_VISIBLE`, it will be persistently mapped and you can use it directly.

 If not, the flag is just ignored.

 Example:

@@ -394,7 +463,7 @@
 else

 {

     // Allocation ended up in non-mappable memory.

-    // You need to create CPU-side copy in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.

+    // You need to create CPU-side buffer in VMA_MEMORY_USAGE_CPU_ONLY and make a transfer.

 }

 \endcode

 

@@ -417,7 +486,7 @@
 To use custom memory pools:

 

 -# Fill VmaPoolCreateInfo structure.

--# Call vmaCreatePool() to obtain `VmaPool` handle.

+-# Call vmaCreatePool() to obtain #VmaPool handle.

 -# When making an allocation, set VmaAllocationCreateInfo::pool to this handle.

    You don't need to specify any other parameters of this structure, like usage.

 

@@ -457,36 +526,35 @@
 \section custom_memory_pools_MemTypeIndex Choosing memory type index

 

 When creating a pool, you must explicitly specify memory type index.

-To find the one suitable for your buffers or images, you can use code similar to the following:

+To find the one suitable for your buffers or images, you can use helper functions

+vmaFindMemoryTypeIndexForBufferInfo(), vmaFindMemoryTypeIndexForImageInfo().

+You need to provide structures with example parameters of buffers or images

+that you are going to create in that pool.

 

 \code

-VkBufferCreateInfo dummyBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

-dummyBufCreateInfo.size = 1024; // Whatever.

-dummyBufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; // Change if needed.

-

-VkBuffer dummyBuf;

-vkCreateBuffer(device, &dummyBufCreateInfo, nullptr, &dummyBuf);

-

-VkMemoryRequirements memReq;

-vkGetBufferMemoryRequirements(device, dummyBuf, &memReq);

+VkBufferCreateInfo exampleBufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+exampleBufCreateInfo.size = 1024; // Whatever.

+exampleBufCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; // Change if needed.

 

 VmaAllocationCreateInfo allocCreateInfo = {};

 allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY; // Change if needed.

 

 uint32_t memTypeIndex;

-vmaFindMemoryTypeIndex(allocator, memReq.memoryTypeBits, &allocCreateInfo, &memTypeIndex);

-

-vkDestroyBuffer(device, dummyBuf, nullptr);

+vmaFindMemoryTypeIndexForBufferInfo(allocator, &exampleBufCreateInfo, &allocCreateInfo, &memTypeIndex);

 

 VmaPoolCreateInfo poolCreateInfo = {};

 poolCreateInfo.memoryTypeIndex = memTypeIndex;

 // ...

 \endcode

 

-Dummy buffer is needed to query driver for `memReq.memoryTypeBits`.

-Memory is never allocated for this buffer.

-You should fill structures `dummyBufCreateInfo` and `allocCreateInfo` with the same parameters

-as you are going to use for buffers created in your pool.

+When creating buffers/images allocated in that pool, provide following parameters:

+

+- `VkBufferCreateInfo`: Prefer to pass same parameters as above.

+  Otherwise you risk creating resources in a memory type that is not suitable for them, which may result in undefined behavior.

+  Using different `VK_BUFFER_USAGE_` flags may work, but you shouldn't create images in a pool intended for buffers

+  or the other way around.

+- VmaAllocationCreateInfo: You don't need to pass same parameters. Fill only `pool` member.

+  Other members are ignored anyway.

 

 

 \page defragmentation Defragmentation

@@ -521,43 +589,44 @@
 cache. Vulkan Memory Allocator can help you with that by supporting a concept of

 "lost allocations".

 

-To create an allocation that can become lost, include `VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT`

+To create an allocation that can become lost, include #VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT

 flag in VmaAllocationCreateInfo::flags. Before using a buffer or image bound to

-such allocation in every new frame, you need to query it if it's not lost. To

-check it: call vmaGetAllocationInfo() and see if VmaAllocationInfo::deviceMemory

-is not `VK_NULL_HANDLE`. If the allocation is lost, you should not use it or

-buffer/image bound to it. You mustn't forget to destroy this allocation and this

-buffer/image.

+such allocation in every new frame, you need to query it if it's not lost.

+To check it, call vmaTouchAllocation().

+If the allocation is lost, you should not use it or buffer/image bound to it.

+You mustn't forget to destroy this allocation and this buffer/image.

+vmaGetAllocationInfo() can also be used for checking status of the allocation.

+Allocation is lost when returned VmaAllocationInfo::deviceMemory == `VK_NULL_HANDLE`.

 

 To create an allocation that can make some other allocations lost to make room

-for it, use `VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT` flag. You will

-usually use both flags `VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT` and

-`VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT` at the same time.

+for it, use #VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flag. You will

+usually use both flags #VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT and

+#VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT at the same time.

 

 Warning! Current implementation uses quite naive, brute force algorithm,

-which can make allocation calls that use `VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT`

+which can make allocation calls that use #VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT

 flag quite slow. A new, more optimal algorithm and data structure to speed this

 up is planned for the future.

 

-<b>When interleaving creation of new allocations with usage of existing ones,

+<b>Q: When interleaving creation of new allocations with usage of existing ones,

 how do you make sure that an allocation won't become lost while it's used in the

 current frame?</b>

 

-It is ensured because vmaGetAllocationInfo() not only returns allocation

-parameters and checks whether it's not lost, but when it's not, it also

+It is ensured because vmaTouchAllocation() / vmaGetAllocationInfo() not only returns allocation

+status/parameters and checks whether it's not lost, but when it's not, it also

 atomically marks it as used in the current frame, which makes it impossible to

 become lost in that frame. It uses lockless algorithm, so it works fast and

 doesn't involve locking any internal mutex.

 

-<b>What if my allocation may still be in use by the GPU when it's rendering a

+<b>Q: What if my allocation may still be in use by the GPU when it's rendering a

 previous frame while I already submit new frame on the CPU?</b>

 

-You can make sure that allocations "touched" by vmaGetAllocationInfo() will not

+You can make sure that allocations "touched" by vmaTouchAllocation() / vmaGetAllocationInfo() will not

 become lost for a number of additional frames back from the current one by

 specifying this number as VmaAllocatorCreateInfo::frameInUseCount (for default

 memory pool) and VmaPoolCreateInfo::frameInUseCount (for custom pool).

 

-<b>How do you inform the library when new frame starts?</b>

+<b>Q: How do you inform the library when new frame starts?</b>

 

 You need to call function vmaSetCurrentFrameIndex().

 

@@ -579,9 +648,7 @@
     if(m_Buf != VK_NULL_HANDLE)

     {

         // Check if its allocation is not lost + mark it as used in current frame.

-        VmaAllocationInfo allocInfo;

-        vmaGetAllocationInfo(allocator, m_Alloc, &allocInfo);

-        if(allocInfo.deviceMemory != VK_NULL_HANDLE)

+        if(vmaTouchAllocation(allocator, m_Alloc))

         {

             // It's all OK - safe to use m_Buf.

             return;

@@ -610,19 +677,56 @@
 images. This is still valid as long as you implement proper handling of lost

 allocations (like in the example above) and don't use them.

 

-The library uses following algorithm for allocation, in order:

+You can create an allocation that is already in lost state from the beginning using function

+vmaCreateLostAllocation(). It may be useful if you need a "dummy" allocation that is not null.

 

--# Try to find free range of memory in existing blocks.

--# If failed, try to create a new block of `VkDeviceMemory`, with preferred block size.

--# If failed, try to create such block with size/2 and size/4.

--# If failed and `VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT` flag was

-   specified, try to find space in existing blocks, possilby making some other

-   allocations lost.

--# If failed, try to allocate separate `VkDeviceMemory` for this allocation,

-   just like when you use `VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT`.

--# If failed, choose other memory type that meets the requirements specified in

-   VmaAllocationCreateInfo and go to point 1.

--# If failed, return `VK_ERROR_OUT_OF_DEVICE_MEMORY`.

+You can call function vmaMakePoolAllocationsLost() to set all eligible allocations

+in a specified custom pool to lost state.

+Allocations that have been "touched" in current frame or VmaPoolCreateInfo::frameInUseCount frames back

+cannot become lost.

+

+

+\page statistics Statistics

+

+This library contains functions that return information about its internal state,

+especially the amount of memory allocated from Vulkan.

+Please keep in mind that these functions need to traverse all internal data structures

+to gather these information, so they may be quite time-consuming.

+Don't call them too often.

+

+\section statistics_numeric_statistics Numeric statistics

+

+You can query for overall statistics of the allocator using function vmaCalculateStats().

+Information are returned using structure #VmaStats.

+It contains #VmaStatInfo - number of allocated blocks, number of allocations

+(occupied ranges in these blocks), number of unused (free) ranges in these blocks,

+number of bytes used and unused (but still allocated from Vulkan) and other information.

+They are summed across memory heaps, memory types and total for whole allocator.

+

+You can query for statistics of a custom pool using function vmaGetPoolStats().

+Information are returned using structure #VmaPoolStats.

+

+You can query for information about specific allocation using function vmaGetAllocationInfo().

+It fill structure #VmaAllocationInfo.

+

+\section statistics_json_dump JSON dump

+

+You can dump internal state of the allocator to a string in JSON format using function vmaBuildStatsString().

+The result is guaranteed to be correct JSON.

+It uses ANSI encoding.

+Any strings provided by user (see [Allocation names](@ref allocation_names))

+are copied as-is and properly escaped for JSON, so if they use UTF-8, ISO-8859-2 or any other encoding,

+this JSON string can be treated as using this encoding.

+It must be freed using function vmaFreeStatsString().

+

+The format of this JSON string is not part of official documentation of the library,

+but it will not change in backward-incompatible way without increasing library major version number

+and appropriate mention in changelog.

+

+The JSON string contains all the data that can be obtained using vmaCalculateStats().

+It can also contain detailed map of allocated memory blocks and their regions -

+free and occupied by allocations.

+This allows e.g. to visualize the memory or assess fragmentation.

 

 

 \page allocation_annotation Allocation names and user data

@@ -667,7 +771,7 @@
 

 There is alternative mode available where `pUserData` pointer is used to point to

 a null-terminated string, giving a name to the allocation. To use this mode,

-set `VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT` flag in VmaAllocationCreateInfo::flags.

+set #VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT flag in VmaAllocationCreateInfo::flags.

 Then `pUserData` passed as VmaAllocationCreateInfo::pUserData or argument to

 vmaSetAllocationUserData() must be either null or pointer to a null-terminated string.

 The library creates internal copy of the string, so the pointer you pass doesn't need

@@ -703,13 +807,141 @@
 

 That string is also printed in JSON report created by vmaBuildStatsString().

 

+

+\page usage_patterns Recommended usage patterns

+

+\section usage_patterns_simple Simple patterns

+

+\subsection usage_patterns_simple_render_targets Render targets

+

+<b>When:</b>

+Any resources that you frequently write and read on GPU,

+e.g. images used as color attachments (aka "render targets"), depth-stencil attachments,

+images/buffers used as storage image/buffer (aka "Unordered Access View (UAV)").

+

+<b>What to do:</b>

+Create them in video memory that is fastest to access from GPU using

+#VMA_MEMORY_USAGE_GPU_ONLY.

+

+Consider using [VK_KHR_dedicated_allocation](@ref vk_khr_dedicated_allocation) extension

+and/or manually creating them as dedicated allocations using #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT,

+especially if they are large or if you plan to destroy and recreate them e.g. when

+display resolution changes.

+Prefer to create such resources first and all other GPU resources (like textures and vertex buffers) later.

+

+\subsection usage_patterns_simple_immutable_resources Immutable resources

+

+<b>When:</b>

+Any resources that you fill on CPU only once (aka "immutable") or infrequently

+and then read frequently on GPU,

+e.g. textures, vertex and index buffers, constant buffers that don't change often.

+

+<b>What to do:</b>

+Create them in video memory that is fastest to access from GPU using

+#VMA_MEMORY_USAGE_GPU_ONLY.

+

+To initialize content of such resource, create a CPU-side (aka "staging") copy of it

+in system memory - #VMA_MEMORY_USAGE_CPU_ONLY, map it, fill it,

+and submit a transfer from it to the GPU resource.

+You can keep the staging copy if you need it for another upload transfer in the future.

+If you don't, you can destroy it or reuse this buffer for uploading different resource

+after the transfer finishes.

+

+Prefer to create just buffers in system memory rather than images, even for uploading textures.

+Use `vkCmdCopyBufferToImage()`.

+Dont use images with `VK_IMAGE_TILING_LINEAR`.

+

+\subsection usage_patterns_dynamic_resources Dynamic resources

+

+<b>When:</b>

+Any resources that change frequently (aka "dynamic"), e.g. every frame or every draw call,

+written on CPU, read on GPU.

+

+<b>What to do:</b>

+Create them using #VMA_MEMORY_USAGE_CPU_TO_GPU.

+You can map it and write to it directly on CPU, as well as read from it on GPU.

+

+This is a more complex situation. Different solutions are possible,

+and the best one depends on specific GPU type, but you can use this simple approach for the start.

+Prefer to write to such resource sequentially (e.g. using `memcpy`).

+Don't perform random access or any reads from it, as it may be very slow.

+

+\subsection usage_patterns_readback Readback

+

+<b>When:</b>

+Resources that contain data written by GPU that you want to read back on CPU,

+e.g. results of some computations.

+

+<b>What to do:</b>

+Create them using #VMA_MEMORY_USAGE_GPU_TO_CPU.

+You can write to them directly on GPU, as well as map and read them on CPU.

+

+\section usage_patterns_advanced Advanced patterns

+

+\subsection usage_patterns_integrated_graphics Detecting integrated graphics

+

+You can support integrated graphics (like Intel HD Graphics, AMD APU) better

+by detecting it in Vulkan.

+To do it, call `vkGetPhysicalDeviceProperties()`, inspect

+`VkPhysicalDeviceProperties::deviceType` and look for `VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU`.

+When you find it, you can assume that memory is unified and all memory types are equally fast

+to access from GPU, regardless of `VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT`.

+

+You can then sum up sizes of all available memory heaps and treat them as useful for

+your GPU resources, instead of only `DEVICE_LOCAL` ones.

+You can also prefer to create your resources in memory types that are `HOST_VISIBLE` to map them

+directly instead of submitting explicit transfer (see below).

+

+\subsection usage_patterns_direct_vs_transfer Direct access versus transfer

+

+For resources that you frequently write on CPU and read on GPU, many solutions are possible:

+

+-# Create one copy in video memory using #VMA_MEMORY_USAGE_GPU_ONLY,

+   second copy in system memory using #VMA_MEMORY_USAGE_CPU_ONLY and submit explicit tranfer each time.

+-# Create just single copy using #VMA_MEMORY_USAGE_CPU_TO_GPU, map it and fill it on CPU,

+   read it directly on GPU.

+-# Create just single copy using #VMA_MEMORY_USAGE_CPU_ONLY, map it and fill it on CPU,

+   read it directly on GPU.

+

+Which solution is the most efficient depends on your resource and especially on the GPU.

+It is best to measure it and then make the decision.

+Some general recommendations:

+

+- On integrated graphics use (2) or (3) to avoid unnecesary time and memory overhead

+  related to using a second copy.

+- For small resources (e.g. constant buffers) use (2).

+  Discrete AMD cards have special 256 MiB pool of video memory that is directly mappable.

+  Even if the resource ends up in system memory, its data may be cached on GPU after first

+  fetch over PCIe bus.

+- For larger resources (e.g. textures), decide between (1) and (2).

+  You may want to differentiate NVIDIA and AMD, e.g. by looking for memory type that is

+  both `DEVICE_LOCAL` and `HOST_VISIBLE`. When you find it, use (2), otherwise use (1).

+

+Similarly, for resources that you frequently write on GPU and read on CPU, multiple

+solutions are possible:

+

+-# Create one copy in video memory using #VMA_MEMORY_USAGE_GPU_ONLY,

+   second copy in system memory using #VMA_MEMORY_USAGE_GPU_TO_CPU and submit explicit tranfer each time.

+-# Create just single copy using #VMA_MEMORY_USAGE_GPU_TO_CPU, write to it directly on GPU,

+   map it and read it on CPU.

+

+You should take some measurements to decide which option is faster in case of your specific

+resource.

+

+If you don't want to specialize your code for specific types of GPUs, yon can still make

+an simple optimization for cases when your resource ends up in mappable memory to use it

+directly in this case instead of creating CPU-side staging copy.

+For details see [Finding out if memory is mappable](@ref memory_mapping_finding_if_memory_mappable).

+

+

 \page configuration Configuration

 

 Please check "CONFIGURATION SECTION" in the code to find macros that you can define

 before each include of this file or change directly in this file to provide

 your own implementation of basic facilities like assert, `min()` and `max()` functions,

-mutex etc. C++ STL is used by default, but changing these allows you to get rid

-of any STL usage if you want, as many game developers tend to do.

+mutex, atomic etc.

+The library uses its own implementation of containers by default, but you can switch to using

+STL containers instead.

 

 \section config_Vulkan_functions Pointers to Vulkan functions

 

@@ -764,8 +996,8 @@
 

 If you enabled these extensions:

 

-2 . Use `VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT` flag when creating

-your `VmaAllocator` to inform the library that you enabled required extensions

+2 . Use #VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT flag when creating

+your #VmaAllocator`to inform the library that you enabled required extensions

 and you want the library to use them.

 

 \code

@@ -794,25 +1026,41 @@
 

 

 

-\page thread_safety Thread safety

+\page general_considerations General considerations

 

-- The library has no global state, so separate `VmaAllocator` objects can be used

-  independently. 

-- By default, all calls to functions that take `VmaAllocator` as first parameter

+\section general_considerations_thread_safety Thread safety

+

+- The library has no global state, so separate #VmaAllocator objects can be used

+  independently.

+  There should be no need to create multiple such objects though - one per `VkDevice` is enough.

+- By default, all calls to functions that take #VmaAllocator as first parameter

   are safe to call from multiple threads simultaneously because they are

   synchronized internally when needed.

-- When the allocator is created with `VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT`

-  flag, calls to functions that take such `VmaAllocator` object must be

+- When the allocator is created with #VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT

+  flag, calls to functions that take such #VmaAllocator object must be

   synchronized externally.

-- Access to a `VmaAllocation` object must be externally synchronized. For example,

+- Access to a #VmaAllocation object must be externally synchronized. For example,

   you must not call vmaGetAllocationInfo() and vmaMapMemory() from different

-  threads at the same time if you pass the same `VmaAllocation` object to these

+  threads at the same time if you pass the same #VmaAllocation object to these

   functions.

 

+\section general_considerations_allocation_algorithm Allocation algorithm

 

-\page about_the_library About the library

+The library uses following algorithm for allocation, in order:

 

-\section about_the_library_features_not_supported Features not supported

+-# Try to find free range of memory in existing blocks.

+-# If failed, try to create a new block of `VkDeviceMemory`, with preferred block size.

+-# If failed, try to create such block with size/2, size/4, size/8.

+-# If failed and #VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flag was

+   specified, try to find space in existing blocks, possilby making some other

+   allocations lost.

+-# If failed, try to allocate separate `VkDeviceMemory` for this allocation,

+   just like when you use #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT.

+-# If failed, choose other memory type that meets the requirements specified in

+   VmaAllocationCreateInfo and go to point 1.

+-# If failed, return `VK_ERROR_OUT_OF_DEVICE_MEMORY`.

+

+\section general_considerations_features_not_supported Features not supported

 

 Features deliberately excluded from the scope of this library:

 

@@ -825,6 +1073,15 @@
 

 #include <vulkan/vulkan.h>

 

+/** \struct VmaAllocator

+\brief Represents main object of this library initialized.

+

+Fill structure VmaAllocatorCreateInfo and call function vmaCreateAllocator() to create it.

+Call function vmaDestroyAllocator() to destroy it.

+

+It is recommended to create just one object of this type per `VkDevice` object,

+right after Vulkan is initialized and keep it alive until before Vulkan device is destroyed.

+*/

 VK_DEFINE_HANDLE(VmaAllocator)

 

 /// Callback function called after successful vkAllocateMemory.

@@ -854,7 +1111,7 @@
     PFN_vmaFreeDeviceMemoryFunction pfnFree;

 } VmaDeviceMemoryCallbacks;

 

-/// Flags for created VmaAllocator.

+/// Flags for created #VmaAllocator.

 typedef enum VmaAllocatorCreateFlagBits {

     /** \brief 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.

 

@@ -865,7 +1122,7 @@
 

     Using this extenion 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

+    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.

 

@@ -922,13 +1179,13 @@
     /// Vulkan device.

     /** It must be valid throughout whole lifetime of created allocator. */

     VkDevice device;

-    /// Preferred size of a single `VkDeviceMemory` block to be allocated from large heaps > 1 GiB.

+    /// Preferred size of a single `VkDeviceMemory` block to be allocated from large heaps > 1 GiB. Optional.

     /** Set to 0 to use default, which is currently 256 MiB. */

     VkDeviceSize preferredLargeHeapBlockSize;

-    /// Custom CPU memory allocation callbacks.

+    /// Custom CPU memory allocation callbacks. Optional.

     /** Optional, can be null. When specified, will also be used for all CPU-side memory allocations. */

     const VkAllocationCallbacks* pAllocationCallbacks;

-    /// Informative callbacks for vkAllocateMemory, vkFreeMemory.

+    /// Informative callbacks for `vkAllocateMemory`, `vkFreeMemory`. Optional.

     /** Optional, can be null. */

     const VmaDeviceMemoryCallbacks* pDeviceMemoryCallbacks;

     /** \brief Maximum number of additional frames that are in use at the same time as current frame.

@@ -945,7 +1202,7 @@
     become lost, set this value to 0.

     */

     uint32_t frameInUseCount;

-    /** \brief Either NULL or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap.

+    /** \brief Either null or a pointer to an array of limits on maximum number of bytes that can be allocated out of particular Vulkan memory heap.

 

     If not NULL, it must be a pointer to an array of

     `VkPhysicalDeviceMemoryProperties::memoryHeapCount` elements, defining limit on

@@ -1022,8 +1279,8 @@
 /** \brief Sets index of the current frame.

 

 This function must be used if you make allocations with

-`VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT` and

-`VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT` flags to inform the allocator

+#VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT and

+#VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flags to inform the allocator

 when a new frame begins. Allocations queried using vmaGetAllocationInfo() cannot

 become lost in the current frame.

 */

@@ -1037,7 +1294,7 @@
 {

     /// Number of `VkDeviceMemory` Vulkan memory blocks allocated.

     uint32_t blockCount;

-    /// Number of `VmaAllocation` allocation objects allocated.

+    /// Number of #VmaAllocation allocation objects allocated.

     uint32_t allocationCount;

     /// Number of free ranges of memory between allocations.

     uint32_t unusedRangeCount;

@@ -1080,6 +1337,14 @@
 

 #endif // #if VMA_STATS_STRING_ENABLED

 

+/** \struct VmaPool

+\brief Represents custom memory pool

+

+Fill structure VmaPoolCreateInfo and call function vmaCreatePool() to create it.

+Call function vmaDestroyPool() to destroy it.

+

+For more information see [Custom memory pools](@ref choosing_memory_type_custom_memory_pools).

+*/

 VK_DEFINE_HANDLE(VmaPool)

 

 typedef enum VmaMemoryUsage

@@ -1102,7 +1367,7 @@
 

     Allocation may still end up in `HOST_VISIBLE` memory on some implementations.

     In such case, you are free to map it.

-    You can use `VMA_ALLOCATION_CREATE_MAPPED_BIT` with this usage type.

+    You can use #VMA_ALLOCATION_CREATE_MAPPED_BIT with this usage type.

     */

     VMA_MEMORY_USAGE_GPU_ONLY = 1,

     /** Memory will be mappable on host.

@@ -1154,8 +1419,8 @@
     If new allocation cannot be placed in any of the existing blocks, allocation

     fails with `VK_ERROR_OUT_OF_DEVICE_MEMORY` error.

     

-    You should not use `VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT` and

-    `VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT` at the same time. It makes no sense.

+    You should not use #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT and

+    #VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT at the same time. It makes no sense.

     

     If VmaAllocationCreateInfo::pool is not null, this flag is implied and ignored. */

     VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT = 0x00000002,

@@ -1169,11 +1434,11 @@
     (`DEVICE_LOCAL`) and still want to map it directly if possible on platforms that

     support it (e.g. Intel GPU).

 

-    You should not use this flag together with `VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT`.

+    You should not use this flag together with #VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT.

     */

     VMA_ALLOCATION_CREATE_MAPPED_BIT = 0x00000004,

     /** Allocation created with this flag can become lost as a result of another

-    allocation with `VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT` flag, so you

+    allocation with #VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT flag, so you

     must check it before use.

 

     To check if allocation is not lost, call vmaGetAllocationInfo() and check if

@@ -1182,11 +1447,11 @@
     For details about supporting lost allocations, see Lost Allocations

     chapter of User Guide on Main Page.

 

-    You should not use this flag together with `VMA_ALLOCATION_CREATE_MAPPED_BIT`.

+    You should not use this flag together with #VMA_ALLOCATION_CREATE_MAPPED_BIT.

     */

     VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT = 0x00000008,

     /** While creating allocation using this flag, other allocations that were

-    created with flag `VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT` can become lost.

+    created with flag #VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT can become lost.

 

     For details about supporting lost allocations, see Lost Allocations

     chapter of User Guide on Main Page.

@@ -1194,7 +1459,7 @@
     VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT = 0x00000010,

     /** Set this flag to treat VmaAllocationCreateInfo::pUserData as pointer to a

     null-terminated string. Instead of copying pointer value, a local copy of the

-    string is made and stored in allocation's pUserData. The string is automatically

+    string is made and stored in allocation's `pUserData`. The string is automatically

     freed together with the allocation. It is also used in vmaBuildStatsString().

     */

     VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT = 0x00000020,

@@ -1209,7 +1474,7 @@
     VmaAllocationCreateFlags flags;

     /** \brief Intended usage of memory.

     

-    You can leave `VMA_MEMORY_USAGE_UNKNOWN` if you specify memory requirements in other way. \n

+    You can leave #VMA_MEMORY_USAGE_UNKNOWN if you specify memory requirements in other way. \n

     If `pool` is not null, this member is ignored.

     */

     VmaMemoryUsage usage;

@@ -1237,9 +1502,9 @@
     `usage`, `requiredFlags`, `preferredFlags`, `memoryTypeBits` are ignored.

     */

     VmaPool pool;

-    /** \brief Custom general-purpose pointer that will be stored in VmaAllocation, can be read as VmaAllocationInfo::pUserData and changed using vmaSetAllocationUserData().

+    /** \brief Custom general-purpose pointer that will be stored in #VmaAllocation, can be read as VmaAllocationInfo::pUserData and changed using vmaSetAllocationUserData().

     

-    If `VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT` is used, it must be either

+    If #VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT is used, it must be either

     null or pointer to a null-terminated string. The string will be then copied to

     internal buffer, so it doesn't need to be valid after allocation call.

     */

@@ -1329,7 +1594,7 @@
 } VmaPoolCreateFlagBits;

 typedef VkFlags VmaPoolCreateFlags;

 

-/** \brief Describes parameter of created `VmaPool`.

+/** \brief Describes parameter of created #VmaPool.

 */

 typedef struct VmaPoolCreateInfo {

     /** \brief Vulkan memory type index to allocate this pool from.

@@ -1348,7 +1613,7 @@
     Set to 0 to have no preallocated blocks and let the pool be completely empty.

     */

     size_t minBlockCount;

-    /** \brief Maximum number of blocks that can be allocated in this pool.

+    /** \brief Maximum number of blocks that can be allocated in this pool. Optional.

 

     Optional. Set to 0 to use `SIZE_MAX`, which means no limit.

     

@@ -1359,7 +1624,7 @@
     /** \brief Maximum number of additional frames that are in use at the same time as current frame.

 

     This value is used only when you make allocations with

-    `VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT` flag. Such allocation cannot become

+    #VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT flag. Such allocation cannot become

     lost if allocation.lastUseFrameIndex >= allocator.currentFrameIndex - frameInUseCount.

 

     For example, if you double-buffer your command buffers, so resources used for

@@ -1372,19 +1637,19 @@
     uint32_t frameInUseCount;

 } VmaPoolCreateInfo;

 

-/** \brief Describes parameter of existing `VmaPool`.

+/** \brief Describes parameter of existing #VmaPool.

 */

 typedef struct VmaPoolStats {

     /** \brief Total amount of `VkDeviceMemory` allocated from Vulkan for this pool, in bytes.

     */

     VkDeviceSize size;

-    /** \brief Total number of bytes in the pool not used by any `VmaAllocation`.

+    /** \brief Total number of bytes in the pool not used by any #VmaAllocation.

     */

     VkDeviceSize unusedSize;

-    /** \brief Number of VmaAllocation objects created from this pool that were not destroyed or lost.

+    /** \brief Number of #VmaAllocation objects created from this pool that were not destroyed or lost.

     */

     size_t allocationCount;

-    /** \brief Number of continuous memory ranges in the pool not used by any `VmaAllocation`.

+    /** \brief Number of continuous memory ranges in the pool not used by any #VmaAllocation.

     */

     size_t unusedRangeCount;

     /** \brief Size of the largest continuous free memory region.

@@ -1396,7 +1661,7 @@
     VkDeviceSize unusedRangeSizeMax;

 } VmaPoolStats;

 

-/** \brief Allocates Vulkan device memory and creates `VmaPool` object.

+/** \brief Allocates Vulkan device memory and creates #VmaPool object.

 

 @param allocator Allocator object.

 @param pCreateInfo Parameters of pool to create.

@@ -1407,13 +1672,13 @@
 	const VmaPoolCreateInfo* pCreateInfo,

 	VmaPool* pPool);

 

-/** \brief Destroys VmaPool object and frees Vulkan device memory.

+/** \brief Destroys #VmaPool object and frees Vulkan device memory.

 */

 void vmaDestroyPool(

     VmaAllocator allocator,

     VmaPool pool);

 

-/** \brief Retrieves statistics of existing VmaPool object.

+/** \brief Retrieves statistics of existing #VmaPool object.

 

 @param allocator Allocator object.

 @param pool Pool object.

@@ -1435,9 +1700,33 @@
     VmaPool pool,

     size_t* pLostAllocationCount);

 

+/** \struct VmaAllocation

+\brief Represents single memory allocation.

+

+It may be either dedicated block of `VkDeviceMemory` or a specific region of a bigger block of this type

+plus unique offset.

+

+There are multiple ways to create such object.

+You need to fill structure VmaAllocationCreateInfo.

+For more information see [Choosing memory type](@ref choosing_memory_type).

+

+Although the library provides convenience functions that create Vulkan buffer or image,

+allocate memory for it and bind them together,

+binding of the allocation to a buffer or an image is out of scope of the allocation itself.

+Allocation object can exist without buffer/image bound,

+binding can be done manually by the user, and destruction of it can be done

+independently of destruction of the allocation.

+

+The object also remembers its size and some other information.

+To retrieve this information, use function vmaGetAllocationInfo() and inspect

+returned structure VmaAllocationInfo.

+

+Some kinds allocations can be in lost state.

+For more information, see [Lost allocations](@ref lost_allocations).

+*/

 VK_DEFINE_HANDLE(VmaAllocation)

 

-/** \brief Parameters of `VmaAllocation` objects, that can be retrieved using function vmaGetAllocationInfo().

+/** \brief Parameters of #VmaAllocation objects, that can be retrieved using function vmaGetAllocationInfo().

 */

 typedef struct VmaAllocationInfo {

     /** \brief Memory type index that this allocation was allocated from.

@@ -1467,7 +1756,7 @@
     /** \brief Pointer to the beginning of this allocation as mapped data.

 

     If the allocation hasn't been mapped using vmaMapMemory() and hasn't been

-    created with `VMA_ALLOCATION_CREATE_MAPPED_BIT` flag, this value null.

+    created with #VMA_ALLOCATION_CREATE_MAPPED_BIT flag, this value null.

 

     It can change after call to vmaMapMemory(), vmaUnmapMemory().

     It can also change after call to vmaDefragment() if this allocation is passed to the function.

@@ -1523,16 +1812,40 @@
     VmaAllocator allocator,

     VmaAllocation allocation);

 

-/** \brief Returns current information about specified allocation.

+/** \brief Returns current information about specified allocation and atomically marks it as used in current frame.

 

-It also "touches" allocation... TODO finish documentation.

+Current paramters of given allocation are returned in `pAllocationInfo`.

+

+This function also atomically "touches" allocation - marks it as used in current frame,

+just like vmaTouchAllocation().

+If the allocation is in lost state, `pAllocationInfo->deviceMemory == VK_NULL_HANDLE`.

+

+Although this function uses atomics and doesn't lock any mutex, so it should be quite efficient,

+you can avoid calling it too often.

+

+- You can retrieve same VmaAllocationInfo structure while creating your resource, from function

+  vmaCreateBuffer(), vmaCreateImage(). You can remember it if you are sure parameters don't change

+  (e.g. due to defragmentation or allocation becoming lost).

+- If you just want to check if allocation is not lost, vmaTouchAllocation() will work faster.

 */

 void vmaGetAllocationInfo(

     VmaAllocator allocator,

     VmaAllocation allocation,

     VmaAllocationInfo* pAllocationInfo);

 

-/** \brief TODO finish documentation...

+/** \brief Returns `VK_TRUE` if allocation is not lost and atomically marks it as used in current frame.

+

+If the allocation has been created with #VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT flag,

+this function returns `VK_TRUE` if it's not in lost state, so it can still be used.

+It then also atomically "touches" the allocation - marks it as used in current frame,

+so that you can be sure it won't become lost in current frame or next `frameInUseCount` frames.

+

+If the allocation is in lost state, the function returns `VK_FALSE`.

+Memory of such allocation, as well as buffer or image bound to it, should not be used.

+Lost allocation and the buffer/image still need to be destroyed.

+

+If the allocation has been created without #VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT flag,

+this function always returns `VK_TRUE`.

 */

 VkBool32 vmaTouchAllocation(

     VmaAllocator allocator,

@@ -1542,13 +1855,13 @@
 

 If the allocation was created with VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT,

 pUserData must be either null, or pointer to a null-terminated string. The function

-makes local copy of the string and sets it as allocation's pUserData. String

+makes local copy of the string and sets it as allocation's `pUserData`. String

 passed as pUserData doesn't need to be valid for whole lifetime of the allocation -

 you can free it after this call. String previously pointed by allocation's

 pUserData is freed from memory.

 

-If the flag was not used, the value of pointer pUserData is just copied to

-allocation's pUserData. It is opaque, so you can use it however you want - e.g.

+If the flag was not used, the value of pointer `pUserData` is just copied to

+allocation's `pUserData`. It is opaque, so you can use it however you want - e.g.

 as a pointer, ordinal number or some handle to you own data.

 */

 void vmaSetAllocationUserData(

@@ -1592,16 +1905,16 @@
 must call vmaUnmapMemory() same number of times as you called vmaMapMemory().

 

 It is also safe to call this function on allocation created with

-`VMA_ALLOCATION_CREATE_MAPPED_BIT` flag. Its memory stays mapped all the time.

+#VMA_ALLOCATION_CREATE_MAPPED_BIT flag. Its memory stays mapped all the time.

 You must still call vmaUnmapMemory() same number of times as you called

 vmaMapMemory(). You must not call vmaUnmapMemory() additional time to free the

-"0-th" mapping made automatically due to `VMA_ALLOCATION_CREATE_MAPPED_BIT` flag.

+"0-th" mapping made automatically due to #VMA_ALLOCATION_CREATE_MAPPED_BIT flag.

 

 This function fails when used on allocation made in memory type that is not

 `HOST_VISIBLE`.

 

 This function always fails when called for allocation that was created with

-`VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT` flag. Such allocations cannot be

+#VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT flag. Such allocations cannot be

 mapped.

 */

 VkResult vmaMapMemory(

@@ -1660,12 +1973,12 @@
 - Only allocations made in memory types that have

   `VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT` flag can be compacted. You may pass other

   allocations but it makes no sense - these will never be moved.

-- You may pass allocations made with `VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT` but

+- You may pass allocations made with #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT but

   it makes no sense - they will never be moved.

-- Both allocations made with or without `VMA_ALLOCATION_CREATE_MAPPED_BIT`

+- Both allocations made with or without #VMA_ALLOCATION_CREATE_MAPPED_BIT

   flag can be compacted. If not persistently mapped, memory will be mapped

   temporarily inside this function if needed.

-- You must not pass same `VmaAllocation` object multiple times in pAllocations array.

+- You must not pass same #VmaAllocation object multiple times in pAllocations array.

 

 The function also frees empty `VkDeviceMemory` blocks.

 

@@ -1733,6 +2046,40 @@
     const VmaDefragmentationInfo *pDefragmentationInfo,

     VmaDefragmentationStats* pDefragmentationStats);

 

+/** \brief Binds buffer to allocation.

+

+Binds specified buffer to region of memory represented by specified allocation.

+Gets `VkDeviceMemory` handle and offset from the allocation.

+If you want to create a buffer, allocate memory for it and bind them together separately,

+you should use this function for binding instead of standard `vkBindBufferMemory()`,

+because it ensures proper synchronization so that when a `VkDeviceMemory` object is used by multiple

+allocations, calls to `vkBind*Memory()` or `vkMapMemory()` won't happen from multiple threads simultaneously

+(which is illegal in Vulkan).

+

+It is recommended to use function vmaCreateBuffer() instead of this one.

+*/

+VkResult vmaBindBufferMemory(

+    VmaAllocator allocator,

+    VmaAllocation allocation,

+    VkBuffer buffer);

+

+/** \brief Binds image to allocation.

+

+Binds specified image to region of memory represented by specified allocation.

+Gets `VkDeviceMemory` handle and offset from the allocation.

+If you want to create an image, allocate memory for it and bind them together separately,

+you should use this function for binding instead of standard `vkBindImageMemory()`,

+because it ensures proper synchronization so that when a `VkDeviceMemory` object is used by multiple

+allocations, calls to `vkBind*Memory()` or `vkMapMemory()` won't happen from multiple threads simultaneously

+(which is illegal in Vulkan).

+

+It is recommended to use function vmaCreateImage() instead of this one.

+*/

+VkResult vmaBindImageMemory(

+    VmaAllocator allocator,

+    VmaAllocation allocation,

+    VkImage image);

+

 /**

 @param[out] pBuffer Buffer that was created.

 @param[out] pAllocation Allocation that was created.

@@ -3717,43 +4064,22 @@
     void UnregisterFreeSuballocation(VmaSuballocationList::iterator item);

 };

 

-// Helper class that represents mapped memory. Synchronized internally.

-class VmaDeviceMemoryMapping

-{

-public:

-    VmaDeviceMemoryMapping();

-    ~VmaDeviceMemoryMapping();

-

-    void* GetMappedData() const { return m_pMappedData; }

-

-    // ppData can be null.

-    VkResult Map(VmaAllocator hAllocator, VkDeviceMemory hMemory, uint32_t count, void **ppData);

-    void Unmap(VmaAllocator hAllocator, VkDeviceMemory hMemory, uint32_t count);

-

-private:

-    VMA_MUTEX m_Mutex;

-    uint32_t m_MapCount;

-    void* m_pMappedData;

-};

-

 /*

 Represents a single block of device memory (`VkDeviceMemory`) with all the

-data about its regions (aka suballocations, `VmaAllocation`), assigned and free.

+data about its regions (aka suballocations, #VmaAllocation), assigned and free.

 

 Thread-safety: This class must be externally synchronized.

 */

 class VmaDeviceMemoryBlock

 {

 public:

-    uint32_t m_MemoryTypeIndex;

-    VkDeviceMemory m_hMemory;

-    VmaDeviceMemoryMapping m_Mapping;    

     VmaBlockMetadata m_Metadata;

 

     VmaDeviceMemoryBlock(VmaAllocator hAllocator);

 

     ~VmaDeviceMemoryBlock()

     {

+        VMA_ASSERT(m_MapCount == 0 && "VkDeviceMemory block is being destroyed while it is still mapped.");

         VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);

     }

 

@@ -3765,12 +4091,35 @@
     // Always call before destruction.

     void Destroy(VmaAllocator allocator);

     

+    VkDeviceMemory GetDeviceMemory() const { return m_hMemory; }

+    uint32_t GetMemoryTypeIndex() const { return m_MemoryTypeIndex; }

+    void* GetMappedData() const { return m_pMappedData; }

+

     // Validates all data structures inside this object. If not valid, returns false.

     bool Validate() const;

 

     // ppData can be null.

     VkResult Map(VmaAllocator hAllocator, uint32_t count, void** ppData);

     void Unmap(VmaAllocator hAllocator, uint32_t count);

+

+    VkResult BindBufferMemory(

+        const VmaAllocator hAllocator,

+        const VmaAllocation hAllocation,

+        VkBuffer hBuffer);

+    VkResult BindImageMemory(

+        const VmaAllocator hAllocator,

+        const VmaAllocation hAllocation,

+        VkImage hImage);

+

+private:

+    uint32_t m_MemoryTypeIndex;

+    VkDeviceMemory m_hMemory;

+

+    // Protects access to m_hMemory so it's not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.

+    // Also protects m_MapCount, m_pMappedData.

+    VMA_MUTEX m_Mutex;

+    uint32_t m_MapCount;

+    void* m_pMappedData;

 };

 

 struct VmaPointerLess

@@ -4136,6 +4485,9 @@
     VkResult Map(VmaAllocation hAllocation, void** ppData);

     void Unmap(VmaAllocation hAllocation);

 

+    VkResult BindBufferMemory(VmaAllocation hAllocation, VkBuffer hBuffer);

+    VkResult BindImageMemory(VmaAllocation hAllocation, VkImage hImage);

+

 private:

     VkDeviceSize m_PreferredLargeHeapBlockSize;

 

@@ -4634,7 +4986,7 @@
     switch(m_Type)

     {

     case ALLOCATION_TYPE_BLOCK:

-        return m_BlockAllocation.m_Block->m_hMemory;

+        return m_BlockAllocation.m_Block->GetDeviceMemory();

     case ALLOCATION_TYPE_DEDICATED:

         return m_DedicatedAllocation.m_hMemory;

     default:

@@ -4648,7 +5000,7 @@
     switch(m_Type)

     {

     case ALLOCATION_TYPE_BLOCK:

-        return m_BlockAllocation.m_Block->m_MemoryTypeIndex;

+        return m_BlockAllocation.m_Block->GetMemoryTypeIndex();

     case ALLOCATION_TYPE_DEDICATED:

         return m_DedicatedAllocation.m_MemoryTypeIndex;

     default:

@@ -4664,7 +5016,7 @@
     case ALLOCATION_TYPE_BLOCK:

         if(m_MapCount != 0)

         {

-            void* pBlockData = m_BlockAllocation.m_Block->m_Mapping.GetMappedData();

+            void* pBlockData = m_BlockAllocation.m_Block->GetMappedData();

             VMA_ASSERT(pBlockData != VMA_NULL);

             return (char*)pBlockData + m_BlockAllocation.m_Offset;

         }

@@ -5908,88 +6260,14 @@
 }

 

 ////////////////////////////////////////////////////////////////////////////////

-// class VmaDeviceMemoryMapping

-

-VmaDeviceMemoryMapping::VmaDeviceMemoryMapping() :

-    m_MapCount(0),

-    m_pMappedData(VMA_NULL)

-{

-}

-

-VmaDeviceMemoryMapping::~VmaDeviceMemoryMapping()

-{

-    VMA_ASSERT(m_MapCount == 0 && "VkDeviceMemory block is being destroyed while it is still mapped.");

-}

-

-VkResult VmaDeviceMemoryMapping::Map(VmaAllocator hAllocator, VkDeviceMemory hMemory, uint32_t count, void **ppData)

-{

-    if(count == 0)

-    {

-        return VK_SUCCESS;

-    }

-

-    VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);

-    if(m_MapCount != 0)

-    {

-        m_MapCount += count;

-        VMA_ASSERT(m_pMappedData != VMA_NULL);

-        if(ppData != VMA_NULL)

-        {

-            *ppData = m_pMappedData;

-        }

-        return VK_SUCCESS;

-    }

-    else

-    {

-        VkResult result = (*hAllocator->GetVulkanFunctions().vkMapMemory)(

-            hAllocator->m_hDevice,

-            hMemory,

-            0, // offset

-            VK_WHOLE_SIZE,

-            0, // flags

-            &m_pMappedData);

-        if(result == VK_SUCCESS)

-        {

-            if(ppData != VMA_NULL)

-            {

-                *ppData = m_pMappedData;

-            }

-            m_MapCount = count;

-        }

-        return result;

-    }

-}

-

-void VmaDeviceMemoryMapping::Unmap(VmaAllocator hAllocator, VkDeviceMemory hMemory, uint32_t count)

-{

-    if(count == 0)

-    {

-        return;

-    }

-

-    VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);

-    if(m_MapCount >= count)

-    {

-        m_MapCount -= count;

-        if(m_MapCount == 0)

-        {

-            m_pMappedData = VMA_NULL;

-            (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(hAllocator->m_hDevice, hMemory);

-        }

-    }

-    else

-    {

-        VMA_ASSERT(0 && "VkDeviceMemory block is being unmapped while it was not previously mapped.");

-    }

-}

-

-////////////////////////////////////////////////////////////////////////////////

 // class VmaDeviceMemoryBlock

 

 VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(VmaAllocator hAllocator) :

+    m_Metadata(hAllocator),

     m_MemoryTypeIndex(UINT32_MAX),

     m_hMemory(VK_NULL_HANDLE),

-    m_Metadata(hAllocator)

+    m_MapCount(0),

+    m_pMappedData(VMA_NULL)

 {

 }

 

@@ -6030,12 +6308,96 @@
 

 VkResult VmaDeviceMemoryBlock::Map(VmaAllocator hAllocator, uint32_t count, void** ppData)

 {

-    return m_Mapping.Map(hAllocator, m_hMemory, count, ppData);

+    if(count == 0)

+    {

+        return VK_SUCCESS;

+    }

+

+    VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);

+    if(m_MapCount != 0)

+    {

+        m_MapCount += count;

+        VMA_ASSERT(m_pMappedData != VMA_NULL);

+        if(ppData != VMA_NULL)

+        {

+            *ppData = m_pMappedData;

+        }

+        return VK_SUCCESS;

+    }

+    else

+    {

+        VkResult result = (*hAllocator->GetVulkanFunctions().vkMapMemory)(

+            hAllocator->m_hDevice,

+            m_hMemory,

+            0, // offset

+            VK_WHOLE_SIZE,

+            0, // flags

+            &m_pMappedData);

+        if(result == VK_SUCCESS)

+        {

+            if(ppData != VMA_NULL)

+            {

+                *ppData = m_pMappedData;

+            }

+            m_MapCount = count;

+        }

+        return result;

+    }

 }

 

 void VmaDeviceMemoryBlock::Unmap(VmaAllocator hAllocator, uint32_t count)

 {

-    m_Mapping.Unmap(hAllocator, m_hMemory, count);

+    if(count == 0)

+    {

+        return;

+    }

+

+    VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);

+    if(m_MapCount >= count)

+    {

+        m_MapCount -= count;

+        if(m_MapCount == 0)

+        {

+            m_pMappedData = VMA_NULL;

+            (*hAllocator->GetVulkanFunctions().vkUnmapMemory)(hAllocator->m_hDevice, m_hMemory);

+        }

+    }

+    else

+    {

+        VMA_ASSERT(0 && "VkDeviceMemory block is being unmapped while it was not previously mapped.");

+    }

+}

+

+VkResult VmaDeviceMemoryBlock::BindBufferMemory(

+    const VmaAllocator hAllocator,

+    const VmaAllocation hAllocation,

+    VkBuffer hBuffer)

+{

+    VMA_ASSERT(hAllocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &&

+        hAllocation->GetBlock() == this);

+    // This lock is important so that we don't call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.

+    VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);

+    return hAllocator->GetVulkanFunctions().vkBindBufferMemory(

+        hAllocator->m_hDevice,

+        hBuffer,

+        m_hMemory,

+        hAllocation->GetOffset());

+}

+

+VkResult VmaDeviceMemoryBlock::BindImageMemory(

+    const VmaAllocator hAllocator,

+    const VmaAllocation hAllocation,

+    VkImage hImage)

+{

+    VMA_ASSERT(hAllocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &&

+        hAllocation->GetBlock() == this);

+    // This lock is important so that we don't call vkBind... and/or vkMap... simultaneously on the same VkDeviceMemory from multiple threads.

+    VmaMutexLock lock(m_Mutex, hAllocator->m_UseMutex);

+    return hAllocator->GetVulkanFunctions().vkBindImageMemory(

+        hAllocator->m_hDevice,

+        hImage,

+        m_hMemory,

+        hAllocation->GetOffset());

 }

 

 static void InitStatInfo(VmaStatInfo& outInfo)

@@ -6429,7 +6791,7 @@
 

         if(hAllocation->IsPersistentMap())

         {

-            pBlock->m_Mapping.Unmap(m_hAllocator, pBlock->m_hMemory, 1);

+            pBlock->Unmap(m_hAllocator, 1);

         }

 

         pBlock->m_Metadata.Free(hAllocation);

@@ -6767,9 +7129,9 @@
     }

             

     // It is originally mapped.

-    if(m_pBlock->m_Mapping.GetMappedData())

+    if(m_pBlock->GetMappedData())

     {

-        *ppMappedData = m_pBlock->m_Mapping.GetMappedData();

+        *ppMappedData = m_pBlock->GetMappedData();

         return VK_SUCCESS;

     }

             

@@ -7992,6 +8354,56 @@
     }

 }

 

+VkResult VmaAllocator_T::BindBufferMemory(VmaAllocation hAllocation, VkBuffer hBuffer)

+{

+    VkResult res = VK_SUCCESS;

+    switch(hAllocation->GetType())

+    {

+    case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:

+        res = GetVulkanFunctions().vkBindBufferMemory(

+            m_hDevice,

+            hBuffer,

+            hAllocation->GetMemory(),

+            0); //memoryOffset

+        break;

+    case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:

+    {

+        VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();

+        VMA_ASSERT(pBlock && "Binding buffer to allocation that doesn't belong to any block. Is the allocation lost?");

+        res = pBlock->BindBufferMemory(this, hAllocation, hBuffer);

+        break;

+    }

+    default:

+        VMA_ASSERT(0);

+    }

+    return res;

+}

+

+VkResult VmaAllocator_T::BindImageMemory(VmaAllocation hAllocation, VkImage hImage)

+{

+    VkResult res = VK_SUCCESS;

+    switch(hAllocation->GetType())

+    {

+    case VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:

+        res = GetVulkanFunctions().vkBindImageMemory(

+            m_hDevice,

+            hImage,

+            hAllocation->GetMemory(),

+            0); //memoryOffset

+        break;

+    case VmaAllocation_T::ALLOCATION_TYPE_BLOCK:

+    {

+        VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();

+        VMA_ASSERT(pBlock && "Binding image to allocation that doesn't belong to any block. Is the allocation lost?");

+        res = pBlock->BindImageMemory(this, hAllocation, hImage);

+        break;

+    }

+    default:

+        VMA_ASSERT(0);

+    }

+    return res;

+}

+

 void VmaAllocator_T::FreeDedicatedMemory(VmaAllocation allocation)

 {

     VMA_ASSERT(allocation && allocation->GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);

@@ -8739,6 +9151,34 @@
     return allocator->Defragment(pAllocations, allocationCount, pAllocationsChanged, pDefragmentationInfo, pDefragmentationStats);

 }

 

+VkResult vmaBindBufferMemory(

+    VmaAllocator allocator,

+    VmaAllocation allocation,

+    VkBuffer buffer)

+{

+    VMA_ASSERT(allocator && allocation && buffer);

+

+    VMA_DEBUG_LOG("vmaBindBufferMemory");

+

+    VMA_DEBUG_GLOBAL_MUTEX_LOCK

+

+    return allocator->BindBufferMemory(allocation, buffer);

+}

+

+VkResult vmaBindImageMemory(

+    VmaAllocator allocator,

+    VmaAllocation allocation,

+    VkImage image)

+{

+    VMA_ASSERT(allocator && allocation && image);

+

+    VMA_DEBUG_LOG("vmaBindImageMemory");

+

+    VMA_DEBUG_GLOBAL_MUTEX_LOCK

+

+    return allocator->BindImageMemory(allocation, image);

+}

+

 VkResult vmaCreateBuffer(

     VmaAllocator allocator,

     const VkBufferCreateInfo* pBufferCreateInfo,

@@ -8802,11 +9242,7 @@
         if(res >= 0)

         {

             // 3. Bind buffer with memory.

-            res = (*allocator->GetVulkanFunctions().vkBindBufferMemory)(

-                allocator->m_hDevice,

-                *pBuffer,

-                (*pAllocation)->GetMemory(),

-                (*pAllocation)->GetOffset());

+            res = allocator->BindBufferMemory(*pAllocation, *pBuffer);

             if(res >= 0)

             {

                 // All steps succeeded.

@@ -8882,11 +9318,7 @@
         if(res >= 0)

         {

             // 3. Bind image with memory.

-            res = (*allocator->GetVulkanFunctions().vkBindImageMemory)(

-                allocator->m_hDevice,

-                *pImage,

-                (*pAllocation)->GetMemory(),

-                (*pAllocation)->GetOffset());

+            res = allocator->BindImageMemory(*pAllocation, *pImage);

             if(res >= 0)

             {

                 // All steps succeeded.