Merge branch 'master' into allocation_defragmentation_strategies

# Conflicts:
#	docs/html/vk__mem__alloc_8h_source.html
#	src/Tests.cpp
#	src/vk_mem_alloc.h
diff --git a/docs/html/annotated.html b/docs/html/annotated.html
index 5cca84d..3e67fd5 100644
--- a/docs/html/annotated.html
+++ b/docs/html/annotated.html
@@ -72,16 +72,18 @@
 <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_record_settings.html" target="_self">VmaRecordSettings</a></td><td class="desc">Parameters for recording calls to VMA functions. To be used in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a> </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_stat_info.html" target="_self">VmaStatInfo</a></td><td class="desc">Calculated statistics of memory usage in entire 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_stats.html" target="_self">VmaStats</a></td><td class="desc">General statistics from current state of Allocator </td></tr>
-<tr id="row_14_" 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_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_context.html" target="_self">VmaDefragmentationContext</a></td><td class="desc">Represents Opaque object that represents started defragmentation process </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_info.html" target="_self">VmaDefragmentationInfo</a></td><td class="desc">Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. 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_defragmentation_info2.html" target="_self">VmaDefragmentationInfo2</a></td><td class="desc">Parameters for defragmentation </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_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="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a> </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_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_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.html" target="_self">VmaPool</a></td><td class="desc">Represents custom memory pool </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_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_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_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_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_record_settings.html" target="_self">VmaRecordSettings</a></td><td class="desc">Parameters for recording calls to VMA functions. To be used in <a class="el" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee" title="Parameters for recording of VMA calls. Can be null. ">VmaAllocatorCreateInfo::pRecordSettings</a> </td></tr>
+<tr id="row_14_" 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_15_"><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_16_" 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>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/docs/html/classes.html b/docs/html/classes.html
index d922236..1b93e8a 100644
--- a/docs/html/classes.html
+++ b/docs/html/classes.html
@@ -68,10 +68,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.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_record_settings.html">VmaRecordSettings</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_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_info.html">VmaDefragmentationInfo</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_stat_info.html">VmaStatInfo</a>&#160;&#160;&#160;</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_defragmentation_info2.html">VmaDefragmentationInfo2</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></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_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_allocation_create_info.html">VmaAllocationCreateInfo</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</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_record_settings.html">VmaRecordSettings</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/defragmentation.html b/docs/html/defragmentation.html
index 72fa300..4f232ec 100644
--- a/docs/html/defragmentation.html
+++ b/docs/html/defragmentation.html
@@ -70,13 +70,13 @@
 </div><!--header-->
 <div class="contents">
 <div class="textblock"><p>Interleaved allocations and deallocations of many objects of varying size can cause fragmentation, which can lead to a situation where the library is unable to find a continuous range of free memory for a new allocation despite there is enough free space, just scattered across many small free ranges between existing allocations.</p>
-<p>To mitigate this problem, you can use <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>. Given set of allocations, this function can move them to compact used memory, ensure more continuous free space and possibly also free some <code>VkDeviceMemory</code>. Currently it can work only on allocations made from memory type that is <code>HOST_VISIBLE</code> and <code>HOST_COHERENT</code>. Allocations are modified to point to the new <code>VkDeviceMemory</code> and offset. Data in this memory is also <code>memmove</code>-ed to the new place. However, if you have images or buffers bound to these allocations (and you certainly do), you need to destroy, recreate, and bind them to the new place in memory.</p>
+<p>To mitigate this problem, you can use <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>. Given set of allocations, this function can move them to compact used memory, ensure more continuous free space and possibly also free some <code>VkDeviceMemory</code>. Currently it can work only on allocations made from memory type that is <code>HOST_VISIBLE</code> and <code>HOST_COHERENT</code>. Allocations are modified to point to the new <code>VkDeviceMemory</code> and offset. Data in this memory is also <code>memmove</code>-ed to the new place. However, if you have images or buffers bound to these allocations (and you certainly do), you need to destroy, recreate, and bind them to the new place in memory.</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"><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"><span class="keyword">const</span> <span class="keywordtype">size_t</span> allocCount = allocations.size();</div><div class="line"></div><div class="line">std::vector&lt;VkBool32&gt; allocationsChanged(allocCount);</div><div class="line"><a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(allocator, allocations.data(), allocCount, 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; allocCount; ++i)</div><div class="line">{</div><div class="line">    <span class="keywordflow">if</span>(allocationsChanged[i])</div><div class="line">    {</div><div class="line">        <span class="comment">// Destroy buffers that is immutably bound to memory region which is no longer valid.</span></div><div class="line">        vkDestroyBuffer(device, buffers[i], <span class="keyword">nullptr</span>);</div><div class="line"></div><div class="line">        <span class="comment">// Create new buffer with same parameters.</span></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">        <span class="comment">// Bind new buffer with new memory region. Data contained in it is already there.</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, allocations[i], &amp;allocInfo);</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>Please don't expect memory to be fully compacted after defragmentation. 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 allocations that needs to be moved. Some fragmentation still remains after this call. This is normal.</p>
 <p>If you defragment allocations bound to images, these images should be created with <code>VK_IMAGE_CREATE_ALIAS_BIT</code> flag, to make sure that new image created with same parameters and pointing to data copied to another memory region will interpret its contents consistently. Otherwise you may experience corrupted data on some implementations, e.g. due to different pixel swizzling used internally by the graphics driver.</p>
 <p>If you defragment allocations bound to images, new images to be bound to new memory region after defragmentation should be created with <code>VK_IMAGE_LAYOUT_PREINITIALIZED</code> and then transitioned to their original layout from before defragmentation using an image memory barrier.</p>
-<p>For further details, see documentation of function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>. </p>
+<p>For further details, see documentation of function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>. </p>
 </div></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/docs/html/deprecated.html b/docs/html/deprecated.html
new file mode 100644
index 0000000..d6e0868
--- /dev/null
+++ b/docs/html/deprecated.html
@@ -0,0 +1,82 @@
+<!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.14"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: Deprecated List</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.14 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */</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">Deprecated List </div>  </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><dl class="reflist">
+<dt><a class="anchor" id="_deprecated000002"></a>Member <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>  (<a class="el" href="struct_vma_allocator.html" title="Represents main object of this library initialized. ">VmaAllocator</a> allocator, <a class="el" href="struct_vma_allocation.html" title="Represents single memory allocation. ">VmaAllocation</a> *pAllocations, size_t allocationCount, VkBool32 *pAllocationsChanged, const <a class="el" href="struct_vma_defragmentation_info.html" title="Deprecated. Optional configuration parameters to be passed to function vmaDefragment(). ">VmaDefragmentationInfo</a> *pDefragmentationInfo, <a class="el" href="struct_vma_defragmentation_stats.html" title="Statistics returned by function vmaDefragment(). ">VmaDefragmentationStats</a> *pDefragmentationStats)</dt>
+<dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation. ">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a> instead. </dd>
+<dt><a class="anchor" id="_deprecated000001"></a>Member <a class="el" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>  </dt>
+<dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation. ">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a> instead. </dd>
+</dl>
+</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.14
+</small></address>
+</body>
+</html>
diff --git a/docs/html/functions.html b/docs/html/functions.html
index 508e7c6..59a3c87 100644
--- a/docs/html/functions.html
+++ b/docs/html/functions.html
@@ -65,7 +65,8 @@
 
 <h3><a id="index_a"></a>- a -</h3><ul>
 <li>allocationCount
-: <a class="el" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats</a>
+: <a class="el" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">VmaDefragmentationInfo2</a>
+, <a class="el" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats</a>
 , <a class="el" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">VmaStatInfo</a>
 </li>
 <li>allocationSizeAvg
@@ -77,6 +78,9 @@
 <li>allocationSizeMin
 : <a class="el" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">VmaStatInfo</a>
 </li>
+<li>allocationsLost
+: <a class="el" href="struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03">VmaDefragmentationStats</a>
+</li>
 <li>allocationsMoved
 : <a class="el" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">VmaDefragmentationStats</a>
 </li>
@@ -117,6 +121,7 @@
 <li>flags
 : <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo</a>
 , <a class="el" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo</a>
+, <a class="el" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">VmaDefragmentationInfo2</a>
 , <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo</a>
 , <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings</a>
 </li>
@@ -137,6 +142,18 @@
 <li>maxBytesToMove
 : <a class="el" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">VmaDefragmentationInfo</a>
 </li>
+<li>maxCpuAllocationsToMove
+: <a class="el" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2</a>
+</li>
+<li>maxCpuBytesToMove
+: <a class="el" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2</a>
+</li>
+<li>maxGpuAllocationsToMove
+: <a class="el" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2</a>
+</li>
+<li>maxGpuBytesToMove
+: <a class="el" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2</a>
+</li>
 <li>memoryHeap
 : <a class="el" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">VmaStats</a>
 </li>
@@ -167,6 +184,12 @@
 <li>pAllocationCallbacks
 : <a class="el" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">VmaAllocatorCreateInfo</a>
 </li>
+<li>pAllocations
+: <a class="el" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">VmaDefragmentationInfo2</a>
+</li>
+<li>pAllocationsChanged
+: <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2</a>
+</li>
 <li>pDeviceMemoryCallbacks
 : <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo</a>
 </li>
diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html
index 6e0c81b..614513b 100644
--- a/docs/html/functions_vars.html
+++ b/docs/html/functions_vars.html
@@ -65,7 +65,8 @@
 
 <h3><a id="index_a"></a>- a -</h3><ul>
 <li>allocationCount
-: <a class="el" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats</a>
+: <a class="el" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">VmaDefragmentationInfo2</a>
+, <a class="el" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">VmaPoolStats</a>
 , <a class="el" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">VmaStatInfo</a>
 </li>
 <li>allocationSizeAvg
@@ -77,6 +78,9 @@
 <li>allocationSizeMin
 : <a class="el" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">VmaStatInfo</a>
 </li>
+<li>allocationsLost
+: <a class="el" href="struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03">VmaDefragmentationStats</a>
+</li>
 <li>allocationsMoved
 : <a class="el" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">VmaDefragmentationStats</a>
 </li>
@@ -117,6 +121,7 @@
 <li>flags
 : <a class="el" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">VmaAllocationCreateInfo</a>
 , <a class="el" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">VmaAllocatorCreateInfo</a>
+, <a class="el" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">VmaDefragmentationInfo2</a>
 , <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">VmaPoolCreateInfo</a>
 , <a class="el" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings</a>
 </li>
@@ -137,6 +142,18 @@
 <li>maxBytesToMove
 : <a class="el" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">VmaDefragmentationInfo</a>
 </li>
+<li>maxCpuAllocationsToMove
+: <a class="el" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2</a>
+</li>
+<li>maxCpuBytesToMove
+: <a class="el" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2</a>
+</li>
+<li>maxGpuAllocationsToMove
+: <a class="el" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2</a>
+</li>
+<li>maxGpuBytesToMove
+: <a class="el" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2</a>
+</li>
 <li>memoryHeap
 : <a class="el" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">VmaStats</a>
 </li>
@@ -167,6 +184,12 @@
 <li>pAllocationCallbacks
 : <a class="el" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d">VmaAllocatorCreateInfo</a>
 </li>
+<li>pAllocations
+: <a class="el" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">VmaDefragmentationInfo2</a>
+</li>
+<li>pAllocationsChanged
+: <a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2</a>
+</li>
 <li>pDeviceMemoryCallbacks
 : <a class="el" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e">VmaAllocatorCreateInfo</a>
 </li>
diff --git a/docs/html/globals.html b/docs/html/globals.html
index baa9589..5e3aa2d 100644
--- a/docs/html/globals.html
+++ b/docs/html/globals.html
@@ -138,6 +138,21 @@
 <li>VMA_DEDICATED_ALLOCATION
 : <a class="el" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4">vk_mem_alloc.h</a>
 </li>
+<li>VMA_DEFRAGMENTATION_ALGORITHM_MASK
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d">vk_mem_alloc.h</a>
+</li>
+<li>VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071">vk_mem_alloc.h</a>
+</li>
+<li>VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f">vk_mem_alloc.h</a>
+</li>
+<li>VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">vk_mem_alloc.h</a>
+</li>
+<li>VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46">vk_mem_alloc.h</a>
+</li>
 <li>VMA_MEMORY_USAGE_CPU_ONLY
 : <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">vk_mem_alloc.h</a>
 </li>
@@ -249,9 +264,24 @@
 <li>vmaDefragment()
 : <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vk_mem_alloc.h</a>
 </li>
+<li>vmaDefragmentationBegin()
+: <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vk_mem_alloc.h</a>
+</li>
+<li>vmaDefragmentationEnd()
+: <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vk_mem_alloc.h</a>
+</li>
+<li>VmaDefragmentationFlagBits
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">vk_mem_alloc.h</a>
+</li>
+<li>VmaDefragmentationFlags
+: <a class="el" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">vk_mem_alloc.h</a>
+</li>
 <li>VmaDefragmentationInfo
 : <a class="el" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">vk_mem_alloc.h</a>
 </li>
+<li>VmaDefragmentationInfo2
+: <a class="el" href="vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29">vk_mem_alloc.h</a>
+</li>
 <li>VmaDefragmentationStats
 : <a class="el" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/globals_enum.html b/docs/html/globals_enum.html
index ba9dcc7..dfdb8e3 100644
--- a/docs/html/globals_enum.html
+++ b/docs/html/globals_enum.html
@@ -68,6 +68,9 @@
 <li>VmaAllocatorCreateFlagBits
 : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">vk_mem_alloc.h</a>
 </li>
+<li>VmaDefragmentationFlagBits
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">vk_mem_alloc.h</a>
+</li>
 <li>VmaMemoryUsage
 : <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/globals_eval.html b/docs/html/globals_eval.html
index 7a471e0..f64abbf 100644
--- a/docs/html/globals_eval.html
+++ b/docs/html/globals_eval.html
@@ -118,6 +118,21 @@
 <li>VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT
 : <a class="el" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878">vk_mem_alloc.h</a>
 </li>
+<li>VMA_DEFRAGMENTATION_ALGORITHM_MASK
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d">vk_mem_alloc.h</a>
+</li>
+<li>VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071">vk_mem_alloc.h</a>
+</li>
+<li>VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f">vk_mem_alloc.h</a>
+</li>
+<li>VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">vk_mem_alloc.h</a>
+</li>
+<li>VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT
+: <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46">vk_mem_alloc.h</a>
+</li>
 <li>VMA_MEMORY_USAGE_CPU_ONLY
 : <a class="el" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/globals_func.html b/docs/html/globals_func.html
index 01c7244..923fba5 100644
--- a/docs/html/globals_func.html
+++ b/docs/html/globals_func.html
@@ -109,6 +109,12 @@
 <li>vmaDefragment()
 : <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vk_mem_alloc.h</a>
 </li>
+<li>vmaDefragmentationBegin()
+: <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vk_mem_alloc.h</a>
+</li>
+<li>vmaDefragmentationEnd()
+: <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vk_mem_alloc.h</a>
+</li>
 <li>vmaDestroyAllocator()
 : <a class="el" href="vk__mem__alloc_8h.html#aa8d164061c88f22fb1fd3c8f3534bc1d">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/globals_type.html b/docs/html/globals_type.html
index e0c4903..318abd6 100644
--- a/docs/html/globals_type.html
+++ b/docs/html/globals_type.html
@@ -89,9 +89,18 @@
 <li>VmaAllocatorCreateInfo
 : <a class="el" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">vk_mem_alloc.h</a>
 </li>
+<li>VmaDefragmentationFlagBits
+: <a class="el" href="vk__mem__alloc_8h.html#a96df0eddab2e1735782fe4e7cd05ea7f">vk_mem_alloc.h</a>
+</li>
+<li>VmaDefragmentationFlags
+: <a class="el" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">vk_mem_alloc.h</a>
+</li>
 <li>VmaDefragmentationInfo
 : <a class="el" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">vk_mem_alloc.h</a>
 </li>
+<li>VmaDefragmentationInfo2
+: <a class="el" href="vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29">vk_mem_alloc.h</a>
+</li>
 <li>VmaDefragmentationStats
 : <a class="el" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">vk_mem_alloc.h</a>
 </li>
diff --git a/docs/html/pages.html b/docs/html/pages.html
index d1fd68e..b6f8ac7 100644
--- a/docs/html/pages.html
+++ b/docs/html/pages.html
@@ -67,6 +67,7 @@
 <div class="contents">
 <div class="textblock">Here is a list of all related documentation pages:</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><a class="el" href="deprecated.html" target="_self">Deprecated List</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->
diff --git a/docs/html/record_and_replay.html b/docs/html/record_and_replay.html
index 4694260..9186e5a 100644
--- a/docs/html/record_and_replay.html
+++ b/docs/html/record_and_replay.html
@@ -87,7 +87,7 @@
 <ul>
 <li>Replaying file that was recorded on a different GPU (with different parameters like <code>bufferImageGranularity</code>, <code>nonCoherentAtomSize</code>, and especially different set of memory heaps and types) may give different performance and memory usage results, as well as issue some warnings and errors.</li>
 <li>Current implementation of recording in VMA, as well as VmaReplay application, is coded and tested only on Windows. Inclusion of recording code is driven by <code>VMA_RECORDING_ENABLED</code> macro. Support for other platforms should be easy to add. Contributions are welcomed.</li>
-<li>Currently calls to <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a> function are not recorded. </li>
+<li>Currently calls to <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a> function are not recorded. </li>
 </ul>
 </div></div><!-- contents -->
 <!-- start footer part -->
diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js
index a4ffe71..56cab93 100644
--- a/docs/html/search/all_0.js
+++ b/docs/html/search/all_0.js
@@ -1,9 +1,10 @@
 var searchData=
 [
   ['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()']]],
+  ['allocationcount',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()'],['../struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57',1,'VmaDefragmentationInfo2::allocationCount()']]],
   ['allocationsizeavg',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]],
   ['allocationsizemax',['allocationSizeMax',['../struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c',1,'VmaStatInfo']]],
   ['allocationsizemin',['allocationSizeMin',['../struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea',1,'VmaStatInfo']]],
+  ['allocationslost',['allocationsLost',['../struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03',1,'VmaDefragmentationStats']]],
   ['allocationsmoved',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]]
 ];
diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js
index fa59846..f670fb3 100644
--- a/docs/html/search/all_10.js
+++ b/docs/html/search/all_10.js
@@ -38,6 +38,11 @@
   ['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_5fdedicated_5fallocation',['VMA_DEDICATED_ALLOCATION',['../vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5falgorithm_5fmask',['VMA_DEFRAGMENTATION_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fcan_5fmake_5flost_5fbit',['VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5ffast_5falgorithm_5fbit',['VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5foptimal_5falgorithm_5fbit',['VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46',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']]],
@@ -77,7 +82,13 @@
   ['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']]],
+  ['vmadefragmentationbegin',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationcontext',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
+  ['vmadefragmentationend',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'VmaDefragmentationFlagBits():&#160;vk_mem_alloc.h'],['../vk__mem__alloc_8h.html#a96df0eddab2e1735782fe4e7cd05ea7f',1,'VmaDefragmentationFlagBits():&#160;vk_mem_alloc.h']]],
+  ['vmadefragmentationflags',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',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']]],
+  ['vmadefragmentationinfo2',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.html',1,'VmaDefragmentationInfo2'],['../vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29',1,'VmaDefragmentationInfo2():&#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']]],
diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js
index 82a7aa0..715ca42 100644
--- a/docs/html/search/all_3.js
+++ b/docs/html/search/all_3.js
@@ -2,6 +2,7 @@
 [
   ['debugging_20incorrect_20memory_20usage',['Debugging incorrect memory usage',['../debugging_memory_usage.html',1,'index']]],
   ['defragmentation',['Defragmentation',['../defragmentation.html',1,'index']]],
+  ['deprecated_20list',['Deprecated List',['../deprecated.html',1,'']]],
   ['device',['device',['../struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500',1,'VmaAllocatorCreateInfo']]],
   ['devicememory',['deviceMemory',['../struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67',1,'VmaAllocationInfo']]],
   ['devicememoryblocksfreed',['deviceMemoryBlocksFreed',['../struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b',1,'VmaDefragmentationStats']]]
diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js
index 347c9f3..09f7db0 100644
--- a/docs/html/search/all_4.js
+++ b/docs/html/search/all_4.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['flags',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()']]],
+  ['flags',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()'],['../struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9',1,'VmaDefragmentationInfo2::flags()']]],
   ['frameinusecount',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]]
 ];
diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js
index 8e80e1a..f9722b1 100644
--- a/docs/html/search/all_7.js
+++ b/docs/html/search/all_7.js
@@ -3,6 +3,10 @@
   ['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']]],
+  ['maxcpuallocationstomove',['maxCpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671',1,'VmaDefragmentationInfo2']]],
+  ['maxcpubytestomove',['maxCpuBytesToMove',['../struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a',1,'VmaDefragmentationInfo2']]],
+  ['maxgpuallocationstomove',['maxGpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6',1,'VmaDefragmentationInfo2']]],
+  ['maxgpubytestomove',['maxGpuBytesToMove',['../struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08',1,'VmaDefragmentationInfo2']]],
   ['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()']]],
diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js
index 33e01da..189ffb1 100644
--- a/docs/html/search/all_a.js
+++ b/docs/html/search/all_a.js
@@ -1,6 +1,8 @@
 var searchData=
 [
   ['pallocationcallbacks',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
+  ['pallocations',['pAllocations',['../struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96',1,'VmaDefragmentationInfo2']]],
+  ['pallocationschanged',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]],
   ['pdevicememorycallbacks',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
   ['pfilepath',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
   ['pfn_5fvmaallocatedevicememoryfunction',['PFN_vmaAllocateDeviceMemoryFunction',['../vk__mem__alloc_8h.html#ab6a6477cda1ce775b30bde96d766203b',1,'vk_mem_alloc.h']]],
diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js
index 7fe2da1..72076b0 100644
--- a/docs/html/search/classes_0.js
+++ b/docs/html/search/classes_0.js
@@ -5,7 +5,9 @@
   ['vmaallocationinfo',['VmaAllocationInfo',['../struct_vma_allocation_info.html',1,'']]],
   ['vmaallocator',['VmaAllocator',['../struct_vma_allocator.html',1,'']]],
   ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../struct_vma_allocator_create_info.html',1,'']]],
+  ['vmadefragmentationcontext',['VmaDefragmentationContext',['../struct_vma_defragmentation_context.html',1,'']]],
   ['vmadefragmentationinfo',['VmaDefragmentationInfo',['../struct_vma_defragmentation_info.html',1,'']]],
+  ['vmadefragmentationinfo2',['VmaDefragmentationInfo2',['../struct_vma_defragmentation_info2.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,'']]],
diff --git a/docs/html/search/enums_0.js b/docs/html/search/enums_0.js
index c5ed539..d6d3bba 100644
--- a/docs/html/search/enums_0.js
+++ b/docs/html/search/enums_0.js
@@ -2,6 +2,7 @@
 [
   ['vmaallocationcreateflagbits',['VmaAllocationCreateFlagBits',['../vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597',1,'vk_mem_alloc.h']]],
   ['vmaallocatorcreateflagbits',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c',1,'vk_mem_alloc.h']]],
   ['vmamemoryusage',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc',1,'vk_mem_alloc.h']]],
   ['vmapoolcreateflagbits',['VmaPoolCreateFlagBits',['../vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7',1,'vk_mem_alloc.h']]],
   ['vmarecordflagbits',['VmaRecordFlagBits',['../vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2',1,'vk_mem_alloc.h']]]
diff --git a/docs/html/search/enumvalues_0.js b/docs/html/search/enumvalues_0.js
index b5c4734..e661042 100644
--- a/docs/html/search/enumvalues_0.js
+++ b/docs/html/search/enumvalues_0.js
@@ -18,6 +18,11 @@
   ['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_5fdefragmentation_5falgorithm_5fmask',['VMA_DEFRAGMENTATION_ALGORITHM_MASK',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fcan_5fmake_5flost_5fbit',['VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5ffast_5falgorithm_5fbit',['VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5fflag_5fbits_5fmax_5fenum',['VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97',1,'vk_mem_alloc.h']]],
+  ['vma_5fdefragmentation_5foptimal_5falgorithm_5fbit',['VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT',['../vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46',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']]],
diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js
index a3a5531..4746a90 100644
--- a/docs/html/search/functions_0.js
+++ b/docs/html/search/functions_0.js
@@ -15,6 +15,8 @@
   ['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']]],
+  ['vmadefragmentationbegin',['vmaDefragmentationBegin',['../vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationend',['vmaDefragmentationEnd',['../vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2',1,'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']]],
diff --git a/docs/html/search/pages_2.js b/docs/html/search/pages_2.js
index 12ea7b1..f45f413 100644
--- a/docs/html/search/pages_2.js
+++ b/docs/html/search/pages_2.js
@@ -1,5 +1,6 @@
 var searchData=
 [
   ['debugging_20incorrect_20memory_20usage',['Debugging incorrect memory usage',['../debugging_memory_usage.html',1,'index']]],
-  ['defragmentation',['Defragmentation',['../defragmentation.html',1,'index']]]
+  ['defragmentation',['Defragmentation',['../defragmentation.html',1,'index']]],
+  ['deprecated_20list',['Deprecated List',['../deprecated.html',1,'']]]
 ];
diff --git a/docs/html/search/typedefs_1.js b/docs/html/search/typedefs_1.js
index 5d53a90..24b8c6a 100644
--- a/docs/html/search/typedefs_1.js
+++ b/docs/html/search/typedefs_1.js
@@ -7,7 +7,10 @@
   ['vmaallocatorcreateflagbits',['VmaAllocatorCreateFlagBits',['../vk__mem__alloc_8h.html#a4ddf381b6ce795bdfbc6c614640b9915',1,'vk_mem_alloc.h']]],
   ['vmaallocatorcreateflags',['VmaAllocatorCreateFlags',['../vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d',1,'vk_mem_alloc.h']]],
   ['vmaallocatorcreateinfo',['VmaAllocatorCreateInfo',['../vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflagbits',['VmaDefragmentationFlagBits',['../vk__mem__alloc_8h.html#a96df0eddab2e1735782fe4e7cd05ea7f',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationflags',['VmaDefragmentationFlags',['../vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d',1,'vk_mem_alloc.h']]],
   ['vmadefragmentationinfo',['VmaDefragmentationInfo',['../vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0',1,'vk_mem_alloc.h']]],
+  ['vmadefragmentationinfo2',['VmaDefragmentationInfo2',['../vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29',1,'vk_mem_alloc.h']]],
   ['vmadefragmentationstats',['VmaDefragmentationStats',['../vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9',1,'vk_mem_alloc.h']]],
   ['vmadevicememorycallbacks',['VmaDeviceMemoryCallbacks',['../vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31',1,'vk_mem_alloc.h']]],
   ['vmamemoryusage',['VmaMemoryUsage',['../vk__mem__alloc_8h.html#ad63b2113c0bfdbeade1cb498f5a8580d',1,'vk_mem_alloc.h']]],
diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js
index 5a39104..5da3361 100644
--- a/docs/html/search/variables_0.js
+++ b/docs/html/search/variables_0.js
@@ -1,8 +1,9 @@
 var searchData=
 [
-  ['allocationcount',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()']]],
+  ['allocationcount',['allocationCount',['../struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff',1,'VmaStatInfo::allocationCount()'],['../struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb',1,'VmaPoolStats::allocationCount()'],['../struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57',1,'VmaDefragmentationInfo2::allocationCount()']]],
   ['allocationsizeavg',['allocationSizeAvg',['../struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599',1,'VmaStatInfo']]],
   ['allocationsizemax',['allocationSizeMax',['../struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c',1,'VmaStatInfo']]],
   ['allocationsizemin',['allocationSizeMin',['../struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea',1,'VmaStatInfo']]],
+  ['allocationslost',['allocationsLost',['../struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03',1,'VmaDefragmentationStats']]],
   ['allocationsmoved',['allocationsMoved',['../struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9',1,'VmaDefragmentationStats']]]
 ];
diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js
index 347c9f3..09f7db0 100644
--- a/docs/html/search/variables_3.js
+++ b/docs/html/search/variables_3.js
@@ -1,5 +1,5 @@
 var searchData=
 [
-  ['flags',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()']]],
+  ['flags',['flags',['../struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a',1,'VmaRecordSettings::flags()'],['../struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346',1,'VmaAllocatorCreateInfo::flags()'],['../struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b',1,'VmaAllocationCreateInfo::flags()'],['../struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446',1,'VmaPoolCreateInfo::flags()'],['../struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9',1,'VmaDefragmentationInfo2::flags()']]],
   ['frameinusecount',['frameInUseCount',['../struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7',1,'VmaAllocatorCreateInfo::frameInUseCount()'],['../struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa',1,'VmaPoolCreateInfo::frameInUseCount()']]]
 ];
diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js
index 96a5bce..2bbb589 100644
--- a/docs/html/search/variables_4.js
+++ b/docs/html/search/variables_4.js
@@ -3,6 +3,10 @@
   ['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']]],
+  ['maxcpuallocationstomove',['maxCpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671',1,'VmaDefragmentationInfo2']]],
+  ['maxcpubytestomove',['maxCpuBytesToMove',['../struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a',1,'VmaDefragmentationInfo2']]],
+  ['maxgpuallocationstomove',['maxGpuAllocationsToMove',['../struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6',1,'VmaDefragmentationInfo2']]],
+  ['maxgpubytestomove',['maxGpuBytesToMove',['../struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08',1,'VmaDefragmentationInfo2']]],
   ['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']]],
diff --git a/docs/html/search/variables_6.js b/docs/html/search/variables_6.js
index 46cab85..3882b4b 100644
--- a/docs/html/search/variables_6.js
+++ b/docs/html/search/variables_6.js
@@ -1,6 +1,8 @@
 var searchData=
 [
   ['pallocationcallbacks',['pAllocationCallbacks',['../struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d',1,'VmaAllocatorCreateInfo']]],
+  ['pallocations',['pAllocations',['../struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96',1,'VmaDefragmentationInfo2']]],
+  ['pallocationschanged',['pAllocationsChanged',['../struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc',1,'VmaDefragmentationInfo2']]],
   ['pdevicememorycallbacks',['pDeviceMemoryCallbacks',['../struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e',1,'VmaAllocatorCreateInfo']]],
   ['pfilepath',['pFilePath',['../struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d',1,'VmaRecordSettings']]],
   ['pfnallocate',['pfnAllocate',['../struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb',1,'VmaDeviceMemoryCallbacks']]],
diff --git a/docs/html/struct_vma_allocation_info.html b/docs/html/struct_vma_allocation_info.html
index 4c852a6..8ce6039 100644
--- a/docs/html/struct_vma_allocation_info.html
+++ b/docs/html/struct_vma_allocation_info.html
@@ -112,7 +112,7 @@
 
 <p>Handle to Vulkan memory object. </p>
 <p>Same memory object can be shared by multiple allocations.</p>
-<p>It can 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, or if allocation is lost.</p>
+<p>It can change after call to <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a> if this allocation is passed to the function, or if allocation is lost.</p>
 <p>If the allocation is lost, it is equal to <code>VK_NULL_HANDLE</code>. </p>
 
 </div>
@@ -147,7 +147,7 @@
 </div><div class="memdoc">
 
 <p>Offset into deviceMemory object to the beginning of this allocation, in bytes. (deviceMemory, offset) pair is unique to this allocation. </p>
-<p>It can 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, or if allocation is lost. </p>
+<p>It can change after call to <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a> if this allocation is passed to the function, or if allocation is lost. </p>
 
 </div>
 </div>
@@ -165,7 +165,7 @@
 
 <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 <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>
+<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="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a> if this allocation is passed to the function. </p>
 
 </div>
 </div>
diff --git a/docs/html/struct_vma_defragmentation_context.html b/docs/html/struct_vma_defragmentation_context.html
new file mode 100644
index 0000000..8bb9cd8
--- /dev/null
+++ b/docs/html/struct_vma_defragmentation_context.html
@@ -0,0 +1,87 @@
+<!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.14"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: VmaDefragmentationContext 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.14 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */</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">VmaDefragmentationContext Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Represents Opaque object that represents started defragmentation process.  
+ <a href="struct_vma_defragmentation_context.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 Opaque object that represents started defragmentation process. </p>
+<p>Fill structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation. ">VmaDefragmentationInfo2</a> and call function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a> to create it. Call function <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process. ">vmaDefragmentationEnd()</a> to destroy it. </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.14
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_defragmentation_info.html b/docs/html/struct_vma_defragmentation_info.html
index eed9785..65105f1 100644
--- a/docs/html/struct_vma_defragmentation_info.html
+++ b/docs/html/struct_vma_defragmentation_info.html
@@ -69,7 +69,7 @@
 </div><!--header-->
 <div class="contents">
 
-<p>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>.  
+<p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>.  
  <a href="struct_vma_defragmentation_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>
@@ -84,7 +84,8 @@
 <tr class="separator:aa7c7304e13c71f604c907196c4e28fbc"><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>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>. </p>
+<div class="textblock"><p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>. </p>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation. ">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a> instead. </dd></dl>
 </div><h2 class="groupheader">Member Data Documentation</h2>
 <a id="aa7c7304e13c71f604c907196c4e28fbc"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aa7c7304e13c71f604c907196c4e28fbc">&#9670;&nbsp;</a></span>maxAllocationsToMove</h2>
diff --git a/docs/html/struct_vma_defragmentation_info2-members.html b/docs/html/struct_vma_defragmentation_info2-members.html
new file mode 100644
index 0000000..9e33d1d
--- /dev/null
+++ b/docs/html/struct_vma_defragmentation_info2-members.html
@@ -0,0 +1,87 @@
+<!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.14"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: Member List</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.14 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */</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">VmaDefragmentationInfo2 Member List</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>, including all inherited members.</p>
+<table class="directory">
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">allocationCount</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td><td class="entry"></td></tr>
+</table></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.14
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_defragmentation_info2.html b/docs/html/struct_vma_defragmentation_info2.html
new file mode 100644
index 0000000..5223559
--- /dev/null
+++ b/docs/html/struct_vma_defragmentation_info2.html
@@ -0,0 +1,253 @@
+<!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.14"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Vulkan Memory Allocator: VmaDefragmentationInfo2 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.14 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
+$(function() {
+  initMenu('',true,false,'search.php','Search');
+  $(document).ready(function() { init_search(); });
+});
+/* @license-end */</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="summary">
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="struct_vma_defragmentation_info2-members.html">List of all members</a>  </div>
+  <div class="headertitle">
+<div class="title">VmaDefragmentationInfo2 Struct Reference</div>  </div>
+</div><!--header-->
+<div class="contents">
+
+<p>Parameters for defragmentation.  
+ <a href="struct_vma_defragmentation_info2.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>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a53e844ee5633e229cf6daf14b2d9fff9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a></td></tr>
+<tr class="memdesc:a53e844ee5633e229cf6daf14b2d9fff9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags for defragmentation. Use <a class="el" href="vk__mem__alloc_8h.html#a96df0eddab2e1735782fe4e7cd05ea7f" title="Flags to be used in vmaDefragmentationBegin(). ">VmaDefragmentationFlagBits</a> enum.  <a href="#a53e844ee5633e229cf6daf14b2d9fff9">More...</a><br /></td></tr>
+<tr class="separator:a53e844ee5633e229cf6daf14b2d9fff9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae41a36871f23fdd34df9c72149204c57"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">allocationCount</a></td></tr>
+<tr class="memdesc:ae41a36871f23fdd34df9c72149204c57"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of allocations in <code>pAllocations</code> array.  <a href="#ae41a36871f23fdd34df9c72149204c57">More...</a><br /></td></tr>
+<tr class="separator:ae41a36871f23fdd34df9c72149204c57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8943f8d65969ce8e2189a1cdf3205e96"><td class="memItemLeft" align="right" valign="top"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a></td></tr>
+<tr class="memdesc:a8943f8d65969ce8e2189a1cdf3205e96"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pointer to array of allocations that can be defragmented.  <a href="#a8943f8d65969ce8e2189a1cdf3205e96">More...</a><br /></td></tr>
+<tr class="separator:a8943f8d65969ce8e2189a1cdf3205e96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a76d51a644dc7f5405d0cdd0025ecd0cc"><td class="memItemLeft" align="right" valign="top">VkBool32 *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a></td></tr>
+<tr class="memdesc:a76d51a644dc7f5405d0cdd0025ecd0cc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Optional, output. Pointer to array that will be filled with information whether the allocation at certain index has been changed (moved or lost) during defragmentation.  <a href="#a76d51a644dc7f5405d0cdd0025ecd0cc">More...</a><br /></td></tr>
+<tr class="separator:a76d51a644dc7f5405d0cdd0025ecd0cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af78e1ea40c22d85137b65f6b384a4d0a"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a></td></tr>
+<tr class="memdesc:af78e1ea40c22d85137b65f6b384a4d0a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum total numbers of bytes that can be copied while moving allocations to different places using transfers on CPU side, like <code>memcpy()</code>, <code>memmove()</code>.  <a href="#af78e1ea40c22d85137b65f6b384a4d0a">More...</a><br /></td></tr>
+<tr class="separator:af78e1ea40c22d85137b65f6b384a4d0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94c2c7223d52878445a8cccce396b671"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a></td></tr>
+<tr class="memdesc:a94c2c7223d52878445a8cccce396b671"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of allocations that can be moved to a different place using transfers on CPU side, like <code>memcpy()</code>, <code>memmove()</code>.  <a href="#a94c2c7223d52878445a8cccce396b671">More...</a><br /></td></tr>
+<tr class="separator:a94c2c7223d52878445a8cccce396b671"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ddbc898d0afe1518f863a3763628f08"><td class="memItemLeft" align="right" valign="top">VkDeviceSize&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a></td></tr>
+<tr class="memdesc:a4ddbc898d0afe1518f863a3763628f08"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum total numbers of bytes that can be copied while moving allocations to different places using transfers on GPU side, posted to <code>commandBuffer</code>.  <a href="#a4ddbc898d0afe1518f863a3763628f08">More...</a><br /></td></tr>
+<tr class="separator:a4ddbc898d0afe1518f863a3763628f08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40d53d33e71ba0b66f844ed63c05a3f6"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a></td></tr>
+<tr class="memdesc:a40d53d33e71ba0b66f844ed63c05a3f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Maximum number of allocations that can be moved to a different place using transfers on GPU side, posted to <code>commandBuffer</code>.  <a href="#a40d53d33e71ba0b66f844ed63c05a3f6">More...</a><br /></td></tr>
+<tr class="separator:a40d53d33e71ba0b66f844ed63c05a3f6"><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 for defragmentation. </p>
+<p>To be used with function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a>. </p>
+</div><h2 class="groupheader">Member Data Documentation</h2>
+<a id="ae41a36871f23fdd34df9c72149204c57"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae41a36871f23fdd34df9c72149204c57">&#9670;&nbsp;</a></span>allocationCount</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">size_t VmaDefragmentationInfo2::allocationCount</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Number of allocations in <code>pAllocations</code> array. </p>
+
+</div>
+</div>
+<a id="a53e844ee5633e229cf6daf14b2d9fff9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53e844ee5633e229cf6daf14b2d9fff9">&#9670;&nbsp;</a></span>flags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> VmaDefragmentationInfo2::flags</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Flags for defragmentation. Use <a class="el" href="vk__mem__alloc_8h.html#a96df0eddab2e1735782fe4e7cd05ea7f" title="Flags to be used in vmaDefragmentationBegin(). ">VmaDefragmentationFlagBits</a> enum. </p>
+
+</div>
+</div>
+<a id="a94c2c7223d52878445a8cccce396b671"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94c2c7223d52878445a8cccce396b671">&#9670;&nbsp;</a></span>maxCpuAllocationsToMove</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint32_t VmaDefragmentationInfo2::maxCpuAllocationsToMove</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Maximum number of allocations that can be moved to a different place using transfers on CPU side, like <code>memcpy()</code>, <code>memmove()</code>. </p>
+<p><code>UINT32_MAX</code> means no limit. </p>
+
+</div>
+</div>
+<a id="af78e1ea40c22d85137b65f6b384a4d0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af78e1ea40c22d85137b65f6b384a4d0a">&#9670;&nbsp;</a></span>maxCpuBytesToMove</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkDeviceSize VmaDefragmentationInfo2::maxCpuBytesToMove</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Maximum total numbers of bytes that can be copied while moving allocations to different places using transfers on CPU side, like <code>memcpy()</code>, <code>memmove()</code>. </p>
+<p><code>VK_WHOLE_SIZE</code> means no limit. </p>
+
+</div>
+</div>
+<a id="a40d53d33e71ba0b66f844ed63c05a3f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a40d53d33e71ba0b66f844ed63c05a3f6">&#9670;&nbsp;</a></span>maxGpuAllocationsToMove</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint32_t VmaDefragmentationInfo2::maxGpuAllocationsToMove</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Maximum number of allocations that can be moved to a different place using transfers on GPU side, posted to <code>commandBuffer</code>. </p>
+<p><code>UINT32_MAX</code> means no limit. </p>
+
+</div>
+</div>
+<a id="a4ddbc898d0afe1518f863a3763628f08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ddbc898d0afe1518f863a3763628f08">&#9670;&nbsp;</a></span>maxGpuBytesToMove</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkDeviceSize VmaDefragmentationInfo2::maxGpuBytesToMove</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Maximum total numbers of bytes that can be copied while moving allocations to different places using transfers on GPU side, posted to <code>commandBuffer</code>. </p>
+<p><code>VK_WHOLE_SIZE</code> means no limit. </p>
+
+</div>
+</div>
+<a id="a8943f8d65969ce8e2189a1cdf3205e96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8943f8d65969ce8e2189a1cdf3205e96">&#9670;&nbsp;</a></span>pAllocations</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname"><a class="el" href="struct_vma_allocation.html">VmaAllocation</a>* VmaDefragmentationInfo2::pAllocations</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Pointer to array of allocations that can be defragmented. </p>
+<p>The array should have <code>allocationCount</code> elements. All other allocations are considered non-moveable during this defragmentation. </p>
+
+</div>
+</div>
+<a id="a76d51a644dc7f5405d0cdd0025ecd0cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a76d51a644dc7f5405d0cdd0025ecd0cc">&#9670;&nbsp;</a></span>pAllocationsChanged</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkBool32* VmaDefragmentationInfo2::pAllocationsChanged</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Optional, output. Pointer to array that will be filled with information whether the allocation at certain index has been changed (moved or lost) during defragmentation. </p>
+<p>The array should have <code>allocationCount</code> elements. You can pass null if you are not interested in this information. </p>
+
+</div>
+</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.14
+</small></address>
+</body>
+</html>
diff --git a/docs/html/struct_vma_defragmentation_stats-members.html b/docs/html/struct_vma_defragmentation_stats-members.html
index 4afb75c..d979c50 100644
--- a/docs/html/struct_vma_defragmentation_stats-members.html
+++ b/docs/html/struct_vma_defragmentation_stats-members.html
@@ -68,10 +68,11 @@
 
 <p>This is the complete list of members for <a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>, including all inherited members.</p>
 <table class="directory">
-  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
-  <tr><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03">allocationsLost</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
+  <tr><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a></td><td class="entry"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a></td><td class="entry"></td></tr>
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/docs/html/struct_vma_defragmentation_stats.html b/docs/html/struct_vma_defragmentation_stats.html
index dbbcebb..b6374b5 100644
--- a/docs/html/struct_vma_defragmentation_stats.html
+++ b/docs/html/struct_vma_defragmentation_stats.html
@@ -69,7 +69,7 @@
 </div><!--header-->
 <div class="contents">
 
-<p>Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>.  
+<p>Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>.  
  <a href="struct_vma_defragmentation_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>
@@ -88,10 +88,29 @@
 <tr class="memitem:a0113f1877904a5d1ee8f409216ff276b"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a></td></tr>
 <tr class="memdesc:a0113f1877904a5d1ee8f409216ff276b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of empty <code>VkDeviceMemory</code> objects that have been released to the system.  <a href="#a0113f1877904a5d1ee8f409216ff276b">More...</a><br /></td></tr>
 <tr class="separator:a0113f1877904a5d1ee8f409216ff276b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87f0adc9588757b1e3ac1815597ace03"><td class="memItemLeft" align="right" valign="top">uint32_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03">allocationsLost</a></td></tr>
+<tr class="memdesc:a87f0adc9588757b1e3ac1815597ace03"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of allocations that became lost in the process of defragmentation.  <a href="#a87f0adc9588757b1e3ac1815597ace03">More...</a><br /></td></tr>
+<tr class="separator:a87f0adc9588757b1e3ac1815597ace03"><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>Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>. </p>
+<div class="textblock"><p>Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>. </p>
 </div><h2 class="groupheader">Member Data Documentation</h2>
+<a id="a87f0adc9588757b1e3ac1815597ace03"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a87f0adc9588757b1e3ac1815597ace03">&#9670;&nbsp;</a></span>allocationsLost</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">uint32_t VmaDefragmentationStats::allocationsLost</td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Number of allocations that became lost in the process of defragmentation. </p>
+
+</div>
+</div>
 <a id="aefeabf130022008eadd75999478af3f9"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aefeabf130022008eadd75999478af3f9">&#9670;&nbsp;</a></span>allocationsMoved</h2>
 
diff --git a/docs/html/vk__mem__alloc_8h.html b/docs/html/vk__mem__alloc_8h.html
index 4a1946b..c801a1a 100644
--- a/docs/html/vk__mem__alloc_8h.html
+++ b/docs/html/vk__mem__alloc_8h.html
@@ -106,11 +106,14 @@
 <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 <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_info2.html">VmaDefragmentationInfo2</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters for defragmentation.  <a href="struct_vma_defragmentation_info2.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>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>.  <a href="struct_vma_defragmentation_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_stats.html">VmaDefragmentationStats</a></td></tr>
-<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>.  <a href="struct_vma_defragmentation_stats.html#details">More...</a><br /></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>.  <a href="struct_vma_defragmentation_stats.html#details">More...</a><br /></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
@@ -183,11 +186,19 @@
 <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 <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:a96df0eddab2e1735782fe4e7cd05ea7f"><td class="memItemLeft" align="right" valign="top">typedef enum <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a96df0eddab2e1735782fe4e7cd05ea7f">VmaDefragmentationFlagBits</a></td></tr>
+<tr class="memdesc:a96df0eddab2e1735782fe4e7cd05ea7f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be used in <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a>.  <a href="#a96df0eddab2e1735782fe4e7cd05ea7f">More...</a><br /></td></tr>
+<tr class="separator:a96df0eddab2e1735782fe4e7cd05ea7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a88a77cef37e5d3c4fc9eb328885d048d"><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#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a></td></tr>
+<tr class="separator:a88a77cef37e5d3c4fc9eb328885d048d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abac0e85abaa6ea1ffd63bde29c5c3a29"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29">VmaDefragmentationInfo2</a></td></tr>
+<tr class="memdesc:abac0e85abaa6ea1ffd63bde29c5c3a29"><td class="mdescLeft">&#160;</td><td class="mdescRight">Parameters for defragmentation.  <a href="#abac0e85abaa6ea1ffd63bde29c5c3a29">More...</a><br /></td></tr>
+<tr class="separator:abac0e85abaa6ea1ffd63bde29c5c3a29"><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>
+<tr class="memdesc:ae67f8573a0cf20f16f0a1eecbca566a0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>.  <a href="#ae67f8573a0cf20f16f0a1eecbca566a0">More...</a><br /></td></tr>
 <tr class="separator:ae67f8573a0cf20f16f0a1eecbca566a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ab0f9b06441c840fee560de4a2967f8c9"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a></td></tr>
-<tr class="memdesc:ab0f9b06441c840fee560de4a2967f8c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>.  <a href="#ab0f9b06441c840fee560de4a2967f8c9">More...</a><br /></td></tr>
+<tr class="memdesc:ab0f9b06441c840fee560de4a2967f8c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>.  <a href="#ab0f9b06441c840fee560de4a2967f8c9">More...</a><br /></td></tr>
 <tr class="separator:ab0f9b06441c840fee560de4a2967f8c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
@@ -248,6 +259,17 @@
  }</td></tr>
 <tr class="memdesc:a9a7c45f9c863695d98c83fa5ac940fe7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be passed as <a class="el" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446" title="Use combination of VmaPoolCreateFlagBits. ">VmaPoolCreateInfo::flags</a>.  <a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">More...</a><br /></td></tr>
 <tr class="separator:a9a7c45f9c863695d98c83fa5ac940fe7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6552a65b71d16f378c6994b3ceaef50c"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> { <br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071">VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT</a> = 0x00000001, 
+<a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f">VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT</a> = 0x000010000, 
+<a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46">VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT</a> = 0x00002000, 
+<a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d">VMA_DEFRAGMENTATION_ALGORITHM_MASK</a>, 
+<br />
+&#160;&#160;<a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF
+<br />
+ }</td></tr>
+<tr class="memdesc:a6552a65b71d16f378c6994b3ceaef50c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flags to be used in <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a>.  <a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">More...</a><br /></td></tr>
+<tr class="separator:a6552a65b71d16f378c6994b3ceaef50c"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table><table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
 Functions</h2></td></tr>
@@ -340,8 +362,14 @@
 <tr class="memitem:a49329a7f030dafcf82f7b73334c22e98"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</td></tr>
 <tr class="memdesc:a49329a7f030dafcf82f7b73334c22e98"><td class="mdescLeft">&#160;</td><td class="mdescRight">Checks magic number in margins around all allocations in given memory types (in both default and custom pools) in search for corruptions.  <a href="#a49329a7f030dafcf82f7b73334c22e98">More...</a><br /></td></tr>
 <tr class="separator:a49329a7f030dafcf82f7b73334c22e98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, const <a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> *pInfo, <a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> *pStats, <a class="el" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext)</td></tr>
+<tr class="memdesc:a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Begins defragmentation process.  <a href="#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">More...</a><br /></td></tr>
+<tr class="separator:a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8774e20e91e245aae959ba63efa15dd2"><td class="memItemLeft" align="right" valign="top">VkResult&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a> (<a class="el" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="el" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</td></tr>
+<tr class="memdesc:a8774e20e91e245aae959ba63efa15dd2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Ends defragmentation process.  <a href="#a8774e20e91e245aae959ba63efa15dd2">More...</a><br /></td></tr>
+<tr class="separator:a8774e20e91e245aae959ba63efa15dd2"><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> (<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="memdesc:a6aced90fcc7b39882b6654a740a0b9bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated. 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: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>
@@ -557,6 +585,36 @@
 
 </div>
 </div>
+<a id="a96df0eddab2e1735782fe4e7cd05ea7f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96df0eddab2e1735782fe4e7cd05ea7f">&#9670;&nbsp;</a></span>VmaDefragmentationFlagBits</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef enum <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>  <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Flags to be used in <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a>. </p>
+
+</div>
+</div>
+<a id="a88a77cef37e5d3c4fc9eb328885d048d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a88a77cef37e5d3c4fc9eb328885d048d">&#9670;&nbsp;</a></span>VmaDefragmentationFlags</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef VkFlags <a class="el" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+</div>
+</div>
 <a id="ae67f8573a0cf20f16f0a1eecbca566a0"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#ae67f8573a0cf20f16f0a1eecbca566a0">&#9670;&nbsp;</a></span>VmaDefragmentationInfo</h2>
 
@@ -569,7 +627,25 @@
       </table>
 </div><div class="memdoc">
 
-<p>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>. </p>
+<p>Deprecated. Optional configuration parameters to be passed to function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>. </p>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000001">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation. ">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a> instead. </dd></dl>
+
+</div>
+</div>
+<a id="abac0e85abaa6ea1ffd63bde29c5c3a29"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abac0e85abaa6ea1ffd63bde29c5c3a29">&#9670;&nbsp;</a></span>VmaDefragmentationInfo2</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">typedef struct <a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>  <a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Parameters for defragmentation. </p>
+<p>To be used with function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a>. </p>
 
 </div>
 </div>
@@ -585,7 +661,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Compacts memory by moving allocations. ">vmaDefragment()</a>. </p>
+<p>Statistics returned by function <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>. </p>
 
 </div>
 </div>
@@ -875,6 +951,33 @@
 
 </div>
 </div>
+<a id="a6552a65b71d16f378c6994b3ceaef50c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6552a65b71d16f378c6994b3ceaef50c">&#9670;&nbsp;</a></span>VmaDefragmentationFlagBits</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">enum <a class="el" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Flags to be used in <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a>. </p>
+<table class="fieldtable">
+<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071"></a>VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT&#160;</td><td class="fielddoc"><p>Add this flag to enable allocations created with <a class="el" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2">VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT</a> flag to become lost during defragmentation process if the algorithm decides it is beneficial. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f"></a>VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT&#160;</td><td class="fielddoc"><p>Add this flag to change defragmentation algorithm to fast rather than default (balanced). This algorithm will favor speed over quality of defragmentation. Defragmentation will be done as fast and move as little allocations and bytes as possible while still providing some benefits. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46"></a>VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT&#160;</td><td class="fielddoc"><p>Add this flag to change defragmentation algorithm to optimal rather than default (balanced). This algorithm will favor quality of defragmentation over speed. Allocations will be as perfectly compacted as possible. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d"></a>VMA_DEFRAGMENTATION_ALGORITHM_MASK&#160;</td><td class="fielddoc"><p>A bit mask to extract only <code>ALGORITHM</code> bits from entire set of flags. </p>
+</td></tr>
+<tr><td class="fieldname"><a id="a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"></a>VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM&#160;</td><td class="fielddoc"></td></tr>
+</table>
+
+</div>
+</div>
 <a id="aa5846affa1e9da3800e3e78fae2305cc"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aa5846affa1e9da3800e3e78fae2305cc">&#9670;&nbsp;</a></span>VmaMemoryUsage</h2>
 
@@ -1643,7 +1746,7 @@
       </table>
 </div><div class="memdoc">
 
-<p>Compacts memory by moving allocations. </p>
+<p>Deprecated. Compacts memory by moving allocations. </p>
 <dl class="params"><dt>Parameters</dt><dd>
   <table class="params">
     <tr><td class="paramdir"></td><td class="paramname">pAllocations</td><td>Array of allocations that can be moved during this compation. </td></tr>
@@ -1655,6 +1758,7 @@
   </dd>
 </dl>
 <dl class="section return"><dt>Returns</dt><dd><code>VK_SUCCESS</code> if completed, <code>VK_INCOMPLETE</code> if succeeded but didn't make all possible optimizations because limits specified in <code>pDefragmentationInfo</code> have been reached, negative error code in case of error.</dd></dl>
+<dl class="deprecated"><dt><b><a class="el" href="deprecated.html#_deprecated000002">Deprecated:</a></b></dt><dd>This is a part of the old interface. It is recommended to use structure <a class="el" href="struct_vma_defragmentation_info2.html" title="Parameters for defragmentation. ">VmaDefragmentationInfo2</a> and function <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a> instead.</dd></dl>
 <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 <code>pAllocations</code> 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> and <code>VK_MEMORY_PROPERTY_HOST_COHERENT_BIT</code> flags can be compacted. You may pass other allocations but it makes no sense - these will never be moved.</li>
@@ -1669,6 +1773,97 @@
 
 </div>
 </div>
+<a id="a36ba776fd7fd5cb1e9359fdc0d8e6e8a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">&#9670;&nbsp;</a></span>vmaDefragmentationBegin()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkResult vmaDefragmentationBegin </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">const <a class="el" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> *&#160;</td>
+          <td class="paramname"><em>pInfo</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a> *&#160;</td>
+          <td class="paramname"><em>pStats</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *&#160;</td>
+          <td class="paramname"><em>pContext</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Begins defragmentation process. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">allocator</td><td>Allocator object. </td></tr>
+    <tr><td class="paramname">pInfo</td><td>Structure filled with parameters of defragmentation. </td></tr>
+    <tr><td class="paramname">pStats[out]</td><td>Optional. Statistics of defragmentation. You can pass null if you are not interested in this information. </td></tr>
+    <tr><td class="paramname">pContext[out]</td><td>Context object that must be passed to <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process. ">vmaDefragmentationEnd()</a> to finish defragmentation. </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><code>VK_SUCCESS</code> and <code>*pContext == null</code> if defragmentation finished within this function call. <code>VK_NOT_READY</code> and <code>*pContext != null</code> if defragmentation has been started and you need to call <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process. ">vmaDefragmentationEnd()</a> to finish it. Negative value in case of error.</dd></dl>
+<p>Use this function instead of old, deprecated <a class="el" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb" title="Deprecated. Compacts memory by moving allocations. ">vmaDefragment()</a>.</p>
+<p>It is important to note that between the call to <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a> and <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process. ">vmaDefragmentationEnd()</a>:</p>
+<ul>
+<li>You should not use any of allocations passed as <code>pInfo-&gt;pAllocations</code>, including calling <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 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>, or accessing their data.</li>
+<li>Some mutexes protecting internal data structures may be locked, so trying to make or free any allocations, bind buffers or images, or map memory in between may cause stall (when done on another thread) or deadlock (when done on the same thread), unless you are 100% sure that separate memory pools are involved.</li>
+<li>Information returned via <code>pStats</code> and <code>pInfo-&gt;pAllocationsChanged</code> are undefined. They become valid after call to <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process. ">vmaDefragmentationEnd()</a>.</li>
+<li>If <code>pInfo-&gt;commandBuffer != VK_NULL_HANDLE</code>, you must submit that command buffer and make sure it finished execution before calling <a class="el" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2" title="Ends defragmentation process. ">vmaDefragmentationEnd()</a>. </li>
+</ul>
+
+</div>
+</div>
+<a id="a8774e20e91e245aae959ba63efa15dd2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8774e20e91e245aae959ba63efa15dd2">&#9670;&nbsp;</a></span>vmaDefragmentationEnd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">VkResult vmaDefragmentationEnd </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_defragmentation_context.html">VmaDefragmentationContext</a>&#160;</td>
+          <td class="paramname"><em>context</em>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+</div><div class="memdoc">
+
+<p>Ends defragmentation process. </p>
+<p>Use this function to finish defragmentation started by <a class="el" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a" title="Begins defragmentation process. ">vmaDefragmentationBegin()</a>. It is safe to pass <code>context == null</code>. The function then does nothing. </p>
+
+</div>
+</div>
 <a id="aa8d164061c88f22fb1fd3c8f3534bc1d"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#aa8d164061c88f22fb1fd3c8f3534bc1d">&#9670;&nbsp;</a></span>vmaDestroyAllocator()</h2>
 
diff --git a/docs/html/vk__mem__alloc_8h_source.html b/docs/html/vk__mem__alloc_8h_source.html
index 96303b9..67e7a8a 100644
--- a/docs/html/vk__mem__alloc_8h_source.html
+++ b/docs/html/vk__mem__alloc_8h_source.html
@@ -65,189 +65,209 @@
 <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="l01479"></a><span class="lineno"> 1479</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;<span class="comment">Define this macro to 0/1 to disable/enable support for recording functionality,</span></div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;<span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;<span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;<span class="preprocessor">    #ifdef _WIN32</span></div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;<span class="preprocessor">        #define VMA_RECORDING_ENABLED 1</span></div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01487"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 1487</a></span>&#160;<span class="preprocessor">        #define VMA_RECORDING_ENABLED 0</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;<span class="preprocessor">#ifndef NOMINMAX</span></div><div class="line"><a name="l01492"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90"> 1492</a></span>&#160;<span class="preprocessor">    #define NOMINMAX // For windows.h</span></div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;<span class="preprocessor">#include &lt;vulkan/vulkan.h&gt;</span></div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;<span class="preprocessor">    #include &lt;windows.h&gt;</span></div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;<span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;<span class="preprocessor">    #if VK_KHR_get_memory_requirements2 &amp;&amp; VK_KHR_dedicated_allocation</span></div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 1</span></div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01505"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 1505</a></span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 0</span></div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</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="l01522"></a><span class="lineno"> 1522</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01527"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49"> 1527</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="l01528"></a><span class="lineno"> 1528</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;</div><div class="line"><a name="l01540"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 1540</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="l01542"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 1542</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="l01544"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 1544</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="l01545"></a><span class="lineno"> 1545</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;</div><div class="line"><a name="l01548"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 1548</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="l01553"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 1553</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="l01575"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 1575</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="l01576"></a><span class="lineno"> 1576</span>&#160;</div><div class="line"><a name="l01577"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 1577</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="l01578"></a><span class="lineno"> 1578</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div><div class="line"><a name="l01579"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 1579</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="l01580"></a><span class="lineno"> 1580</span>&#160;</div><div class="line"><a name="l01585"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 1585</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="l01586"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 1586</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div><div class="line"><a name="l01587"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 1587</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div><div class="line"><a name="l01588"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 1588</a></span>&#160;    PFN_vkAllocateMemory <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div><div class="line"><a name="l01589"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 1589</a></span>&#160;    PFN_vkFreeMemory <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div><div class="line"><a name="l01590"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 1590</a></span>&#160;    PFN_vkMapMemory <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div><div class="line"><a name="l01591"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 1591</a></span>&#160;    PFN_vkUnmapMemory <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div><div class="line"><a name="l01592"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 1592</a></span>&#160;    PFN_vkFlushMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div><div class="line"><a name="l01593"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 1593</a></span>&#160;    PFN_vkInvalidateMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div><div class="line"><a name="l01594"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 1594</a></span>&#160;    PFN_vkBindBufferMemory <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div><div class="line"><a name="l01595"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 1595</a></span>&#160;    PFN_vkBindImageMemory <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div><div class="line"><a name="l01596"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 1596</a></span>&#160;    PFN_vkGetBufferMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div><div class="line"><a name="l01597"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 1597</a></span>&#160;    PFN_vkGetImageMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div><div class="line"><a name="l01598"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 1598</a></span>&#160;    PFN_vkCreateBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div><div class="line"><a name="l01599"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 1599</a></span>&#160;    PFN_vkDestroyBuffer <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div><div class="line"><a name="l01600"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 1600</a></span>&#160;    PFN_vkCreateImage <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div><div class="line"><a name="l01601"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 1601</a></span>&#160;    PFN_vkDestroyImage <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div><div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;    PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a>;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;</div><div class="line"><a name="l01609"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 1609</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> {</div><div class="line"><a name="l01615"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 1615</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001,</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;    </div><div class="line"><a name="l01617"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"> 1617</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div><div class="line"><a name="l01619"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 1619</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>;</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;</div><div class="line"><a name="l01622"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 1622</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a></div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;{</div><div class="line"><a name="l01625"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 1625</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> <a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div><div class="line"><a name="l01633"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 1633</a></span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>;</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a>;</div><div class="line"><a name="l01635"></a><span class="lineno"> 1635</span>&#160;</div><div class="line"><a name="l01637"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 1637</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="l01638"></a><span class="lineno"> 1638</span>&#160;{</div><div class="line"><a name="l01640"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 1640</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a> <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;</div><div class="line"><a name="l01643"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 1643</a></span>&#160;    VkPhysicalDevice <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;</div><div class="line"><a name="l01646"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 1646</a></span>&#160;    VkDevice <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;</div><div class="line"><a name="l01649"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 1649</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;</div><div class="line"><a name="l01652"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 1652</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="l01654"></a><span class="lineno"> 1654</span>&#160;</div><div class="line"><a name="l01655"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 1655</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="l01669"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 1669</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div><div class="line"><a name="l01693"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 1693</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="l01705"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 1705</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="l01712"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 1712</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>* <a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>;</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a>;</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;</div><div class="line"><a name="l01716"></a><span class="lineno"> 1716</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</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="l01718"></a><span class="lineno"> 1718</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator);</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</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="l01722"></a><span class="lineno"> 1722</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</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="l01729"></a><span class="lineno"> 1729</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties** ppPhysicalDeviceProperties);</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</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="l01737"></a><span class="lineno"> 1737</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</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="l01747"></a><span class="lineno"> 1747</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;    VkMemoryPropertyFlags* pFlags);</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</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="l01760"></a><span class="lineno"> 1760</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;    uint32_t frameIndex);</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</span>&#160;</div><div class="line"><a name="l01765"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 1765</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="l01766"></a><span class="lineno"> 1766</span>&#160;{</div><div class="line"><a name="l01768"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 1768</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l01770"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 1770</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l01772"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 1772</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l01774"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 1774</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l01776"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 1776</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l01777"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 1777</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, <a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>, <a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>;</div><div class="line"><a name="l01778"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 1778</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, <a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>, <a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>;</div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a>;</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;</div><div class="line"><a name="l01782"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 1782</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="l01783"></a><span class="lineno"> 1783</span>&#160;{</div><div class="line"><a name="l01784"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 1784</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l01785"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 1785</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l01786"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 1786</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="l01787"></a><span class="lineno"> 1787</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a>;</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</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="l01791"></a><span class="lineno"> 1791</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;</div><div class="line"><a name="l01794"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 1794</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</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="l01802"></a><span class="lineno"> 1802</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;    VkBool32 detailedMap);</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</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#a3104eb30d8122c84dd8541063f145288">vmaFreeStatsString</a>(</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;    <span class="keywordtype">char</span>* pStatsString);</div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01811"></a><span class="lineno"> 1811</span>&#160;</div><div class="line"><a name="l01820"></a><span class="lineno"> 1820</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</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"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 1822</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</span>&#160;{</div><div class="line"><a name="l01827"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 1827</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="l01844"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 1844</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="l01854"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 1854</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="l01861"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 1861</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="l01870"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 1870</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="l01871"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 1871</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="l01872"></a><span class="lineno"> 1872</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;</div><div class="line"><a name="l01875"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 1875</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="l01887"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 1887</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="l01888"></a><span class="lineno"> 1888</span>&#160;</div><div class="line"><a name="l01898"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 1898</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="l01911"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 1911</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="l01924"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 1924</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="l01931"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 1931</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="l01937"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 1937</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="l01942"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"> 1942</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040,</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;</div><div class="line"><a name="l01947"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"> 1947</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>  = 0x00010000,</div><div class="line"><a name="l01951"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"> 1951</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000,</div><div class="line"><a name="l01958"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"> 1958</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000,</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;</div><div class="line"><a name="l01962"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"> 1962</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>,</div><div class="line"><a name="l01965"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"> 1965</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div><div class="line"><a name="l01968"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"> 1968</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>,</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;</div><div class="line"><a name="l01972"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"> 1972</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a> =</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> |</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> |</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;</div><div class="line"><a name="l01977"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 1977</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="l01978"></a><span class="lineno"> 1978</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div><div class="line"><a name="l01979"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 1979</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="l01980"></a><span class="lineno"> 1980</span>&#160;</div><div class="line"><a name="l01981"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 1981</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="l01982"></a><span class="lineno"> 1982</span>&#160;{</div><div class="line"><a name="l01984"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 1984</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div><div class="line"><a name="l01990"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 1990</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="l01995"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 1995</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l02000"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 2000</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l02008"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 2008</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l02014"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 2014</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="l02021"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 2021</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="l02022"></a><span class="lineno"> 2022</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a>;</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</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="l02044"></a><span class="lineno"> 2044</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</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="l02062"></a><span class="lineno"> 2062</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02063"></a><span class="lineno"> 2063</span>&#160;</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</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="l02080"></a><span class="lineno"> 2080</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;</div><div class="line"><a name="l02083"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 2083</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="l02101"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 2101</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="l02102"></a><span class="lineno"> 2102</span>&#160;</div><div class="line"><a name="l02118"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"> 2118</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004,</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;</div><div class="line"><a name="l02129"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"> 2129</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008,</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;</div><div class="line"><a name="l02133"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"> 2133</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a> =</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> |</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>,</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"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 2137</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="l02138"></a><span class="lineno"> 2138</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div><div class="line"><a name="l02139"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 2139</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="l02140"></a><span class="lineno"> 2140</span>&#160;</div><div class="line"><a name="l02143"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 2143</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="l02146"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 2146</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div><div class="line"><a name="l02149"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 2149</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a> <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div><div class="line"><a name="l02158"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 2158</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div><div class="line"><a name="l02163"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 2163</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="l02171"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 2171</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="l02185"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 2185</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a>;</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;</div><div class="line"><a name="l02190"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 2190</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="l02193"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 2193</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div><div class="line"><a name="l02196"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 2196</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div><div class="line"><a name="l02199"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 2199</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="l02202"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 2202</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="l02209"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 2209</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div><div class="line"><a name="l02212"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7"> 2212</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a>;</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a>;</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</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="l02224"></a><span class="lineno"> 2224</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l02225"></a><span class="lineno"> 2225</span>&#160;</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</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="l02229"></a><span class="lineno"> 2229</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</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="l02239"></a><span class="lineno"> 2239</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</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="l02250"></a><span class="lineno"> 2250</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160;</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;</div><div class="line"><a name="l02298"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 2298</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div><div class="line"><a name="l02303"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 2303</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div><div class="line"><a name="l02312"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 2312</a></span>&#160;    VkDeviceMemory <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line"><a name="l02317"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 2317</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line"><a name="l02322"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 2322</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line"><a name="l02331"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 2331</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="l02336"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 2336</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="l02337"></a><span class="lineno"> 2337</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a>;</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</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="l02353"></a><span class="lineno"> 2353</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</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="l02366"></a><span class="lineno"> 2366</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;    VkImage image,</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</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="l02374"></a><span class="lineno"> 2374</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</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="l02379"></a><span class="lineno"> 2379</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;</div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>(</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;    VkDeviceSize newSize);</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;</div><div class="line"><a name="l02423"></a><span class="lineno"> 2423</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="l02424"></a><span class="lineno"> 2424</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02425"></a><span class="lineno"> 2425</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02426"></a><span class="lineno"> 2426</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</span>&#160;</div><div class="line"><a name="l02442"></a><span class="lineno"> 2442</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l02443"></a><span class="lineno"> 2443</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02444"></a><span class="lineno"> 2444</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02445"></a><span class="lineno"> 2445</span>&#160;</div><div class="line"><a name="l02459"></a><span class="lineno"> 2459</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="l02460"></a><span class="lineno"> 2460</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02461"></a><span class="lineno"> 2461</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02462"></a><span class="lineno"> 2462</span>&#160;    <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l02463"></a><span class="lineno"> 2463</span>&#160;</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</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="l02475"></a><span class="lineno"> 2475</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;</div><div class="line"><a name="l02512"></a><span class="lineno"> 2512</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l02513"></a><span class="lineno"> 2513</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02514"></a><span class="lineno"> 2514</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02515"></a><span class="lineno"> 2515</span>&#160;    <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l02516"></a><span class="lineno"> 2516</span>&#160;</div><div class="line"><a name="l02521"></a><span class="lineno"> 2521</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="l02522"></a><span class="lineno"> 2522</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02524"></a><span class="lineno"> 2524</span>&#160;</div><div class="line"><a name="l02537"></a><span class="lineno"> 2537</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;</div><div class="line"><a name="l02551"></a><span class="lineno"> 2551</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l02552"></a><span class="lineno"> 2552</span>&#160;</div><div class="line"><a name="l02569"></a><span class="lineno"> 2569</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits);</div><div class="line"><a name="l02570"></a><span class="lineno"> 2570</span>&#160;</div><div class="line"><a name="l02572"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 2572</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="l02577"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 2577</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l02582"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 2582</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l02583"></a><span class="lineno"> 2583</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>;</div><div class="line"><a name="l02584"></a><span class="lineno"> 2584</span>&#160;</div><div class="line"><a name="l02586"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 2586</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="l02588"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 2588</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l02590"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 2590</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div><div class="line"><a name="l02592"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 2592</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l02594"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 2594</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l02595"></a><span class="lineno"> 2595</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a>;</div><div class="line"><a name="l02596"></a><span class="lineno"> 2596</span>&#160;</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l02636"></a><span class="lineno"> 2636</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02637"></a><span class="lineno"> 2637</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l02638"></a><span class="lineno"> 2638</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l02639"></a><span class="lineno"> 2639</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l02640"></a><span class="lineno"> 2640</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="l02641"></a><span class="lineno"> 2641</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l02642"></a><span class="lineno"> 2642</span>&#160;</div><div class="line"><a name="l02655"></a><span class="lineno"> 2655</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l02656"></a><span class="lineno"> 2656</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02657"></a><span class="lineno"> 2657</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02658"></a><span class="lineno"> 2658</span>&#160;    VkBuffer buffer);</div><div class="line"><a name="l02659"></a><span class="lineno"> 2659</span>&#160;</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>&#160;    VkImage image);</div><div class="line"><a name="l02676"></a><span class="lineno"> 2676</span>&#160;</div><div class="line"><a name="l02703"></a><span class="lineno"> 2703</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l02704"></a><span class="lineno"> 2704</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02705"></a><span class="lineno"> 2705</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l02706"></a><span class="lineno"> 2706</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="l02707"></a><span class="lineno"> 2707</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l02708"></a><span class="lineno"> 2708</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02709"></a><span class="lineno"> 2709</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02710"></a><span class="lineno"> 2710</span>&#160;</div><div class="line"><a name="l02722"></a><span class="lineno"> 2722</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="l02723"></a><span class="lineno"> 2723</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02724"></a><span class="lineno"> 2724</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02725"></a><span class="lineno"> 2725</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02726"></a><span class="lineno"> 2726</span>&#160;</div><div class="line"><a name="l02728"></a><span class="lineno"> 2728</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l02729"></a><span class="lineno"> 2729</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02730"></a><span class="lineno"> 2730</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l02731"></a><span class="lineno"> 2731</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="l02732"></a><span class="lineno"> 2732</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l02733"></a><span class="lineno"> 2733</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02734"></a><span class="lineno"> 2734</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02735"></a><span class="lineno"> 2735</span>&#160;</div><div class="line"><a name="l02747"></a><span class="lineno"> 2747</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="l02748"></a><span class="lineno"> 2748</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02749"></a><span class="lineno"> 2749</span>&#160;    VkImage image,</div><div class="line"><a name="l02750"></a><span class="lineno"> 2750</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</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;<span class="preprocessor">#ifdef __cplusplus</span></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;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;<span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>&#160;</div><div class="line"><a name="l02758"></a><span class="lineno"> 2758</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div><div class="line"><a name="l02759"></a><span class="lineno"> 2759</span>&#160;<span class="preprocessor">#if defined(__cplusplus) &amp;&amp; defined(__INTELLISENSE__)</span></div><div class="line"><a name="l02760"></a><span class="lineno"> 2760</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02761"></a><span class="lineno"> 2761</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02764"></a><span class="lineno"> 2764</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></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;<span class="preprocessor">#include &lt;cstdint&gt;</span></div><div class="line"><a name="l02767"></a><span class="lineno"> 2767</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02768"></a><span class="lineno"> 2768</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</span></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">/*******************************************************************************</span></div><div class="line"><a name="l02771"></a><span class="lineno"> 2771</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div><div class="line"><a name="l02772"></a><span class="lineno"> 2772</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02773"></a><span class="lineno"> 2773</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="l02774"></a><span class="lineno"> 2774</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div><div class="line"><a name="l02775"></a><span class="lineno"> 2775</span>&#160;<span class="comment">*/</span></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="comment">/*</span></div><div class="line"><a name="l02778"></a><span class="lineno"> 2778</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="l02779"></a><span class="lineno"> 2779</span>&#160;<span class="comment">internally, like:</span></div><div class="line"><a name="l02780"></a><span class="lineno"> 2780</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02781"></a><span class="lineno"> 2781</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div><div class="line"><a name="l02782"></a><span class="lineno"> 2782</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02783"></a><span class="lineno"> 2783</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="l02784"></a><span class="lineno"> 2784</span>&#160;<span class="comment">VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</span>&#160;<span class="preprocessor">#define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l02788"></a><span class="lineno"> 2788</span>&#160;<span class="preprocessor">#endif</span></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;<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="l02791"></a><span class="lineno"> 2791</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></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;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div><div class="line"><a name="l02794"></a><span class="lineno"> 2794</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div><div class="line"><a name="l02795"></a><span class="lineno"> 2795</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02796"></a><span class="lineno"> 2796</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="l02797"></a><span class="lineno"> 2797</span>&#160;<span class="comment">the containers.</span></div><div class="line"><a name="l02798"></a><span class="lineno"> 2798</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02799"></a><span class="lineno"> 2799</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div><div class="line"><a name="l02800"></a><span class="lineno"> 2800</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div><div class="line"><a name="l02801"></a><span class="lineno"> 2801</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div><div class="line"><a name="l02802"></a><span class="lineno"> 2802</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02804"></a><span class="lineno"> 2804</span>&#160;</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">/*</span></div><div class="line"><a name="l02818"></a><span class="lineno"> 2818</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="l02819"></a><span class="lineno"> 2819</span>&#160;<span class="comment">remove them if not needed.</span></div><div class="line"><a name="l02820"></a><span class="lineno"> 2820</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02821"></a><span class="lineno"> 2821</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div><div class="line"><a name="l02822"></a><span class="lineno"> 2822</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div><div class="line"><a name="l02823"></a><span class="lineno"> 2823</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span> <span class="comment">// for std::mutex</span></div><div class="line"><a name="l02824"></a><span class="lineno"> 2824</span>&#160;<span class="preprocessor">#include &lt;atomic&gt;</span> <span class="comment">// for std::atomic</span></div><div class="line"><a name="l02825"></a><span class="lineno"> 2825</span>&#160;</div><div class="line"><a name="l02826"></a><span class="lineno"> 2826</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div><div class="line"><a name="l02827"></a><span class="lineno"> 2827</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="l02828"></a><span class="lineno"> 2828</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div><div class="line"><a name="l02829"></a><span class="lineno"> 2829</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;<span class="preprocessor">#if defined(__ANDROID_API__) &amp;&amp; (__ANDROID_API__ &lt; 16)</span></div><div class="line"><a name="l02832"></a><span class="lineno"> 2832</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02833"></a><span class="lineno"> 2833</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="l02834"></a><span class="lineno"> 2834</span>&#160;{</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l02836"></a><span class="lineno"> 2836</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="l02837"></a><span class="lineno"> 2837</span>&#160;    {</div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</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;</div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160;    <span class="keywordflow">return</span> memalign(alignment, size);</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="preprocessor">#elif defined(__APPLE__) || defined(__ANDROID__)</span></div><div class="line"><a name="l02844"></a><span class="lineno"> 2844</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</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="l02846"></a><span class="lineno"> 2846</span>&#160;{</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</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="l02849"></a><span class="lineno"> 2849</span>&#160;    {</div><div class="line"><a name="l02850"></a><span class="lineno"> 2850</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</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;</div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;    <span class="keywordtype">void</span> *pointer;</div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div><div class="line"><a name="l02855"></a><span class="lineno"> 2855</span>&#160;        <span class="keywordflow">return</span> pointer;</div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</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="preprocessor">#endif</span></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;<span class="comment">// If your compiler is not compatible with C++11 and definition of</span></div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160;<span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></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;<span class="comment">//#include &lt;malloc.h&gt;</span></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;<span class="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02870"></a><span class="lineno"> 2870</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div><div class="line"><a name="l02871"></a><span class="lineno"> 2871</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02872"></a><span class="lineno"> 2872</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">// Assert that will be called very often, like inside data structures e.g. operator[].</span></div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02878"></a><span class="lineno"> 2878</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;</div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;<span class="preprocessor">#ifndef VMA_ALIGN_OF</span></div><div class="line"><a name="l02885"></a><span class="lineno"> 2885</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div><div class="line"><a name="l02886"></a><span class="lineno"> 2886</span>&#160;<span class="preprocessor">#endif</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;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div><div class="line"><a name="l02897"></a><span class="lineno"> 2897</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02898"></a><span class="lineno"> 2898</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02900"></a><span class="lineno"> 2900</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_MIN</span></div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_MAX</span></div><div class="line"><a name="l02909"></a><span class="lineno"> 2909</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div><div class="line"><a name="l02918"></a><span class="lineno"> 2918</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_LOG</span></div><div class="line"><a name="l02921"></a><span class="lineno"> 2921</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div><div class="line"><a name="l02922"></a><span class="lineno"> 2922</span>&#160;   <span class="comment">/*</span></div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div><div class="line"><a name="l02926"></a><span class="lineno"> 2926</span>&#160;<span class="comment">   } while(false)</span></div><div class="line"><a name="l02927"></a><span class="lineno"> 2927</span>&#160;<span class="comment">   */</span></div><div class="line"><a name="l02928"></a><span class="lineno"> 2928</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</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="l02933"></a><span class="lineno"> 2933</span>&#160;    {</div><div class="line"><a name="l02934"></a><span class="lineno"> 2934</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="l02935"></a><span class="lineno"> 2935</span>&#160;    }</div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</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="l02937"></a><span class="lineno"> 2937</span>&#160;    {</div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</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="l02939"></a><span class="lineno"> 2939</span>&#160;    }</div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</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="l02941"></a><span class="lineno"> 2941</span>&#160;    {</div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</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;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;</div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;    <span class="keyword">class </span>VmaMutex</div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;    {</div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;        VmaMutex() { }</div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;        ~VmaMutex() { }</div><div class="line"><a name="l02952"></a><span class="lineno"> 2952</span>&#160;        <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div><div class="line"><a name="l02953"></a><span class="lineno"> 2953</span>&#160;        <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;        std::mutex m_Mutex;</div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;    };</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;<span class="preprocessor">    #define VMA_MUTEX VmaMutex</span></div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">/*</span></div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</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="l02962"></a><span class="lineno"> 2962</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;<span class="comment">- Constructor(uint32_t desired)</span></div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;<span class="comment">- uint32_t load() const</span></div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;<span class="comment">- void store(uint32_t desired)</span></div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;<span class="comment">- bool compare_exchange_weak(uint32_t&amp; expected, uint32_t desired)</span></div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160;<span class="preprocessor">   #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160;</div><div class="line"><a name="l02977"></a><span class="lineno"> 2977</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALIGNMENT (1)</span></div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div><div class="line"><a name="l02989"></a><span class="lineno"> 2989</span>&#160;</div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MARGIN (0)</span></div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;</div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>&#160;</div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div><div class="line"><a name="l03002"></a><span class="lineno"> 3002</span>&#160;<span class="preprocessor">#endif</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="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</span>&#160;</div><div class="line"><a name="l03010"></a><span class="lineno"> 3010</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160;<span class="preprocessor">#endif</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;<span class="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160;</div><div class="line"><a name="l03018"></a><span class="lineno"> 3018</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160;</div><div class="line"><a name="l03026"></a><span class="lineno"> 3026</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;<span class="preprocessor">#endif</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="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div><div class="line"><a name="l03030"></a><span class="lineno"> 3030</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160;</div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;</div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160;<span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;<span class="preprocessor">    #define VMA_CLASS_NO_COPY(className) \</span></div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;<span class="preprocessor">        private: \</span></div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;<span class="preprocessor">            className(const className&amp;) = delete; \</span></div><div class="line"><a name="l03043"></a><span class="lineno"> 3043</span>&#160;<span class="preprocessor">            className&amp; operator=(const className&amp;) = delete;</span></div><div class="line"><a name="l03044"></a><span class="lineno"> 3044</span>&#160;<span class="preprocessor">#endif</span></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;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;</div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;<span class="comment">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;</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">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED   = 0xDC;</div><div class="line"><a name="l03052"></a><span class="lineno"> 3052</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;</div><div class="line"><a name="l03053"></a><span class="lineno"> 3053</span>&#160;</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;<span class="comment">END OF CONFIGURATION</span></div><div class="line"><a name="l03056"></a><span class="lineno"> 3056</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03057"></a><span class="lineno"> 3057</span>&#160;</div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div><div class="line"><a name="l03059"></a><span class="lineno"> 3059</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</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="comment">// Returns number of bits set to 1 in (v).</span></div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</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;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div><div class="line"><a name="l03067"></a><span class="lineno"> 3067</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div><div class="line"><a name="l03068"></a><span class="lineno"> 3068</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div><div class="line"><a name="l03069"></a><span class="lineno"> 3069</span>&#160;    <span class="keywordflow">return</span> c;</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;}</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;<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="l03073"></a><span class="lineno"> 3073</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03075"></a><span class="lineno"> 3075</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</div><div class="line"><a name="l03076"></a><span class="lineno"> 3076</span>&#160;{</div><div class="line"><a name="l03077"></a><span class="lineno"> 3077</span>&#160;    <span class="keywordflow">return</span> (val + align - 1) / align * align;</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="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></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;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T align)</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;    <span class="keywordflow">return</span> val / align * align;</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="comment">// Division with mathematical rounding to nearest number.</span></div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03089"></a><span class="lineno"> 3089</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</div><div class="line"><a name="l03090"></a><span class="lineno"> 3090</span>&#160;{</div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div><div class="line"><a name="l03092"></a><span class="lineno"> 3092</span>&#160;}</div><div class="line"><a name="l03093"></a><span class="lineno"> 3093</span>&#160;</div><div class="line"><a name="l03094"></a><span class="lineno"> 3094</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;<span class="comment">Returns true if given number is a power of two.</span></div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>&#160;<span class="comment">T must be unsigned integer number or signed integer but always nonnegative.</span></div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160;<span class="comment">For 0 returns true.</span></div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03100"></a><span class="lineno"> 3100</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsPow2(T x)</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="keywordflow">return</span> (x &amp; (x-1)) == 0;</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;}</div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;</div><div class="line"><a name="l03105"></a><span class="lineno"> 3105</span>&#160;<span class="comment">// Returns smallest power of 2 greater or equal to v.</span></div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaNextPow2(uint32_t v)</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;    v--;</div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03114"></a><span class="lineno"> 3114</span>&#160;    v++;</div><div class="line"><a name="l03115"></a><span class="lineno"> 3115</span>&#160;    <span class="keywordflow">return</span> v;</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="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaNextPow2(uint64_t v)</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;    v--;</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03122"></a><span class="lineno"> 3122</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03123"></a><span class="lineno"> 3123</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;    v |= v &gt;&gt; 32;</div><div class="line"><a name="l03126"></a><span class="lineno"> 3126</span>&#160;    v++;</div><div class="line"><a name="l03127"></a><span class="lineno"> 3127</span>&#160;    <span class="keywordflow">return</span> v;</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;<span class="comment">// Returns largest power of 2 less or equal to v.</span></div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaPrevPow2(uint32_t v)</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;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>&#160;    v = v ^ (v &gt;&gt; 1);</div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;    <span class="keywordflow">return</span> v;</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="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaPrevPow2(uint64_t v)</div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>&#160;{</div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03145"></a><span class="lineno"> 3145</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03146"></a><span class="lineno"> 3146</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;    v |= v &gt;&gt; 32;</div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;    v = v ^ (v &gt;&gt; 1);</div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;    <span class="keywordflow">return</span> v;</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;}</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="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaStrIsEmpty(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</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="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">&#39;\0&#39;</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;</div><div class="line"><a name="l03158"></a><span class="lineno"> 3158</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VmaAlgorithmToStr(uint32_t algorithm)</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;    <span class="keywordflow">switch</span>(algorithm)</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;    {</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Linear&quot;</span>;</div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Buddy&quot;</span>;</div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Default&quot;</span>;</div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</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;}</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></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="keyword">template</span>&lt;<span class="keyword">typename</span> Iterator, <span class="keyword">typename</span> Compare&gt;</div><div class="line"><a name="l03177"></a><span class="lineno"> 3177</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</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;    Iterator centerValue = end; --centerValue;</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;    Iterator insertIndex = beg;</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</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;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</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="keywordflow">if</span>(insertIndex != memTypeIndex)</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;            {</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;                VMA_SWAP(*memTypeIndex, *insertIndex);</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;            }</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;            ++insertIndex;</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;    }</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;    <span class="keywordflow">if</span>(insertIndex != centerValue)</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;    {</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</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;    <span class="keywordflow">return</span> insertIndex;</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;</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</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="l03200"></a><span class="lineno"> 3200</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</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;    <span class="keywordflow">if</span>(beg &lt; end)</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;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</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;}</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;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</span></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;<span class="preprocessor">#endif // #ifndef VMA_SORT</span></div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</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="l03219"></a><span class="lineno"> 3219</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="l03220"></a><span class="lineno"> 3220</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03221"></a><span class="lineno"> 3221</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div><div class="line"><a name="l03222"></a><span class="lineno"> 3222</span>&#160;    VkDeviceSize resourceAOffset,</div><div class="line"><a name="l03223"></a><span class="lineno"> 3223</span>&#160;    VkDeviceSize resourceASize,</div><div class="line"><a name="l03224"></a><span class="lineno"> 3224</span>&#160;    VkDeviceSize resourceBOffset,</div><div class="line"><a name="l03225"></a><span class="lineno"> 3225</span>&#160;    VkDeviceSize pageSize)</div><div class="line"><a name="l03226"></a><span class="lineno"> 3226</span>&#160;{</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div><div class="line"><a name="l03228"></a><span class="lineno"> 3228</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div><div class="line"><a name="l03229"></a><span class="lineno"> 3229</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</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;</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;<span class="keyword">enum</span> VmaSuballocationType</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>&#160;{</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div><div class="line"><a name="l03241"></a><span class="lineno"> 3241</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div><div class="line"><a name="l03242"></a><span class="lineno"> 3242</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</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;<span class="comment">/*</span></div><div class="line"><a name="l03247"></a><span class="lineno"> 3247</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div><div class="line"><a name="l03248"></a><span class="lineno"> 3248</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</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="l03250"></a><span class="lineno"> 3250</span>&#160;<span class="comment">conservatively.</span></div><div class="line"><a name="l03251"></a><span class="lineno"> 3251</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03252"></a><span class="lineno"> 3252</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;    VmaSuballocationType suballocType1,</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;    VmaSuballocationType suballocType2)</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;{</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;    <span class="keywordflow">if</span>(suballocType1 &gt; suballocType2)</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;        VMA_SWAP(suballocType1, suballocType2);</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;    </div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;    {</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div><div class="line"><a name="l03266"></a><span class="lineno"> 3266</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03267"></a><span class="lineno"> 3267</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03269"></a><span class="lineno"> 3269</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div><div class="line"><a name="l03272"></a><span class="lineno"> 3272</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03273"></a><span class="lineno"> 3273</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03276"></a><span class="lineno"> 3276</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div><div class="line"><a name="l03277"></a><span class="lineno"> 3277</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div><div class="line"><a name="l03280"></a><span class="lineno"> 3280</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03281"></a><span class="lineno"> 3281</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l03282"></a><span class="lineno"> 3282</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l03283"></a><span class="lineno"> 3283</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</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;}</div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;</div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</span>&#160;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</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;    uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pDst)</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;        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_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;}</div><div class="line"><a name="l03296"></a><span class="lineno"> 3296</span>&#160;</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;<span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidateMagicValue(<span class="keyword">const</span> <span class="keywordtype">void</span>* pData, VkDeviceSize offset)</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;    <span class="keyword">const</span> uint32_t* pSrc = (<span class="keyword">const</span> uint32_t*)((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pSrc)</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;        <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;        {</div><div class="line"><a name="l03305"></a><span class="lineno"> 3305</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</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="l03312"></a><span class="lineno"> 3312</span>&#160;<span class="keyword">struct </span>VmaMutexLock</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>&#160;{</div><div class="line"><a name="l03314"></a><span class="lineno"> 3314</span>&#160;    VMA_CLASS_NO_COPY(VmaMutexLock)</div><div class="line"><a name="l03315"></a><span class="lineno"> 3315</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</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="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;        {</div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;            m_pMutex-&gt;Lock();</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;    }</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;    ~VmaMutexLock()</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;    {</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;        {</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;            m_pMutex-&gt;Unlock();</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;    }</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;<span class="keyword">private</span>:</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;    VMA_MUTEX* m_pMutex;</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;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;<span class="preprocessor">#endif</span></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="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</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="l03346"></a><span class="lineno"> 3346</span>&#160;</div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</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="l03349"></a><span class="lineno"> 3349</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03353"></a><span class="lineno"> 3353</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="l03354"></a><span class="lineno"> 3354</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div><div class="line"><a name="l03355"></a><span class="lineno"> 3355</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03356"></a><span class="lineno"> 3356</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT&gt;</div><div class="line"><a name="l03357"></a><span class="lineno"> 3357</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, CmpLess cmp)</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="keywordtype">size_t</span> down = 0, up = (end - beg);</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;    <span class="keywordflow">while</span>(down &lt; up)</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;    {</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div><div class="line"><a name="l03363"></a><span class="lineno"> 3363</span>&#160;        <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</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;            down = mid + 1;</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="keywordflow">else</span></div><div class="line"><a name="l03368"></a><span class="lineno"> 3368</span>&#160;        {</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;            up = mid;</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;    }</div><div class="line"><a name="l03372"></a><span class="lineno"> 3372</span>&#160;    <span class="keywordflow">return</span> beg + down;</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;}</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;<span class="comment">// Memory allocation</span></div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>&#160;</div><div class="line"><a name="l03378"></a><span class="lineno"> 3378</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="l03379"></a><span class="lineno"> 3379</span>&#160;{</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l03381"></a><span class="lineno"> 3381</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</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="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;            size,</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;            alignment,</div><div class="line"><a name="l03387"></a><span class="lineno"> 3387</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</div><div class="line"><a name="l03388"></a><span class="lineno"> 3388</span>&#160;    }</div><div class="line"><a name="l03389"></a><span class="lineno"> 3389</span>&#160;    <span class="keywordflow">else</span></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="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</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;</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</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="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>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l03398"></a><span class="lineno"> 3398</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>&#160;    {</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160;    }</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>&#160;    {</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;        VMA_SYSTEM_FREE(ptr);</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;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</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;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(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;</div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03415"></a><span class="lineno"> 3415</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="l03416"></a><span class="lineno"> 3416</span>&#160;{</div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</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="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="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;</div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</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="l03423"></a><span class="lineno"> 3423</span>&#160;</div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</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="l03426"></a><span class="lineno"> 3426</span>&#160;{</div><div class="line"><a name="l03427"></a><span class="lineno"> 3427</span>&#160;    ptr-&gt;~T();</div><div class="line"><a name="l03428"></a><span class="lineno"> 3428</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</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="l03433"></a><span class="lineno"> 3433</span>&#160;{</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</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="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;        {</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;        }</div><div class="line"><a name="l03440"></a><span class="lineno"> 3440</span>&#160;        VmaFree(pAllocationCallbacks, ptr);</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;}</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;<span class="comment">// STL-compatible allocator.</span></div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03446"></a><span class="lineno"> 3446</span>&#160;<span class="keyword">class </span>VmaStlAllocator</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;<span class="keyword">public</span>:</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;    <span class="keyword">typedef</span> T value_type;</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;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</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="l03454"></a><span class="lineno"> 3454</span>&#160;</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</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="l03456"></a><span class="lineno"> 3456</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="l03457"></a><span class="lineno"> 3457</span>&#160;</div><div class="line"><a name="l03458"></a><span class="lineno"> 3458</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l03459"></a><span class="lineno"> 3459</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="l03460"></a><span class="lineno"> 3460</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03461"></a><span class="lineno"> 3461</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</div><div class="line"><a name="l03462"></a><span class="lineno"> 3462</span>&#160;    }</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</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="l03465"></a><span class="lineno"> 3465</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</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;</div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;};</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="preprocessor">#if VMA_USE_STL_VECTOR</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;<span class="preprocessor">#define VmaVector std::vector</span></div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>&#160;</div><div class="line"><a name="l03476"></a><span class="lineno"> 3476</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="l03477"></a><span class="lineno"> 3477</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="l03478"></a><span class="lineno"> 3478</span>&#160;{</div><div class="line"><a name="l03479"></a><span class="lineno"> 3479</span>&#160;    vec.insert(vec.begin() + index, item);</div><div class="line"><a name="l03480"></a><span class="lineno"> 3480</span>&#160;}</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;<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="l03483"></a><span class="lineno"> 3483</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="l03484"></a><span class="lineno"> 3484</span>&#160;{</div><div class="line"><a name="l03485"></a><span class="lineno"> 3485</span>&#160;    vec.erase(vec.begin() + index);</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</span>&#160;}</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;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;</div><div class="line"><a name="l03490"></a><span class="lineno"> 3490</span>&#160;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div><div class="line"><a name="l03491"></a><span class="lineno"> 3491</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="l03492"></a><span class="lineno"> 3492</span>&#160;<span class="comment">used for these objects. */</span></div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</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="l03494"></a><span class="lineno"> 3494</span>&#160;<span class="keyword">class </span>VmaVector</div><div class="line"><a name="l03495"></a><span class="lineno"> 3495</span>&#160;{</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;    <span class="keyword">typedef</span> T value_type;</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;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</span>&#160;        m_pArray(VMA_NULL),</div><div class="line"><a name="l03502"></a><span class="lineno"> 3502</span>&#160;        m_Count(0),</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;        m_Capacity(0)</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;    }</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;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;        m_Count(count),</div><div class="line"><a name="l03511"></a><span class="lineno"> 3511</span>&#160;        m_Capacity(count)</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;    </div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div><div class="line"><a name="l03516"></a><span class="lineno"> 3516</span>&#160;        m_Allocator(src.m_Allocator),</div><div class="line"><a name="l03517"></a><span class="lineno"> 3517</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="l03518"></a><span class="lineno"> 3518</span>&#160;        m_Count(src.m_Count),</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;        m_Capacity(src.m_Count)</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;    {</div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160;        <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</span>&#160;        {</div><div class="line"><a name="l03523"></a><span class="lineno"> 3523</span>&#160;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</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;    </div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;    ~VmaVector()</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;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</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;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</span>&#160;    {</div><div class="line"><a name="l03534"></a><span class="lineno"> 3534</span>&#160;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;        {</div><div class="line"><a name="l03536"></a><span class="lineno"> 3536</span>&#160;            resize(rhs.m_Count);</div><div class="line"><a name="l03537"></a><span class="lineno"> 3537</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;            {</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;            }</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;        <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l03543"></a><span class="lineno"> 3543</span>&#160;    }</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;    <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="l03546"></a><span class="lineno"> 3546</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="l03547"></a><span class="lineno"> 3547</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</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="l03549"></a><span class="lineno"> 3549</span>&#160;    </div><div class="line"><a name="l03550"></a><span class="lineno"> 3550</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</span>&#160;    {</div><div class="line"><a name="l03552"></a><span class="lineno"> 3552</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03553"></a><span class="lineno"> 3553</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</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="keyword">const</span> T&amp; operator[](<span class="keywordtype">size_t</span> index)<span class="keyword"> const</span></div><div class="line"><a name="l03556"></a><span class="lineno"> 3556</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03558"></a><span class="lineno"> 3558</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</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;</div><div class="line"><a name="l03561"></a><span class="lineno"> 3561</span>&#160;    T&amp; front()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03564"></a><span class="lineno"> 3564</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</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="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</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;    T&amp; back()</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;    {</div><div class="line"><a name="l03573"></a><span class="lineno"> 3573</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03574"></a><span class="lineno"> 3574</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</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="keyword">const</span> T&amp; back()<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_Count &gt; 0);</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</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;</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</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="l03583"></a><span class="lineno"> 3583</span>&#160;    {</div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</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;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</div><div class="line"><a name="l03587"></a><span class="lineno"> 3587</span>&#160;        {</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;            newCapacity = m_Capacity;</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;        }</div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160;        </div><div class="line"><a name="l03591"></a><span class="lineno"> 3591</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</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;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div><div class="line"><a name="l03594"></a><span class="lineno"> 3594</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>&#160;            {</div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160;            }</div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03599"></a><span class="lineno"> 3599</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l03600"></a><span class="lineno"> 3600</span>&#160;            m_pArray = newArray;</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;    }</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160;</div><div class="line"><a name="l03604"></a><span class="lineno"> 3604</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="l03605"></a><span class="lineno"> 3605</span>&#160;    {</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;        <span class="keywordtype">size_t</span> newCapacity = m_Capacity;</div><div class="line"><a name="l03607"></a><span class="lineno"> 3607</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div><div class="line"><a name="l03608"></a><span class="lineno"> 3608</span>&#160;        {</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</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="l03610"></a><span class="lineno"> 3610</span>&#160;        }</div><div class="line"><a name="l03611"></a><span class="lineno"> 3611</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</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;            newCapacity = newCount;</div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</span>&#160;        }</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="keywordflow">if</span>(newCapacity != m_Capacity)</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;            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="l03619"></a><span class="lineno"> 3619</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="l03620"></a><span class="lineno"> 3620</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;            {</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;            }</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03625"></a><span class="lineno"> 3625</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;            m_pArray = newArray;</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;</div><div class="line"><a name="l03629"></a><span class="lineno"> 3629</span>&#160;        m_Count = newCount;</div><div class="line"><a name="l03630"></a><span class="lineno"> 3630</span>&#160;    }</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="keywordtype">void</span> clear(<span class="keywordtype">bool</span> freeMemory = <span class="keyword">false</span>)</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;    {</div><div class="line"><a name="l03634"></a><span class="lineno"> 3634</span>&#160;        resize(0, freeMemory);</div><div class="line"><a name="l03635"></a><span class="lineno"> 3635</span>&#160;    }</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="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="l03638"></a><span class="lineno"> 3638</span>&#160;    {</div><div class="line"><a name="l03639"></a><span class="lineno"> 3639</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div><div class="line"><a name="l03640"></a><span class="lineno"> 3640</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l03641"></a><span class="lineno"> 3641</span>&#160;        resize(oldCount + 1);</div><div class="line"><a name="l03642"></a><span class="lineno"> 3642</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;        {</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</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;        m_pArray[index] = src;</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;    }</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="keywordtype">void</span> <span class="keyword">remove</span>(<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160;    {</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03652"></a><span class="lineno"> 3652</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;        {</div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</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="l03656"></a><span class="lineno"> 3656</span>&#160;        }</div><div class="line"><a name="l03657"></a><span class="lineno"> 3657</span>&#160;        resize(oldCount - 1);</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;</div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</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="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>&#160;        resize(newIndex + 1);</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>&#160;        m_pArray[newIndex] = src;</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;</div><div class="line"><a name="l03667"></a><span class="lineno"> 3667</span>&#160;    <span class="keywordtype">void</span> pop_back()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>&#160;        resize(size() - 1);</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;</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</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;        insert(0, src);</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160;    }</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>&#160;</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</span>&#160;    <span class="keywordtype">void</span> pop_front()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;        <span class="keyword">remove</span>(0);</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;    <span class="keyword">typedef</span> T* iterator;</div><div class="line"><a name="l03685"></a><span class="lineno"> 3685</span>&#160;</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</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="keyword">private</span>:</div><div class="line"><a name="l03690"></a><span class="lineno"> 3690</span>&#160;    AllocatorT m_Allocator;</div><div class="line"><a name="l03691"></a><span class="lineno"> 3691</span>&#160;    T* m_pArray;</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</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> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</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="l03698"></a><span class="lineno"> 3698</span>&#160;{</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160;    vec.insert(index, item);</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;}</div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</span>&#160;</div><div class="line"><a name="l03702"></a><span class="lineno"> 3702</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="l03703"></a><span class="lineno"> 3703</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="l03704"></a><span class="lineno"> 3704</span>&#160;{</div><div class="line"><a name="l03705"></a><span class="lineno"> 3705</span>&#160;    vec.remove(index);</div><div class="line"><a name="l03706"></a><span class="lineno"> 3706</span>&#160;}</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="preprocessor">#endif // #if VMA_USE_STL_VECTOR</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="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</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="l03712"></a><span class="lineno"> 3712</span>&#160;{</div><div class="line"><a name="l03713"></a><span class="lineno"> 3713</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160;        vector.data(),</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l03716"></a><span class="lineno"> 3716</span>&#160;        value,</div><div class="line"><a name="l03717"></a><span class="lineno"> 3717</span>&#160;        CmpLess()) - vector.data();</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div><div class="line"><a name="l03719"></a><span class="lineno"> 3719</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> VectorT&gt;</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</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="l03724"></a><span class="lineno"> 3724</span>&#160;{</div><div class="line"><a name="l03725"></a><span class="lineno"> 3725</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03727"></a><span class="lineno"> 3727</span>&#160;        vector.begin(),</div><div class="line"><a name="l03728"></a><span class="lineno"> 3728</span>&#160;        vector.end(),</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;        value,</div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;        comparator);</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</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="l03732"></a><span class="lineno"> 3732</span>&#160;    {</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div><div class="line"><a name="l03734"></a><span class="lineno"> 3734</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div><div class="line"><a name="l03735"></a><span class="lineno"> 3735</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;</div><div class="line"><a name="l03740"></a><span class="lineno"> 3740</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT&gt;</div><div class="line"><a name="l03741"></a><span class="lineno"> 3741</span>&#160;IterT VmaVectorFindSorted(<span class="keyword">const</span> IterT&amp; beg, <span class="keyword">const</span> IterT&amp; end, <span class="keyword">const</span> KeyT&amp; value)</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;{</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160;    IterT it = VmaBinaryFindFirstNotLess&lt;CmpLess, IterT, KeyT&gt;(</div><div class="line"><a name="l03745"></a><span class="lineno"> 3745</span>&#160;        beg, end, value, comparator);</div><div class="line"><a name="l03746"></a><span class="lineno"> 3746</span>&#160;    <span class="keywordflow">if</span>(it == end ||</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;        (!comparator(*it, value) &amp;&amp; !comparator(value, *it)))</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160;    {</div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>&#160;        <span class="keywordflow">return</span> it;</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;    }</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;    <span class="keywordflow">return</span> end;</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;</div><div class="line"><a name="l03755"></a><span class="lineno"> 3755</span>&#160;<span class="comment">// class VmaPoolAllocator</span></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;<span class="comment">/*</span></div><div class="line"><a name="l03758"></a><span class="lineno"> 3758</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="l03759"></a><span class="lineno"> 3759</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</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;    VMA_CLASS_NO_COPY(VmaPoolAllocator)</div><div class="line"><a name="l03766"></a><span class="lineno"> 3766</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03767"></a><span class="lineno"> 3767</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock);</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160;    ~VmaPoolAllocator();</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l03770"></a><span class="lineno"> 3770</span>&#160;    T* Alloc();</div><div class="line"><a name="l03771"></a><span class="lineno"> 3771</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</span>&#160;</div><div class="line"><a name="l03773"></a><span class="lineno"> 3773</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160;    <span class="keyword">union </span>Item</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;        uint32_t NextFreeIndex;</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;        T Value;</div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;    };</div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</span>&#160;</div><div class="line"><a name="l03780"></a><span class="lineno"> 3780</span>&#160;    <span class="keyword">struct </span>ItemBlock</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;        Item* pItems;</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;        uint32_t FirstFreeIndex;</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160;    };</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="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;    <span class="keywordtype">size_t</span> m_ItemsPerBlock;</div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;</div><div class="line"><a name="l03790"></a><span class="lineno"> 3790</span>&#160;    ItemBlock&amp; CreateNewBlock();</div><div class="line"><a name="l03791"></a><span class="lineno"> 3791</span>&#160;};</div><div class="line"><a name="l03792"></a><span class="lineno"> 3792</span>&#160;</div><div class="line"><a name="l03793"></a><span class="lineno"> 3793</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</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="l03795"></a><span class="lineno"> 3795</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;    m_ItemsPerBlock(itemsPerBlock),</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</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;    VMA_ASSERT(itemsPerBlock &gt; 0);</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</span>&#160;}</div><div class="line"><a name="l03801"></a><span class="lineno"> 3801</span>&#160;</div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</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;    Clear();</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;</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Clear()</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;{</div><div class="line"><a name="l03811"></a><span class="lineno"> 3811</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03812"></a><span class="lineno"> 3812</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemsPerBlock);</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;    m_ItemBlocks.clear();</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>&#160;T* VmaPoolAllocator&lt;T&gt;::Alloc()</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>&#160;{</div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>&#160;    {</div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div><div class="line"><a name="l03823"></a><span class="lineno"> 3823</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</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;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</span>&#160;            <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l03828"></a><span class="lineno"> 3828</span>&#160;        }</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;</div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div><div class="line"><a name="l03833"></a><span class="lineno"> 3833</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div><div class="line"><a name="l03834"></a><span class="lineno"> 3834</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;    <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;{</div><div class="line"><a name="l03841"></a><span class="lineno"> 3841</span>&#160;    <span class="comment">// Search all memory blocks to find ptr.</span></div><div class="line"><a name="l03842"></a><span class="lineno"> 3842</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="l03843"></a><span class="lineno"> 3843</span>&#160;    {</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</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;        <span class="comment">// Casting to union.</span></div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;        Item* pItemPtr;</div><div class="line"><a name="l03848"></a><span class="lineno"> 3848</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</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="comment">// Check if pItemPtr is in address range of this block.</span></div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</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="l03852"></a><span class="lineno"> 3852</span>&#160;        {</div><div class="line"><a name="l03853"></a><span class="lineno"> 3853</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="l03854"></a><span class="lineno"> 3854</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160;            block.FirstFreeIndex = index;</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;        }</div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;    }</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</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="l03860"></a><span class="lineno"> 3860</span>&#160;}</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;</div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</div><div class="line"><a name="l03864"></a><span class="lineno"> 3864</span>&#160;{</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;    ItemBlock newBlock = {</div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, m_ItemsPerBlock), 0 };</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160;    m_ItemBlocks.push_back(newBlock);</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;</div><div class="line"><a name="l03870"></a><span class="lineno"> 3870</span>&#160;    <span class="comment">// Setup singly-linked list of all free items in this block.</span></div><div class="line"><a name="l03871"></a><span class="lineno"> 3871</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; m_ItemsPerBlock - 1; ++i)</div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div><div class="line"><a name="l03873"></a><span class="lineno"> 3873</span>&#160;    newBlock.pItems[m_ItemsPerBlock - 1].NextFreeIndex = UINT32_MAX;</div><div class="line"><a name="l03874"></a><span class="lineno"> 3874</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</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="l03878"></a><span class="lineno"> 3878</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></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;<span class="preprocessor">#if VMA_USE_STL_LIST</span></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="preprocessor">#define VmaList std::list</span></div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;</div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;<span class="keyword">struct </span>VmaListItem</div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160;{</div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>&#160;    VmaListItem* pPrev;</div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160;    VmaListItem* pNext;</div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160;    T Value;</div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;};</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">// Doubly linked list.</span></div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;<span class="keyword">class </span>VmaRawList</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;    VMA_CLASS_NO_COPY(VmaRawList)</div><div class="line"><a name="l03899"></a><span class="lineno"> 3899</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</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;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160;    ~VmaRawList();</div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160;    <span class="keywordtype">void</span> Clear();</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;    <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="l03907"></a><span class="lineno"> 3907</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="l03908"></a><span class="lineno"> 3908</span>&#160;</div><div class="line"><a name="l03909"></a><span class="lineno"> 3909</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l03910"></a><span class="lineno"> 3910</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="l03911"></a><span class="lineno"> 3911</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l03912"></a><span class="lineno"> 3912</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="l03913"></a><span class="lineno"> 3913</span>&#160;</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;    ItemType* PushBack();</div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;    ItemType* PushFront();</div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03918"></a><span class="lineno"> 3918</span>&#160;    <span class="keywordtype">void</span> PopBack();</div><div class="line"><a name="l03919"></a><span class="lineno"> 3919</span>&#160;    <span class="keywordtype">void</span> PopFront();</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="comment">// Item can be null - it means PushBack.</span></div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div><div class="line"><a name="l03923"></a><span class="lineno"> 3923</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</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;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03927"></a><span class="lineno"> 3927</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</span>&#160;</div><div class="line"><a name="l03929"></a><span class="lineno"> 3929</span>&#160;    <span class="keywordtype">void</span> Remove(ItemType* pItem);</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div><div class="line"><a name="l03933"></a><span class="lineno"> 3933</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div><div class="line"><a name="l03934"></a><span class="lineno"> 3934</span>&#160;    ItemType* m_pFront;</div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;    ItemType* m_pBack;</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160;};</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;    m_pFront(VMA_NULL),</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;    m_pBack(VMA_NULL),</div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;    m_Count(0)</div><div class="line"><a name="l03946"></a><span class="lineno"> 3946</span>&#160;{</div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;}</div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160;</div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03950"></a><span class="lineno"> 3950</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div><div class="line"><a name="l03951"></a><span class="lineno"> 3951</span>&#160;{</div><div class="line"><a name="l03952"></a><span class="lineno"> 3952</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div><div class="line"><a name="l03953"></a><span class="lineno"> 3953</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</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="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160;    {</div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;        ItemType* pItem = m_pBack;</div><div class="line"><a name="l03962"></a><span class="lineno"> 3962</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</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;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;            m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;            pItem = pPrevItem;</div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;        }</div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160;        m_pFront = VMA_NULL;</div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;        m_pBack = VMA_NULL;</div><div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160;        m_Count = 0;</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;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03975"></a><span class="lineno"> 3975</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</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;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l03980"></a><span class="lineno"> 3980</span>&#160;    {</div><div class="line"><a name="l03981"></a><span class="lineno"> 3981</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l03982"></a><span class="lineno"> 3982</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>&#160;        m_Count = 1;</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">else</span></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;        pNewItem-&gt;pPrev = m_pBack;</div><div class="line"><a name="l03989"></a><span class="lineno"> 3989</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div><div class="line"><a name="l03990"></a><span class="lineno"> 3990</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;        ++m_Count;</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="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03997"></a><span class="lineno"> 3997</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div><div class="line"><a name="l03998"></a><span class="lineno"> 3998</span>&#160;{</div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160;    {</div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;        m_Count = 1;</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;    }</div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;    {</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;        pNewItem-&gt;pNext = m_pFront;</div><div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;        ++m_Count;</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;    <span class="keywordflow">return</span> pNewItem;</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;</div><div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</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="l04020"></a><span class="lineno"> 4020</span>&#160;{</div><div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</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="l04028"></a><span class="lineno"> 4028</span>&#160;{</div><div class="line"><a name="l04029"></a><span class="lineno"> 4029</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div><div class="line"><a name="l04030"></a><span class="lineno"> 4030</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;    <span class="keywordflow">return</span> pNewItem;</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;}</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</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;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div><div class="line"><a name="l04040"></a><span class="lineno"> 4040</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</div><div class="line"><a name="l04041"></a><span class="lineno"> 4041</span>&#160;    {</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;        pPrevItem-&gt;pNext = VMA_NULL;</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;    m_pBack = pPrevItem;</div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;    m_ItemAllocator.Free(pBackItem);</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;    --m_Count;</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160;}</div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160;</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</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;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div><div class="line"><a name="l04054"></a><span class="lineno"> 4054</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div><div class="line"><a name="l04055"></a><span class="lineno"> 4055</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;    {</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</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;    m_pFront = pNextItem;</div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>&#160;    --m_Count;</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</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;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</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;    <span class="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;    {</div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;    {</div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;        VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;        m_pFront = pItem-&gt;pNext;</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="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</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;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160;    }</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;    <span class="keywordflow">else</span></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;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;        m_pBack = pItem-&gt;pPrev;</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</span>&#160;    }</div><div class="line"><a name="l04089"></a><span class="lineno"> 4089</span>&#160;</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;    m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;    --m_Count;</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</span>&#160;{</div><div class="line"><a name="l04097"></a><span class="lineno"> 4097</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160;    {</div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04101"></a><span class="lineno"> 4101</span>&#160;        newItem-&gt;pPrev = prevItem;</div><div class="line"><a name="l04102"></a><span class="lineno"> 4102</span>&#160;        newItem-&gt;pNext = pItem;</div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160;        pItem-&gt;pPrev = newItem;</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160;        {</div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;            prevItem-&gt;pNext = newItem;</div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160;        }</div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160;        {</div><div class="line"><a name="l04110"></a><span class="lineno"> 4110</span>&#160;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l04111"></a><span class="lineno"> 4111</span>&#160;            m_pFront = newItem;</div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;        }</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;        ++m_Count;</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;    }</div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04117"></a><span class="lineno"> 4117</span>&#160;        <span class="keywordflow">return</span> PushBack();</div><div class="line"><a name="l04118"></a><span class="lineno"> 4118</span>&#160;}</div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;</div><div class="line"><a name="l04120"></a><span class="lineno"> 4120</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04121"></a><span class="lineno"> 4121</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;{</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</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;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;        newItem-&gt;pNext = nextItem;</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;        newItem-&gt;pPrev = pItem;</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;        pItem-&gt;pNext = newItem;</div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</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;            nextItem-&gt;pPrev = newItem;</div><div class="line"><a name="l04133"></a><span class="lineno"> 4133</span>&#160;        }</div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;        <span class="keywordflow">else</span></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;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;            m_pBack = newItem;</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;        ++m_Count;</div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160;        <span class="keywordflow">return</span> newItem;</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l04143"></a><span class="lineno"> 4143</span>&#160;        <span class="keywordflow">return</span> PushFront();</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;</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</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="l04148"></a><span class="lineno"> 4148</span>&#160;{</div><div class="line"><a name="l04149"></a><span class="lineno"> 4149</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div><div class="line"><a name="l04150"></a><span class="lineno"> 4150</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l04151"></a><span class="lineno"> 4151</span>&#160;    <span class="keywordflow">return</span> newItem;</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;</div><div class="line"><a name="l04154"></a><span class="lineno"> 4154</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04155"></a><span class="lineno"> 4155</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="l04156"></a><span class="lineno"> 4156</span>&#160;{</div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;    <span class="keywordflow">return</span> newItem;</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;</div><div class="line"><a name="l04162"></a><span class="lineno"> 4162</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="l04163"></a><span class="lineno"> 4163</span>&#160;<span class="keyword">class </span>VmaList</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;    VMA_CLASS_NO_COPY(VmaList)</div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>&#160;    <span class="keyword">class </span>iterator</div><div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>&#160;    {</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;        iterator() :</div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;        {</div><div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>&#160;        }</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;        T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l04177"></a><span class="lineno"> 4177</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04178"></a><span class="lineno"> 4178</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04179"></a><span class="lineno"> 4179</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;        }</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>&#160;        T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</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;</div><div class="line"><a name="l04187"></a><span class="lineno"> 4187</span>&#160;        iterator&amp; operator++()</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;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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;        iterator&amp; operator--()</div><div class="line"><a name="l04194"></a><span class="lineno"> 4194</span>&#160;        {</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</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;                m_pItem = m_pItem-&gt;pPrev;</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;            <span class="keywordflow">else</span></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;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l04202"></a><span class="lineno"> 4202</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l04203"></a><span class="lineno"> 4203</span>&#160;            }</div><div class="line"><a name="l04204"></a><span class="lineno"> 4204</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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;</div><div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>&#160;        iterator operator++(<span class="keywordtype">int</span>)</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;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04210"></a><span class="lineno"> 4210</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l04211"></a><span class="lineno"> 4211</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;        }</div><div class="line"><a name="l04213"></a><span class="lineno"> 4213</span>&#160;        iterator operator--(<span class="keywordtype">int</span>)</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;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l04217"></a><span class="lineno"> 4217</span>&#160;            <span class="keywordflow">return</span> result;</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;</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</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="l04221"></a><span class="lineno"> 4221</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04222"></a><span class="lineno"> 4222</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04223"></a><span class="lineno"> 4223</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</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;        <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="l04226"></a><span class="lineno"> 4226</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</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;        </div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l04232"></a><span class="lineno"> 4232</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l04233"></a><span class="lineno"> 4233</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</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;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;            m_pList(pList),</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;            m_pItem(pItem)</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;        }</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;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</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;</div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160;    <span class="keyword">class </span>const_iterator</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">public</span>:</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;        const_iterator() :</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l04249"></a><span class="lineno"> 4249</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l04250"></a><span class="lineno"> 4250</span>&#160;        {</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;</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div><div class="line"><a name="l04254"></a><span class="lineno"> 4254</span>&#160;            m_pList(src.m_pList),</div><div class="line"><a name="l04255"></a><span class="lineno"> 4255</span>&#160;            m_pItem(src.m_pItem)</div><div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>&#160;        {</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;        </div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;        }</div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;        <span class="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l04265"></a><span class="lineno"> 4265</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04266"></a><span class="lineno"> 4266</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04267"></a><span class="lineno"> 4267</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l04268"></a><span class="lineno"> 4268</span>&#160;        }</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;        const_iterator&amp; operator++()</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;        {</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l04274"></a><span class="lineno"> 4274</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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;        const_iterator&amp; operator--()</div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;        {</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;            {</div><div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</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="keywordflow">else</span></div><div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>&#160;            {</div><div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;                m_pItem = m_pList-&gt;Back();</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="keywordflow">return</span> *<span class="keyword">this</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;</div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</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;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l04295"></a><span class="lineno"> 4295</span>&#160;        }</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160;        const_iterator operator--(<span class="keywordtype">int</span>)</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;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04299"></a><span class="lineno"> 4299</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l04300"></a><span class="lineno"> 4300</span>&#160;            <span class="keywordflow">return</span> result;</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;</div><div class="line"><a name="l04303"></a><span class="lineno"> 4303</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="l04304"></a><span class="lineno"> 4304</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</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="keywordtype">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04311"></a><span class="lineno"> 4311</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</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;        </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;        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="l04316"></a><span class="lineno"> 4316</span>&#160;            m_pList(pList),</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160;            m_pItem(pItem)</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;        }</div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;</div><div class="line"><a name="l04321"></a><span class="lineno"> 4321</span>&#160;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l04322"></a><span class="lineno"> 4322</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</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;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;    };</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;</div><div class="line"><a name="l04327"></a><span class="lineno"> 4327</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</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> empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_RawList.IsEmpty(); }</div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</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="l04331"></a><span class="lineno"> 4331</span>&#160;</div><div class="line"><a name="l04332"></a><span class="lineno"> 4332</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l04333"></a><span class="lineno"> 4333</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</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;    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="l04336"></a><span class="lineno"> 4336</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="l04337"></a><span class="lineno"> 4337</span>&#160;</div><div class="line"><a name="l04338"></a><span class="lineno"> 4338</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div><div class="line"><a name="l04339"></a><span class="lineno"> 4339</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="l04340"></a><span class="lineno"> 4340</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div><div class="line"><a name="l04341"></a><span class="lineno"> 4341</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="l04342"></a><span class="lineno"> 4342</span>&#160;</div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04344"></a><span class="lineno"> 4344</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</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="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;</div><div class="line"><a name="l04350"></a><span class="lineno"> 4350</span>&#160;<span class="comment">// class VmaMap</span></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="comment">// Unused in this version.</span></div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160;<span class="preprocessor">#if 0</span></div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;</div><div class="line"><a name="l04355"></a><span class="lineno"> 4355</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04356"></a><span class="lineno"> 4356</span>&#160;</div><div class="line"><a name="l04357"></a><span class="lineno"> 4357</span>&#160;<span class="preprocessor">#define VmaPair std::pair</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;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</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="l04361"></a><span class="lineno"> 4361</span>&#160;</div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</span></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;<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="l04365"></a><span class="lineno"> 4365</span>&#160;<span class="keyword">struct </span>VmaPair</div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;{</div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;    T1 first;</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;    T2 second;</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;    VmaPair() : first(), second() { }</div><div class="line"><a name="l04371"></a><span class="lineno"> 4371</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="l04372"></a><span class="lineno"> 4372</span>&#160;};</div><div class="line"><a name="l04373"></a><span class="lineno"> 4373</span>&#160;</div><div class="line"><a name="l04374"></a><span class="lineno"> 4374</span>&#160;<span class="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div><div class="line"><a name="l04376"></a><span class="lineno"> 4376</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04377"></a><span class="lineno"> 4377</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="l04378"></a><span class="lineno"> 4378</span>&#160;<span class="keyword">class </span>VmaMap</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;{</div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</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;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</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;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160;</div><div class="line"><a name="l04389"></a><span class="lineno"> 4389</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div><div class="line"><a name="l04390"></a><span class="lineno"> 4390</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</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="keyword">private</span>:</div><div class="line"><a name="l04394"></a><span class="lineno"> 4394</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</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;</div><div class="line"><a name="l04397"></a><span class="lineno"> 4397</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div><div class="line"><a name="l04398"></a><span class="lineno"> 4398</span>&#160;</div><div class="line"><a name="l04399"></a><span class="lineno"> 4399</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="l04400"></a><span class="lineno"> 4400</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</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">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="l04403"></a><span class="lineno"> 4403</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04404"></a><span class="lineno"> 4404</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div><div class="line"><a name="l04405"></a><span class="lineno"> 4405</span>&#160;    }</div><div class="line"><a name="l04406"></a><span class="lineno"> 4406</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="l04407"></a><span class="lineno"> 4407</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</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;};</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;<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="l04413"></a><span class="lineno"> 4413</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="l04414"></a><span class="lineno"> 4414</span>&#160;{</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l04418"></a><span class="lineno"> 4418</span>&#160;        pair,</div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div><div class="line"><a name="l04420"></a><span class="lineno"> 4420</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</div><div class="line"><a name="l04421"></a><span class="lineno"> 4421</span>&#160;}</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;<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="l04424"></a><span class="lineno"> 4424</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="l04425"></a><span class="lineno"> 4425</span>&#160;{</div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04427"></a><span class="lineno"> 4427</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l04428"></a><span class="lineno"> 4428</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</span>&#160;        key,</div><div class="line"><a name="l04430"></a><span class="lineno"> 4430</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</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">return</span> it;</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;    <span class="keywordflow">else</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">return</span> m_Vector.end();</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;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> KeyT, <span class="keyword">typename</span> ValueT&gt;</div><div class="line"><a name="l04442"></a><span class="lineno"> 4442</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div><div class="line"><a name="l04443"></a><span class="lineno"> 4443</span>&#160;{</div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160;}</div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</span>&#160;</div><div class="line"><a name="l04447"></a><span class="lineno"> 4447</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;<span class="preprocessor">#endif // #if 0</span></div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;</div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160;</div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock;</div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160;</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;<span class="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160;</div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160;<span class="keyword">struct </span>VmaAllocation_T</div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160;{</div><div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocation_T)</div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04461"></a><span class="lineno"> 4461</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="l04462"></a><span class="lineno"> 4462</span>&#160;</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;    <span class="keyword">enum</span> FLAGS</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;        FLAG_USER_DATA_STRING = 0x01,</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;</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04469"></a><span class="lineno"> 4469</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</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;        ALLOCATION_TYPE_NONE,</div><div class="line"><a name="l04472"></a><span class="lineno"> 4472</span>&#160;        ALLOCATION_TYPE_BLOCK,</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;    };</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;    VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;        m_Alignment(1),</div><div class="line"><a name="l04478"></a><span class="lineno"> 4478</span>&#160;        m_Size(0),</div><div class="line"><a name="l04479"></a><span class="lineno"> 4479</span>&#160;        m_pUserData(VMA_NULL),</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;        m_LastUseFrameIndex(currentFrameIndex),</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</span>&#160;        m_Type((uint8_t)ALLOCATION_TYPE_NONE),</div><div class="line"><a name="l04482"></a><span class="lineno"> 4482</span>&#160;        m_SuballocationType((uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN),</div><div class="line"><a name="l04483"></a><span class="lineno"> 4483</span>&#160;        m_MapCount(0),</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;        m_Flags(userDataString ? (uint8_t)FLAG_USER_DATA_STRING : 0)</div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;    {</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160;        m_CreationFrameIndex = currentFrameIndex;</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;        m_BufferImageUsage = 0;</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;<span class="preprocessor">#endif</span></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;</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</span>&#160;    ~VmaAllocation_T()</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;        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="l04495"></a><span class="lineno"> 4495</span>&#160;</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;    }</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;    <span class="keywordtype">void</span> InitBlockAllocation(</div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l04507"></a><span class="lineno"> 4507</span>&#160;        <span class="keywordtype">bool</span> mapped,</div><div class="line"><a name="l04508"></a><span class="lineno"> 4508</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</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_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04511"></a><span class="lineno"> 4511</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;        m_Alignment = alignment;</div><div class="line"><a name="l04514"></a><span class="lineno"> 4514</span>&#160;        m_Size = size;</div><div class="line"><a name="l04515"></a><span class="lineno"> 4515</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;        m_BlockAllocation.m_hPool = hPool;</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;        m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</span>&#160;        m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l04520"></a><span class="lineno"> 4520</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</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;</div><div class="line"><a name="l04523"></a><span class="lineno"> 4523</span>&#160;    <span class="keywordtype">void</span> InitLost()</div><div class="line"><a name="l04524"></a><span class="lineno"> 4524</span>&#160;    {</div><div class="line"><a name="l04525"></a><span class="lineno"> 4525</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04526"></a><span class="lineno"> 4526</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;        m_BlockAllocation.m_hPool = VK_NULL_HANDLE;</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</span>&#160;        m_BlockAllocation.m_Offset = 0;</div><div class="line"><a name="l04531"></a><span class="lineno"> 4531</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</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;</div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div><div class="line"><a name="l04535"></a><span class="lineno"> 4535</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04536"></a><span class="lineno"> 4536</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;        VkDeviceSize offset); </div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;</div><div class="line"><a name="l04539"></a><span class="lineno"> 4539</span>&#160;    <span class="keywordtype">void</span> ChangeSize(VkDeviceSize newSize);</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="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l04544"></a><span class="lineno"> 4544</span>&#160;        VkDeviceMemory hMemory,</div><div class="line"><a name="l04545"></a><span class="lineno"> 4545</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;        VkDeviceSize size)</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;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;        m_Alignment = 0;</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;        m_Size = size;</div><div class="line"><a name="l04554"></a><span class="lineno"> 4554</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l04555"></a><span class="lineno"> 4555</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;        m_DedicatedAllocation.m_MemoryTypeIndex = memoryTypeIndex;</div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</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;</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</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="l04562"></a><span class="lineno"> 4562</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div><div class="line"><a name="l04563"></a><span class="lineno"> 4563</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l04564"></a><span class="lineno"> 4564</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="l04565"></a><span class="lineno"> 4565</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="l04566"></a><span class="lineno"> 4566</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="l04567"></a><span class="lineno"> 4567</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</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;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;    }</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;    uint32_t GetMemoryTypeIndex() <span class="keyword">const</span>;</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</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="l04578"></a><span class="lineno"> 4578</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div><div class="line"><a name="l04579"></a><span class="lineno"> 4579</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetPool() <span class="keyword">const</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;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</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="keywordtype">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;    {</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</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="comment">/*</span></div><div class="line"><a name="l04591"></a><span class="lineno"> 4591</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</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="l04593"></a><span class="lineno"> 4593</span>&#160;<span class="comment">    - Else, returns false.</span></div><div class="line"><a name="l04594"></a><span class="lineno"> 4594</span>&#160;<span class="comment">    </span></div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</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="l04601"></a><span class="lineno"> 4601</span>&#160;    {</div><div class="line"><a name="l04602"></a><span class="lineno"> 4602</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</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="l04609"></a><span class="lineno"> 4609</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</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> BlockAllocMap();</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</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="l04616"></a><span class="lineno"> 4616</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="l04617"></a><span class="lineno"> 4617</span>&#160;</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;    uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;    uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</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">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;    {</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;        VMA_ASSERT(m_BufferImageUsage == 0);</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;        m_BufferImageUsage = bufferImageUsage;</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;</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</span>&#160;    <span class="keywordtype">void</span> PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l04629"></a><span class="lineno"> 4629</span>&#160;<span class="preprocessor">#endif</span></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;<span class="keyword">private</span>:</div><div class="line"><a name="l04632"></a><span class="lineno"> 4632</span>&#160;    VkDeviceSize m_Alignment;</div><div class="line"><a name="l04633"></a><span class="lineno"> 4633</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04634"></a><span class="lineno"> 4634</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div><div class="line"><a name="l04635"></a><span class="lineno"> 4635</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div><div class="line"><a name="l04636"></a><span class="lineno"> 4636</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</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="l04639"></a><span class="lineno"> 4639</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div><div class="line"><a name="l04640"></a><span class="lineno"> 4640</span>&#160;    uint8_t m_MapCount;</div><div class="line"><a name="l04641"></a><span class="lineno"> 4641</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></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="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</span>&#160;    <span class="keyword">struct </span>BlockAllocation</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;        <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="l04647"></a><span class="lineno"> 4647</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160;        VkDeviceSize m_Offset;</div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</div><div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160;    };</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160;</div><div class="line"><a name="l04652"></a><span class="lineno"> 4652</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l04653"></a><span class="lineno"> 4653</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;    {</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;        uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160;        VkDeviceMemory m_hMemory;</div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</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="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="keyword">union</span></div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;    {</div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;        <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;        BlockAllocation m_BlockAllocation;</div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</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;</div><div class="line"><a name="l04668"></a><span class="lineno"> 4668</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04669"></a><span class="lineno"> 4669</span>&#160;    uint32_t m_CreationFrameIndex;</div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;    uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;<span class="preprocessor">#endif</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="keywordtype">void</span> FreeUserDataString(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</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;</div><div class="line"><a name="l04676"></a><span class="lineno"> 4676</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;<span class="comment">allocated memory block or free.</span></div><div class="line"><a name="l04679"></a><span class="lineno"> 4679</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04680"></a><span class="lineno"> 4680</span>&#160;<span class="keyword">struct </span>VmaSuballocation</div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;{</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l04683"></a><span class="lineno"> 4683</span>&#160;    VkDeviceSize size;</div><div class="line"><a name="l04684"></a><span class="lineno"> 4684</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;    VmaSuballocationType type;</div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;};</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;<span class="comment">// Comparator for offsets.</span></div><div class="line"><a name="l04689"></a><span class="lineno"> 4689</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetLess</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;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation&amp; lhs, <span class="keyword">const</span> VmaSuballocation&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;        <span class="keywordflow">return</span> lhs.offset &lt; rhs.offset;</div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;    }</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;<span class="keyword">struct </span>VmaSuballocationOffsetGreater</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;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation&amp; lhs, <span class="keyword">const</span> VmaSuballocation&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;        <span class="keywordflow">return</span> lhs.offset &gt; rhs.offset;</div><div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;    }</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="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</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;<span class="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</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">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div><div class="line"><a name="l04714"></a><span class="lineno"> 4714</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div><div class="line"><a name="l04717"></a><span class="lineno"> 4717</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div><div class="line"><a name="l04718"></a><span class="lineno"> 4718</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</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="l04720"></a><span class="lineno"> 4720</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div><div class="line"><a name="l04721"></a><span class="lineno"> 4721</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04722"></a><span class="lineno"> 4722</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;{</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</span>&#160;    VkDeviceSize offset;</div><div class="line"><a name="l04725"></a><span class="lineno"> 4725</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div><div class="line"><a name="l04726"></a><span class="lineno"> 4726</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="l04727"></a><span class="lineno"> 4727</span>&#160;    VmaSuballocationList::iterator item;</div><div class="line"><a name="l04728"></a><span class="lineno"> 4728</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div><div class="line"><a name="l04729"></a><span class="lineno"> 4729</span>&#160;    <span class="keywordtype">void</span>* customData;</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;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04733"></a><span class="lineno"> 4733</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</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="comment">/*</span></div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div><div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div><div class="line"><a name="l04740"></a><span class="lineno"> 4740</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04741"></a><span class="lineno"> 4741</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</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="keyword">public</span>:</div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata() { }</div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size) { m_Size = size; }</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;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l04749"></a><span class="lineno"> 4749</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04753"></a><span class="lineno"> 4753</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04754"></a><span class="lineno"> 4754</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span> = 0;</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="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160;    <span class="comment">// Shouldn&#39;t modify blockCount.</span></div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span> = 0;</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04762"></a><span class="lineno"> 4762</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04763"></a><span class="lineno"> 4763</span>&#160;<span class="preprocessor">#endif</span></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;    <span class="comment">// Tries to find a place for suballocation with given parameters inside this block.</span></div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;    <span class="comment">// If failed, returns false.</span></div><div class="line"><a name="l04768"></a><span class="lineno"> 4768</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l04769"></a><span class="lineno"> 4769</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04770"></a><span class="lineno"> 4770</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04771"></a><span class="lineno"> 4771</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04772"></a><span class="lineno"> 4772</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04773"></a><span class="lineno"> 4773</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l04775"></a><span class="lineno"> 4775</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04776"></a><span class="lineno"> 4776</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;        uint32_t strategy, <span class="comment">// Always one of VMA_ALLOCATION_CREATE_STRATEGY_* flags.</span></div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</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="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</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="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount) = 0;</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;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) = 0;</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="comment">// Makes actual allocation based on request. Request must already be checked and valid.</span></div><div class="line"><a name="l04790"></a><span class="lineno"> 4790</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l04791"></a><span class="lineno"> 4791</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04794"></a><span class="lineno"> 4794</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) = 0;</div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;</div><div class="line"><a name="l04797"></a><span class="lineno"> 4797</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div><div class="line"><a name="l04798"></a><span class="lineno"> 4798</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) = 0;</div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) = 0;</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;</div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160;    <span class="comment">// Tries to resize (grow or shrink) space for given allocation, in place.</span></div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> ResizeAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize newSize) { <span class="keywordflow">return</span> <span class="keyword">false</span>; }</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160;</div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;<span class="keyword">protected</span>:</div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAllocationCallbacks; }</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l04809"></a><span class="lineno"> 4809</span>&#160;        VkDeviceSize unusedBytes,</div><div class="line"><a name="l04810"></a><span class="lineno"> 4810</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;        <span class="keywordtype">size_t</span> unusedRangeCount) <span class="keyword">const</span>;</div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l04814"></a><span class="lineno"> 4814</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04815"></a><span class="lineno"> 4815</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;        VkDeviceSize size) <span class="keyword">const</span>;</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;</div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</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;</div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;<span class="preprocessor">#define VMA_VALIDATE(cond) do { if(!(cond)) { \</span></div><div class="line"><a name="l04827"></a><span class="lineno"> 4827</span>&#160;<span class="preprocessor">        VMA_ASSERT(0 &amp;&amp; &quot;Validation failed: &quot; #cond); \</span></div><div class="line"><a name="l04828"></a><span class="lineno"> 4828</span>&#160;<span class="preprocessor">        return false; \</span></div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;<span class="preprocessor">    } } while(false)</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;<span class="keyword">class </span>VmaBlockMetadata_Generic : <span class="keyword">public</span> VmaBlockMetadata</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;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Generic)</div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;    VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Generic();</div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;    <span class="keyword">virtual</span> <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="l04841"></a><span class="lineno"> 4841</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</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;    <span class="keyword">virtual</span> <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="l04846"></a><span class="lineno"> 4846</span>&#160;    <span class="keyword">virtual</span> <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="l04847"></a><span class="lineno"> 4847</span>&#160;</div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;    <span class="keyword">virtual</span> <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="l04850"></a><span class="lineno"> 4850</span>&#160;<span class="preprocessor">#endif</span></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;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l04853"></a><span class="lineno"> 4853</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04854"></a><span class="lineno"> 4854</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04857"></a><span class="lineno"> 4857</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;</div><div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04867"></a><span class="lineno"> 4867</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</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;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;    <span class="keyword">virtual</span> <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="l04881"></a><span class="lineno"> 4881</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> ResizeAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize newSize);</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="keyword">private</span>:</div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;    uint32_t m_FreeCount;</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;    VmaSuballocationList m_Suballocations;</div><div class="line"><a name="l04889"></a><span class="lineno"> 4889</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div><div class="line"><a name="l04890"></a><span class="lineno"> 4890</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160;</div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</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="comment">// Checks if requested suballocation with given parameters can be placed in given pFreeSuballocItem.</span></div><div class="line"><a name="l04896"></a><span class="lineno"> 4896</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div><div class="line"><a name="l04897"></a><span class="lineno"> 4897</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04902"></a><span class="lineno"> 4902</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04903"></a><span class="lineno"> 4903</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l04905"></a><span class="lineno"> 4905</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160;        VkDeviceSize* pOffset,</div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l04908"></a><span class="lineno"> 4908</span>&#160;        VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l04909"></a><span class="lineno"> 4909</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div><div class="line"><a name="l04910"></a><span class="lineno"> 4910</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="l04911"></a><span class="lineno"> 4911</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div><div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div><div class="line"><a name="l04914"></a><span class="lineno"> 4914</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div><div class="line"><a name="l04915"></a><span class="lineno"> 4915</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div><div class="line"><a name="l04916"></a><span class="lineno"> 4916</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</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;<span class="comment">/*</span></div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;<span class="comment">Allocations and their references in internal data structure look like this:</span></div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04927"></a><span class="lineno"> 4927</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_EMPTY):</span></div><div class="line"><a name="l04928"></a><span class="lineno"> 4928</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04932"></a><span class="lineno"> 4932</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04933"></a><span class="lineno"> 4933</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04934"></a><span class="lineno"> 4934</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l04935"></a><span class="lineno"> 4935</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04943"></a><span class="lineno"> 4943</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04944"></a><span class="lineno"> 4944</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04945"></a><span class="lineno"> 4945</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l04946"></a><span class="lineno"> 4946</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04947"></a><span class="lineno"> 4947</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):</span></div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div><div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04958"></a><span class="lineno"> 4958</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04973"></a><span class="lineno"> 4973</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):</span></div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04984"></a><span class="lineno"> 4984</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l04985"></a><span class="lineno"> 4985</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Linear : <span class="keyword">public</span> VmaBlockMetadata</div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;{</div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Linear)</div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;    VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Linear();</div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</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;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span>;</div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetAllocationCount() == 0; }</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="keyword">virtual</span> <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="l05017"></a><span class="lineno"> 5017</span>&#160;    <span class="keyword">virtual</span> <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="l05018"></a><span class="lineno"> 5018</span>&#160;</div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;    <span class="keyword">virtual</span> <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="l05021"></a><span class="lineno"> 5021</span>&#160;<span class="preprocessor">#endif</span></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="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;</div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;</div><div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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;    <span class="keyword">virtual</span> <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="l05052"></a><span class="lineno"> 5052</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;</div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;<span class="comment">    There are two suballocation vectors, used in ping-pong way.</span></div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;<span class="comment">    The one with index m_1stVectorIndex is called 1st.</span></div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;<span class="comment">    The one with index (m_1stVectorIndex ^ 1) is called 2nd.</span></div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;<span class="comment">    2nd can be non-empty only when 1st is not empty.</span></div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;<span class="comment">    When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.</span></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="keyword">typedef</span> VmaVector&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; SuballocationVectorType;</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;    <span class="keyword">enum</span> SECOND_VECTOR_MODE</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;    {</div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;        SECOND_VECTOR_EMPTY,</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;<span class="comment">        Suballocations in 2nd vector are created later than the ones in 1st, but they</span></div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;<span class="comment">        all have smaller offset.</span></div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;        SECOND_VECTOR_RING_BUFFER,</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;<span class="comment">        Suballocations in 2nd vector are upper side of double stack.</span></div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;<span class="comment">        They all have offsets higher than those in 1st vector.</span></div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;<span class="comment">        Top of this stack means smaller offsets, but higher indices in this vector.</span></div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l05077"></a><span class="lineno"> 5077</span>&#160;        SECOND_VECTOR_DOUBLE_STACK,</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;</div><div class="line"><a name="l05080"></a><span class="lineno"> 5080</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;    SuballocationVectorType m_Suballocations0, m_Suballocations1;</div><div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;    uint32_t m_1stVectorIndex;</div><div class="line"><a name="l05083"></a><span class="lineno"> 5083</span>&#160;    SECOND_VECTOR_MODE m_2ndVectorMode;</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;    SuballocationVectorType&amp; AccessSuballocations1st() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div><div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;    SuballocationVectorType&amp; AccessSuballocations2nd() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div><div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; AccessSuballocations1st()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div><div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; AccessSuballocations2nd()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</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="comment">// Number of items in 1st vector with hAllocation = null at the beginning.</span></div><div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsBeginCount;</div><div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;    <span class="comment">// Number of other items in 1st vector with hAllocation = null somewhere in the middle.</span></div><div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsMiddleCount;</div><div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;    <span class="comment">// Number of items in 2nd vector with hAllocation = null.</span></div><div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;    <span class="keywordtype">size_t</span> m_2ndNullItemsCount;</div><div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;</div><div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;    <span class="keywordtype">bool</span> ShouldCompact1st() <span class="keyword">const</span>;</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;    <span class="keywordtype">void</span> CleanupAfterFree();</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="comment">/*</span></div><div class="line"><a name="l05102"></a><span class="lineno"> 5102</span>&#160;<span class="comment">- GetSize() is the original size of allocated memory block.</span></div><div class="line"><a name="l05103"></a><span class="lineno"> 5103</span>&#160;<span class="comment">- m_UsableSize is this size aligned down to a power of two.</span></div><div class="line"><a name="l05104"></a><span class="lineno"> 5104</span>&#160;<span class="comment">  All allocations and calculations happen relative to m_UsableSize.</span></div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160;<span class="comment">- GetUnusableSize() is the difference between them.</span></div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;<span class="comment">  It is repoted as separate, unused range, not available for allocations.</span></div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;<span class="comment">Node at level 0 has size = m_UsableSize.</span></div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;<span class="comment">Each next level contains nodes with size 2 times smaller than current level.</span></div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;<span class="comment">m_LevelCount is the maximum number of levels to use in the current object.</span></div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05112"></a><span class="lineno"> 5112</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Buddy : <span class="keyword">public</span> VmaBlockMetadata</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;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Buddy)</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;    VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Buddy();</div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div><div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;</div><div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationCount; }</div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize + GetUnusableSize(); }</div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Root-&gt;type == Node::TYPE_FREE; }</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160;    <span class="keyword">virtual</span> <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="l05127"></a><span class="lineno"> 5127</span>&#160;    <span class="keyword">virtual</span> <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="l05128"></a><span class="lineno"> 5128</span>&#160;</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;    <span class="keyword">virtual</span> <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="l05131"></a><span class="lineno"> 5131</span>&#160;<span class="preprocessor">#endif</span></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="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05141"></a><span class="lineno"> 5141</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05142"></a><span class="lineno"> 5142</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l05146"></a><span class="lineno"> 5146</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05147"></a><span class="lineno"> 5147</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;</div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) { <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT; }</div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;</div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05158"></a><span class="lineno"> 5158</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05159"></a><span class="lineno"> 5159</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) { FreeAtOffset(allocation, allocation-&gt;GetOffset()); }</div><div class="line"><a name="l05162"></a><span class="lineno"> 5162</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) { FreeAtOffset(VMA_NULL, offset); }</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;<span class="keyword">private</span>:</div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize MIN_NODE_SIZE = 32;</div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_LEVELS = 30;</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;    <span class="keyword">struct </span>ValidationContext</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="keywordtype">size_t</span> calculatedAllocationCount;</div><div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;        <span class="keywordtype">size_t</span> calculatedFreeCount;</div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;        VkDeviceSize calculatedSumFreeSize;</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;        ValidationContext() :</div><div class="line"><a name="l05175"></a><span class="lineno"> 5175</span>&#160;            calculatedAllocationCount(0),</div><div class="line"><a name="l05176"></a><span class="lineno"> 5176</span>&#160;            calculatedFreeCount(0),</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;            calculatedSumFreeSize(0) { }</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;</div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160;    <span class="keyword">struct </span>Node</div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;    {</div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;        VkDeviceSize offset;</div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;        <span class="keyword">enum</span> TYPE</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;            TYPE_FREE,</div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160;            TYPE_ALLOCATION,</div><div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160;            TYPE_SPLIT,</div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;            TYPE_COUNT</div><div class="line"><a name="l05189"></a><span class="lineno"> 5189</span>&#160;        } type;</div><div class="line"><a name="l05190"></a><span class="lineno"> 5190</span>&#160;        Node* parent;</div><div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160;        Node* buddy;</div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;</div><div class="line"><a name="l05193"></a><span class="lineno"> 5193</span>&#160;        <span class="keyword">union</span></div><div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;        {</div><div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;            <span class="keyword">struct</span></div><div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;            {</div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;                Node* prev;</div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;                Node* next;</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160;            } free;</div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;            <span class="keyword">struct</span></div><div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160;            {</div><div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;                <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;            } allocation;</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;            <span class="keyword">struct</span></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;                Node* leftChild;</div><div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160;            } split;</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;    };</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;</div><div class="line"><a name="l05211"></a><span class="lineno"> 5211</span>&#160;    <span class="comment">// Size of the memory block aligned down to a power of two.</span></div><div class="line"><a name="l05212"></a><span class="lineno"> 5212</span>&#160;    VkDeviceSize m_UsableSize;</div><div class="line"><a name="l05213"></a><span class="lineno"> 5213</span>&#160;    uint32_t m_LevelCount;</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;    Node* m_Root;</div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160;    <span class="keyword">struct </span>{</div><div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;        Node* front;</div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;        Node* back;</div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;    } m_FreeList[MAX_LEVELS];</div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_ALLOCATION.</span></div><div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;    <span class="keywordtype">size_t</span> m_AllocationCount;</div><div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_FREE.</span></div><div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160;    <span class="keywordtype">size_t</span> m_FreeCount;</div><div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;    <span class="comment">// This includes space wasted due to internal fragmentation. Doesn&#39;t include unusable size.</span></div><div class="line"><a name="l05225"></a><span class="lineno"> 5225</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l05226"></a><span class="lineno"> 5226</span>&#160;</div><div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;    VkDeviceSize GetUnusableSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetSize() - m_UsableSize; }</div><div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;    <span class="keywordtype">void</span> DeleteNode(Node* node);</div><div class="line"><a name="l05229"></a><span class="lineno"> 5229</span>&#160;    <span class="keywordtype">bool</span> ValidateNode(ValidationContext&amp; ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05230"></a><span class="lineno"> 5230</span>&#160;    uint32_t AllocSizeToLevel(VkDeviceSize allocSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;    <span class="keyword">inline</span> VkDeviceSize LevelToNodeSize(uint32_t level)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_UsableSize &gt;&gt; level; }</div><div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;    <span class="comment">// Alloc passed just for validation. Can be null.</span></div><div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;    <span class="keywordtype">void</span> FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset);</div><div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160;    <span class="keywordtype">void</span> CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160;    <span class="comment">// Adds node to the front of FreeList at given level.</span></div><div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div><div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;    <span class="comment">// node-&gt;free.prev, next can be undefined.</span></div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;    <span class="keywordtype">void</span> AddToFreeListFront(uint32_t level, Node* node);</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;    <span class="comment">// Removes node from FreeList at given level.</span></div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;    <span class="comment">// node-&gt;free.prev, next stay untouched.</span></div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;    <span class="keywordtype">void</span> RemoveFromFreeList(uint32_t level, Node* node);</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter&amp; json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05246"></a><span class="lineno"> 5246</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05247"></a><span class="lineno"> 5247</span>&#160;};</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="comment">/*</span></div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div><div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</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;    VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div><div class="line"><a name="l05258"></a><span class="lineno"> 5258</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05259"></a><span class="lineno"> 5259</span>&#160;    VmaBlockMetadata* m_pMetadata;</div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</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;    ~VmaDeviceMemoryBlock()</div><div class="line"><a name="l05264"></a><span class="lineno"> 5264</span>&#160;    {</div><div class="line"><a name="l05265"></a><span class="lineno"> 5265</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="l05266"></a><span class="lineno"> 5266</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</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;</div><div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;    <span class="comment">// Always call after construction.</span></div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;    <span class="keywordtype">void</span> Init(</div><div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05272"></a><span class="lineno"> 5272</span>&#160;        uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l05273"></a><span class="lineno"> 5273</span>&#160;        VkDeviceMemory newMemory,</div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;        VkDeviceSize newSize,</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;        uint32_t <span class="keywordtype">id</span>,</div><div class="line"><a name="l05276"></a><span class="lineno"> 5276</span>&#160;        uint32_t algorithm);</div><div class="line"><a name="l05277"></a><span class="lineno"> 5277</span>&#160;    <span class="comment">// Always call before destruction.</span></div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</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="l05279"></a><span class="lineno"> 5279</span>&#160;    </div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</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="l05284"></a><span class="lineno"> 5284</span>&#160;</div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;</div><div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;    VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;</div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;    <span class="comment">// ppData can be null.</span></div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</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="l05292"></a><span class="lineno"> 5292</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="l05293"></a><span class="lineno"> 5293</span>&#160;</div><div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;    VkResult WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;    VkResult ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;</div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;    VkResult BindBufferMemory(</div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;        VkBuffer hBuffer);</div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;    VkResult BindImageMemory(</div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;        VkImage hImage);</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="keyword">private</span>:</div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;    uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;    uint32_t m_Id;</div><div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;    VkDeviceMemory m_hMemory;</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="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="l05312"></a><span class="lineno"> 5312</span>&#160;    <span class="comment">// Also protects m_MapCount, m_pMappedData.</span></div><div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;    uint32_t m_MapCount;</div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</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;<span class="keyword">struct </span>VmaPointerLess</div><div class="line"><a name="l05319"></a><span class="lineno"> 5319</span>&#160;{</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</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="l05321"></a><span class="lineno"> 5321</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05322"></a><span class="lineno"> 5322</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</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;</div><div class="line"><a name="l05326"></a><span class="lineno"> 5326</span>&#160;<span class="keyword">class </span>VmaDefragmentator;</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="comment">/*</span></div><div class="line"><a name="l05329"></a><span class="lineno"> 5329</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div><div class="line"><a name="l05330"></a><span class="lineno"> 5330</span>&#160;<span class="comment">Vulkan memory type.</span></div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;<span class="keyword">struct </span>VmaBlockVector</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;    VMA_CLASS_NO_COPY(VmaBlockVector)</div><div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160;    VmaBlockVector(</div><div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l05341"></a><span class="lineno"> 5341</span>&#160;        VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05345"></a><span class="lineno"> 5345</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05346"></a><span class="lineno"> 5346</span>&#160;        <span class="keywordtype">bool</span> isCustomPool,</div><div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;        <span class="keywordtype">bool</span> explicitBlockSize,</div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;        uint32_t algorithm);</div><div class="line"><a name="l05349"></a><span class="lineno"> 5349</span>&#160;    ~VmaBlockVector();</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;    VkResult CreateMinBlocks();</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;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l05354"></a><span class="lineno"> 5354</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div><div class="line"><a name="l05355"></a><span class="lineno"> 5355</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;    uint32_t GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Algorithm; }</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="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</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;    <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="l05362"></a><span class="lineno"> 5362</span>&#160;    <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;    VkResult Allocate(</div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</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="l05370"></a><span class="lineno"> 5370</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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;    <span class="keywordtype">void</span> Free(</div><div class="line"><a name="l05374"></a><span class="lineno"> 5374</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160;</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;    <span class="comment">// Adds statistics of this BlockVector to pStats.</span></div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</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="l05378"></a><span class="lineno"> 5378</span>&#160;</div><div class="line"><a name="l05379"></a><span class="lineno"> 5379</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l05381"></a><span class="lineno"> 5381</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05382"></a><span class="lineno"> 5382</span>&#160;</div><div class="line"><a name="l05383"></a><span class="lineno"> 5383</span>&#160;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l05386"></a><span class="lineno"> 5386</span>&#160;    VkResult CheckCorruption();</div><div class="line"><a name="l05387"></a><span class="lineno"> 5387</span>&#160;</div><div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160;    VmaDefragmentator* EnsureDefragmentator(</div><div class="line"><a name="l05389"></a><span class="lineno"> 5389</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05390"></a><span class="lineno"> 5390</span>&#160;        uint32_t currentFrameIndex);</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;    VkResult Defragment(</div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;        VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;        uint32_t&amp; maxAllocationsToMove);</div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;</div><div class="line"><a name="l05397"></a><span class="lineno"> 5397</span>&#160;    <span class="keywordtype">void</span> DestroyDefragmentator();</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="keyword">private</span>:</div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentator;</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="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> m_hAllocator;</div><div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div><div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div><div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div><div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div><div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div><div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_IsCustomPool;</div><div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_ExplicitBlockSize;</div><div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;    <span class="keyword">const</span> uint32_t m_Algorithm;</div><div class="line"><a name="l05412"></a><span class="lineno"> 5412</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div><div class="line"><a name="l05413"></a><span class="lineno"> 5413</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l05414"></a><span class="lineno"> 5414</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div><div class="line"><a name="l05415"></a><span class="lineno"> 5415</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div><div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty - a</span></div><div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160;<span class="comment">    hysteresis to avoid pessimistic case of alternating creation and destruction</span></div><div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;<span class="comment">    of a VkDeviceMemory. */</span></div><div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;    VmaDefragmentator* m_pDefragmentator;</div><div class="line"><a name="l05420"></a><span class="lineno"> 5420</span>&#160;    uint32_t m_NextBlockId;</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;    VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div><div class="line"><a name="l05423"></a><span class="lineno"> 5423</span>&#160;</div><div class="line"><a name="l05424"></a><span class="lineno"> 5424</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div><div class="line"><a name="l05425"></a><span class="lineno"> 5425</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</div><div class="line"><a name="l05426"></a><span class="lineno"> 5426</span>&#160;</div><div class="line"><a name="l05427"></a><span class="lineno"> 5427</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="l05428"></a><span class="lineno"> 5428</span>&#160;    <span class="comment">// after this call.</span></div><div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</div><div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>&#160;</div><div class="line"><a name="l05431"></a><span class="lineno"> 5431</span>&#160;    <span class="comment">// To be used only without CAN_MAKE_OTHER_LOST flag.</span></div><div class="line"><a name="l05432"></a><span class="lineno"> 5432</span>&#160;    VkResult AllocateFromBlock(</div><div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160;        VmaDeviceMemoryBlock* pBlock,</div><div class="line"><a name="l05434"></a><span class="lineno"> 5434</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l05435"></a><span class="lineno"> 5435</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05437"></a><span class="lineno"> 5437</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05438"></a><span class="lineno"> 5438</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div><div class="line"><a name="l05439"></a><span class="lineno"> 5439</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l05440"></a><span class="lineno"> 5440</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</div><div class="line"><a name="l05445"></a><span class="lineno"> 5445</span>&#160;};</div><div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;</div><div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;<span class="keyword">struct </span>VmaPool_T</div><div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;{</div><div class="line"><a name="l05449"></a><span class="lineno"> 5449</span>&#160;    VMA_CLASS_NO_COPY(VmaPool_T)</div><div class="line"><a name="l05450"></a><span class="lineno"> 5450</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;    VmaBlockVector m_BlockVector;</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;    VmaPool_T(</div><div class="line"><a name="l05454"></a><span class="lineno"> 5454</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05455"></a><span class="lineno"> 5455</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="l05456"></a><span class="lineno"> 5456</span>&#160;        VkDeviceSize preferredBlockSize);</div><div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;    ~VmaPool_T();</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;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l05460"></a><span class="lineno"> 5460</span>&#160;    <span class="keywordtype">void</span> SetId(uint32_t <span class="keywordtype">id</span>) { VMA_ASSERT(m_Id == 0); m_Id = id; }</div><div class="line"><a name="l05461"></a><span class="lineno"> 5461</span>&#160;</div><div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div><div class="line"><a name="l05464"></a><span class="lineno"> 5464</span>&#160;<span class="preprocessor">#endif</span></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;<span class="keyword">private</span>:</div><div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;    uint32_t m_Id;</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;</div><div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160;<span class="keyword">class </span>VmaDefragmentator</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_CLASS_NO_COPY(VmaDefragmentator)</div><div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05474"></a><span class="lineno"> 5474</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="l05475"></a><span class="lineno"> 5475</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div><div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;    uint32_t m_CurrentFrameIndex;</div><div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;    VkDeviceSize m_BytesMoved;</div><div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;    uint32_t m_AllocationsMoved;</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">struct </span>AllocationInfo</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;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div><div class="line"><a name="l05483"></a><span class="lineno"> 5483</span>&#160;        VkBool32* m_pChanged;</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;        AllocationInfo() :</div><div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div><div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>&#160;            m_pChanged(VMA_NULL)</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;        }</div><div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160;    };</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="keyword">struct </span>AllocationInfoSizeGreater</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;        <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="l05495"></a><span class="lineno"> 5495</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</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;    };</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="comment">// Used between AddAllocation and Defragment.</span></div><div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;    VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</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="keyword">struct </span>BlockInfo</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;        VmaDeviceMemoryBlock* m_pBlock;</div><div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div><div class="line"><a name="l05507"></a><span class="lineno"> 5507</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</div><div class="line"><a name="l05508"></a><span class="lineno"> 5508</span>&#160;</div><div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l05510"></a><span class="lineno"> 5510</span>&#160;            m_pBlock(VMA_NULL),</div><div class="line"><a name="l05511"></a><span class="lineno"> 5511</span>&#160;            m_HasNonMovableAllocations(true),</div><div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;            m_Allocations(pAllocationCallbacks),</div><div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;            m_pMappedDataForDefragmentation(VMA_NULL)</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;        }</div><div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>&#160;</div><div class="line"><a name="l05517"></a><span class="lineno"> 5517</span>&#160;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</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;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock-&gt;m_pMetadata-&gt;GetAllocationCount();</div><div class="line"><a name="l05520"></a><span class="lineno"> 5520</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div><div class="line"><a name="l05521"></a><span class="lineno"> 5521</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div><div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;        }</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;        <span class="keywordtype">void</span> SortAllocationsBySizeDescecnding()</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;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</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;        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="l05530"></a><span class="lineno"> 5530</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="l05531"></a><span class="lineno"> 5531</span>&#160;</div><div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l05533"></a><span class="lineno"> 5533</span>&#160;        <span class="comment">// Not null if mapped for defragmentation only, not originally mapped.</span></div><div class="line"><a name="l05534"></a><span class="lineno"> 5534</span>&#160;        <span class="keywordtype">void</span>* m_pMappedDataForDefragmentation;</div><div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;    };</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;    <span class="keyword">struct </span>BlockPointerLess</div><div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;    {</div><div class="line"><a name="l05539"></a><span class="lineno"> 5539</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="l05540"></a><span class="lineno"> 5540</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l05541"></a><span class="lineno"> 5541</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</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;        <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="l05544"></a><span class="lineno"> 5544</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</div><div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;        }</div><div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;    };</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="comment">// 1. Blocks with some non-movable allocations go first.</span></div><div class="line"><a name="l05550"></a><span class="lineno"> 5550</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div><div class="line"><a name="l05551"></a><span class="lineno"> 5551</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</div><div class="line"><a name="l05552"></a><span class="lineno"> 5552</span>&#160;    {</div><div class="line"><a name="l05553"></a><span class="lineno"> 5553</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="l05554"></a><span class="lineno"> 5554</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l05556"></a><span class="lineno"> 5556</span>&#160;            {</div><div class="line"><a name="l05557"></a><span class="lineno"> 5557</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;            }</div><div class="line"><a name="l05559"></a><span class="lineno"> 5559</span>&#160;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;            }</div><div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;GetSumFreeSize() &lt; pRhsBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;GetSumFreeSize())</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="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160;            }</div><div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;    };</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;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div><div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;    BlockInfoVector m_Blocks;</div><div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;</div><div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;    VkResult DefragmentRound(</div><div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l05576"></a><span class="lineno"> 5576</span>&#160;        uint32_t maxAllocationsToMove);</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="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div><div class="line"><a name="l05579"></a><span class="lineno"> 5579</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</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;<span class="keyword">public</span>:</div><div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;    VmaDefragmentator(</div><div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160;        uint32_t currentFrameIndex);</div><div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;</div><div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;    ~VmaDefragmentator();</div><div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;</div><div class="line"><a name="l05590"></a><span class="lineno"> 5590</span>&#160;    VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div><div class="line"><a name="l05591"></a><span class="lineno"> 5591</span>&#160;    uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</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="keywordtype">void</span> AddAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc, VkBool32* pChanged);</div><div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;</div><div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;        uint32_t maxAllocationsToMove);</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="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l05601"></a><span class="lineno"> 5601</span>&#160;</div><div class="line"><a name="l05602"></a><span class="lineno"> 5602</span>&#160;<span class="keyword">class </span>VmaRecorder</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;<span class="keyword">public</span>:</div><div class="line"><a name="l05605"></a><span class="lineno"> 5605</span>&#160;    VmaRecorder();</div><div class="line"><a name="l05606"></a><span class="lineno"> 5606</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex);</div><div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>&#160;    <span class="keywordtype">void</span> WriteConfiguration(</div><div class="line"><a name="l05608"></a><span class="lineno"> 5608</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div><div class="line"><a name="l05609"></a><span class="lineno"> 5609</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div><div class="line"><a name="l05610"></a><span class="lineno"> 5610</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled);</div><div class="line"><a name="l05611"></a><span class="lineno"> 5611</span>&#160;    ~VmaRecorder();</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="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div><div class="line"><a name="l05614"></a><span class="lineno"> 5614</span>&#160;    <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div><div class="line"><a name="l05615"></a><span class="lineno"> 5615</span>&#160;    <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div><div class="line"><a name="l05616"></a><span class="lineno"> 5616</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="l05617"></a><span class="lineno"> 5617</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;    <span class="keywordtype">void</span> RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div><div class="line"><a name="l05620"></a><span class="lineno"> 5620</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l05621"></a><span class="lineno"> 5621</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="l05622"></a><span class="lineno"> 5622</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div><div class="line"><a name="l05624"></a><span class="lineno"> 5624</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l05625"></a><span class="lineno"> 5625</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l05626"></a><span class="lineno"> 5626</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l05627"></a><span class="lineno"> 5627</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="l05628"></a><span class="lineno"> 5628</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05629"></a><span class="lineno"> 5629</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div><div class="line"><a name="l05630"></a><span class="lineno"> 5630</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l05631"></a><span class="lineno"> 5631</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l05632"></a><span class="lineno"> 5632</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l05633"></a><span class="lineno"> 5633</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="l05634"></a><span class="lineno"> 5634</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05635"></a><span class="lineno"> 5635</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div><div class="line"><a name="l05636"></a><span class="lineno"> 5636</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;    <span class="keywordtype">void</span> RecordResizeAllocation(</div><div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;        uint32_t frameIndex,</div><div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;        VkDeviceSize newSize);</div><div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;    <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div><div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l05643"></a><span class="lineno"> 5643</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l05644"></a><span class="lineno"> 5644</span>&#160;    <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div><div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;    <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div><div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;    <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div><div class="line"><a name="l05649"></a><span class="lineno"> 5649</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05650"></a><span class="lineno"> 5650</span>&#160;    <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div><div class="line"><a name="l05651"></a><span class="lineno"> 5651</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l05652"></a><span class="lineno"> 5652</span>&#160;    <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div><div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;    <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div><div class="line"><a name="l05655"></a><span class="lineno"> 5655</span>&#160;        <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div><div class="line"><a name="l05656"></a><span class="lineno"> 5656</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160;    <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div><div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;        <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div><div class="line"><a name="l05660"></a><span class="lineno"> 5660</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l05661"></a><span class="lineno"> 5661</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;    <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div><div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;    <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div><div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160;    <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div><div class="line"><a name="l05667"></a><span class="lineno"> 5667</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05668"></a><span class="lineno"> 5668</span>&#160;    <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div><div class="line"><a name="l05669"></a><span class="lineno"> 5669</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05670"></a><span class="lineno"> 5670</span>&#160;    <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div><div class="line"><a name="l05671"></a><span class="lineno"> 5671</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</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="keyword">private</span>:</div><div class="line"><a name="l05674"></a><span class="lineno"> 5674</span>&#160;    <span class="keyword">struct </span>CallParams</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;        uint32_t threadId;</div><div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160;        <span class="keywordtype">double</span> time;</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="keyword">class </span>UserDataString</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;    <span class="keyword">public</span>:</div><div class="line"><a name="l05683"></a><span class="lineno"> 5683</span>&#160;        UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l05684"></a><span class="lineno"> 5684</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* GetString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Str; }</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="keyword">private</span>:</div><div class="line"><a name="l05687"></a><span class="lineno"> 5687</span>&#160;        <span class="keywordtype">char</span> m_PtrStr[17];</div><div class="line"><a name="l05688"></a><span class="lineno"> 5688</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</div><div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160;    };</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;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l05692"></a><span class="lineno"> 5692</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div><div class="line"><a name="l05693"></a><span class="lineno"> 5693</span>&#160;    FILE* m_File;</div><div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;    VMA_MUTEX m_FileMutex;</div><div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;    int64_t m_Freq;</div><div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;    int64_t m_StartCounter;</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;    <span class="keywordtype">void</span> GetBasicParams(CallParams&amp; outParams);</div><div class="line"><a name="l05699"></a><span class="lineno"> 5699</span>&#160;    <span class="keywordtype">void</span> Flush();</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;</div><div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></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;<span class="comment">// Main allocator object.</span></div><div class="line"><a name="l05705"></a><span class="lineno"> 5705</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</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;    VMA_CLASS_NO_COPY(VmaAllocator_T)</div><div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation;</div><div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;    VkDevice m_hDevice;</div><div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div><div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div><div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</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="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="l05717"></a><span class="lineno"> 5717</span>&#160;    VkDeviceSize m_HeapSizeLimit[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;    VMA_MUTEX m_HeapSizeLimitMutex;</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;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div><div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</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;    <span class="comment">// Default pools.</span></div><div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</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;    <span class="comment">// Each vector is sorted by memory (handle value).</span></div><div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div><div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;    VMA_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;</div><div class="line"><a name="l05731"></a><span class="lineno"> 5731</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="l05732"></a><span class="lineno"> 5732</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div><div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160;    ~VmaAllocator_T();</div><div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;</div><div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div><div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</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;    <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="l05740"></a><span class="lineno"> 5740</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</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;</div><div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div><div class="line"><a name="l05745"></a><span class="lineno"> 5745</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05746"></a><span class="lineno"> 5746</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;            static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div><div class="line"><a name="l05748"></a><span class="lineno"> 5748</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</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;</div><div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div><div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</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;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div><div class="line"><a name="l05757"></a><span class="lineno"> 5757</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</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;    <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div><div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;    <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;        <span class="keywordflow">return</span> (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==</div><div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160;    }</div><div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;    <span class="comment">// Minimum alignment for all allocations in specific memory type.</span></div><div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l05767"></a><span class="lineno"> 5767</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05768"></a><span class="lineno"> 5768</span>&#160;        <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div><div class="line"><a name="l05769"></a><span class="lineno"> 5769</span>&#160;            VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div><div class="line"><a name="l05770"></a><span class="lineno"> 5770</span>&#160;            (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</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;</div><div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;    <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div><div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;        <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</div><div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;    }</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;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;    VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div><div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;</div><div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div><div class="line"><a name="l05783"></a><span class="lineno"> 5783</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l05784"></a><span class="lineno"> 5784</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l05786"></a><span class="lineno"> 5786</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l05787"></a><span class="lineno"> 5787</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div><div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160;        VkImage hImage,</div><div class="line"><a name="l05789"></a><span class="lineno"> 5789</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l05790"></a><span class="lineno"> 5790</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</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;    <span class="comment">// Main allocation function.</span></div><div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;    VkResult AllocateMemory(</div><div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l05798"></a><span class="lineno"> 5798</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l05799"></a><span class="lineno"> 5799</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l05800"></a><span class="lineno"> 5800</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="l05801"></a><span class="lineno"> 5801</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05802"></a><span class="lineno"> 5802</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;</div><div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;    <span class="comment">// Main deallocation function.</span></div><div class="line"><a name="l05805"></a><span class="lineno"> 5805</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="l05806"></a><span class="lineno"> 5806</span>&#160;</div><div class="line"><a name="l05807"></a><span class="lineno"> 5807</span>&#160;    VkResult ResizeAllocation(</div><div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div><div class="line"><a name="l05809"></a><span class="lineno"> 5809</span>&#160;        VkDeviceSize newSize);</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> CalculateStats(<a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;<span class="preprocessor">#endif</span></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;    VkResult Defragment(</div><div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l05820"></a><span class="lineno"> 5820</span>&#160;        VkBool32* pAllocationsChanged,</div><div class="line"><a name="l05821"></a><span class="lineno"> 5821</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="l05822"></a><span class="lineno"> 5822</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</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;    <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="l05825"></a><span class="lineno"> 5825</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="l05826"></a><span class="lineno"> 5826</span>&#160;</div><div class="line"><a name="l05827"></a><span class="lineno"> 5827</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="l05828"></a><span class="lineno"> 5828</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="l05829"></a><span class="lineno"> 5829</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="l05830"></a><span class="lineno"> 5830</span>&#160;</div><div class="line"><a name="l05831"></a><span class="lineno"> 5831</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div><div class="line"><a name="l05832"></a><span class="lineno"> 5832</span>&#160;    uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</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="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;    VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div><div class="line"><a name="l05838"></a><span class="lineno"> 5838</span>&#160;    VkResult CheckCorruption(uint32_t memoryTypeBits);</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;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;</div><div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div><div class="line"><a name="l05843"></a><span class="lineno"> 5843</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</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;    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="l05846"></a><span class="lineno"> 5846</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="l05847"></a><span class="lineno"> 5847</span>&#160;</div><div class="line"><a name="l05848"></a><span class="lineno"> 5848</span>&#160;    VkResult BindBufferMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkBuffer hBuffer);</div><div class="line"><a name="l05849"></a><span class="lineno"> 5849</span>&#160;    VkResult BindImageMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkImage hImage);</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;    <span class="keywordtype">void</span> FlushOrInvalidateAllocation(</div><div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;        VMA_CACHE_OPERATION op);</div><div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>&#160;</div><div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>&#160;    <span class="keywordtype">void</span> FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern);</div><div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;</div><div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</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;    VkPhysicalDevice m_PhysicalDevice;</div><div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div><div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;    </div><div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;    VMA_MUTEX m_PoolsMutex;</div><div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div><div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div><div class="line"><a name="l05867"></a><span class="lineno"> 5867</span>&#160;    uint32_t m_NextPoolId;</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;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</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;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l05872"></a><span class="lineno"> 5872</span>&#160;    VmaRecorder* m_pRecorder;</div><div class="line"><a name="l05873"></a><span class="lineno"> 5873</span>&#160;<span class="preprocessor">#endif</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;    <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="l05876"></a><span class="lineno"> 5876</span>&#160;</div><div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</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;    VkResult AllocateMemoryOfType(</div><div class="line"><a name="l05880"></a><span class="lineno"> 5880</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l05885"></a><span class="lineno"> 5885</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="l05886"></a><span class="lineno"> 5886</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l05887"></a><span class="lineno"> 5887</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05888"></a><span class="lineno"> 5888</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l05889"></a><span class="lineno"> 5889</span>&#160;</div><div class="line"><a name="l05890"></a><span class="lineno"> 5890</span>&#160;    <span class="comment">// Allocates and registers new VkDeviceMemory specifically for single allocation.</span></div><div class="line"><a name="l05891"></a><span class="lineno"> 5891</span>&#160;    VkResult AllocateDedicatedMemory(</div><div class="line"><a name="l05892"></a><span class="lineno"> 5892</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05893"></a><span class="lineno"> 5893</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;        <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l05896"></a><span class="lineno"> 5896</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l05897"></a><span class="lineno"> 5897</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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;    <span class="comment">// Tries to free pMemory as Dedicated Memory. Returns true if found and freed.</span></div><div class="line"><a name="l05903"></a><span class="lineno"> 5903</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="l05904"></a><span class="lineno"> 5904</span>&#160;};</div><div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;</div><div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</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;<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="l05910"></a><span class="lineno"> 5910</span>&#160;{</div><div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</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;</div><div class="line"><a name="l05914"></a><span class="lineno"> 5914</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="l05915"></a><span class="lineno"> 5915</span>&#160;{</div><div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05920"></a><span class="lineno"> 5920</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="l05921"></a><span class="lineno"> 5921</span>&#160;{</div><div class="line"><a name="l05922"></a><span class="lineno"> 5922</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="l05923"></a><span class="lineno"> 5923</span>&#160;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05926"></a><span class="lineno"> 5926</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="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> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T) * count, VMA_ALIGN_OF(T));</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05932"></a><span class="lineno"> 5932</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="l05933"></a><span class="lineno"> 5933</span>&#160;{</div><div class="line"><a name="l05934"></a><span class="lineno"> 5934</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;    {</div><div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160;        ptr-&gt;~T();</div><div class="line"><a name="l05937"></a><span class="lineno"> 5937</span>&#160;        VmaFree(hAllocator, ptr);</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;}</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05942"></a><span class="lineno"> 5942</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="l05943"></a><span class="lineno"> 5943</span>&#160;{</div><div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</div><div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;    {</div><div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l05948"></a><span class="lineno"> 5948</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l05949"></a><span class="lineno"> 5949</span>&#160;    }</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="l05953"></a><span class="lineno"> 5953</span>&#160;<span class="comment">// VmaStringBuilder</span></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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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;<span class="keyword">class </span>VmaStringBuilder</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="keyword">public</span>:</div><div class="line"><a name="l05960"></a><span class="lineno"> 5960</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="l05961"></a><span class="lineno"> 5961</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="l05962"></a><span class="lineno"> 5962</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="l05963"></a><span class="lineno"> 5963</span>&#160;</div><div class="line"><a name="l05964"></a><span class="lineno"> 5964</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="l05965"></a><span class="lineno"> 5965</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="l05966"></a><span class="lineno"> 5966</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div><div class="line"><a name="l05967"></a><span class="lineno"> 5967</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div><div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div><div class="line"><a name="l05969"></a><span class="lineno"> 5969</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="l05970"></a><span class="lineno"> 5970</span>&#160;</div><div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05972"></a><span class="lineno"> 5972</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</div><div class="line"><a name="l05973"></a><span class="lineno"> 5973</span>&#160;};</div><div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160;</div><div class="line"><a name="l05975"></a><span class="lineno"> 5975</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="l05976"></a><span class="lineno"> 5976</span>&#160;{</div><div class="line"><a name="l05977"></a><span class="lineno"> 5977</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l05978"></a><span class="lineno"> 5978</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</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="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div><div class="line"><a name="l05981"></a><span class="lineno"> 5981</span>&#160;        m_Data.resize(oldCount + strLen);</div><div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</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="l05986"></a><span class="lineno"> 5986</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</div><div class="line"><a name="l05987"></a><span class="lineno"> 5987</span>&#160;{</div><div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;    <span class="keywordtype">char</span> buf[11];</div><div class="line"><a name="l05989"></a><span class="lineno"> 5989</span>&#160;    VmaUint32ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l05990"></a><span class="lineno"> 5990</span>&#160;    Add(buf);</div><div class="line"><a name="l05991"></a><span class="lineno"> 5991</span>&#160;}</div><div class="line"><a name="l05992"></a><span class="lineno"> 5992</span>&#160;</div><div class="line"><a name="l05993"></a><span class="lineno"> 5993</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</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;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l05996"></a><span class="lineno"> 5996</span>&#160;    VmaUint64ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;    Add(buf);</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;</div><div class="line"><a name="l06000"></a><span class="lineno"> 6000</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="l06001"></a><span class="lineno"> 6001</span>&#160;{</div><div class="line"><a name="l06002"></a><span class="lineno"> 6002</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l06003"></a><span class="lineno"> 6003</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div><div class="line"><a name="l06004"></a><span class="lineno"> 6004</span>&#160;    Add(buf);</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;</div><div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06008"></a><span class="lineno"> 6008</span>&#160;</div><div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;<span class="comment">// VmaJsonWriter</span></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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160;</div><div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div><div class="line"><a name="l06015"></a><span class="lineno"> 6015</span>&#160;{</div><div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160;    VMA_CLASS_NO_COPY(VmaJsonWriter)</div><div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div><div class="line"><a name="l06019"></a><span class="lineno"> 6019</span>&#160;    ~VmaJsonWriter();</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;    <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160;    <span class="keywordtype">void</span> EndObject();</div><div class="line"><a name="l06023"></a><span class="lineno"> 6023</span>&#160;    </div><div class="line"><a name="l06024"></a><span class="lineno"> 6024</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="l06025"></a><span class="lineno"> 6025</span>&#160;    <span class="keywordtype">void</span> EndArray();</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;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l06028"></a><span class="lineno"> 6028</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="l06029"></a><span class="lineno"> 6029</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="l06030"></a><span class="lineno"> 6030</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div><div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div><div class="line"><a name="l06032"></a><span class="lineno"> 6032</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="l06033"></a><span class="lineno"> 6033</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="l06034"></a><span class="lineno"> 6034</span>&#160;    </div><div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div><div class="line"><a name="l06036"></a><span class="lineno"> 6036</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div><div class="line"><a name="l06037"></a><span class="lineno"> 6037</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div><div class="line"><a name="l06038"></a><span class="lineno"> 6038</span>&#160;    <span class="keywordtype">void</span> WriteNull();</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">private</span>:</div><div class="line"><a name="l06041"></a><span class="lineno"> 6041</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="l06042"></a><span class="lineno"> 6042</span>&#160;</div><div class="line"><a name="l06043"></a><span class="lineno"> 6043</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</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;        COLLECTION_TYPE_OBJECT,</div><div class="line"><a name="l06046"></a><span class="lineno"> 6046</span>&#160;        COLLECTION_TYPE_ARRAY,</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="keyword">struct </span>StackItem</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;        COLLECTION_TYPE type;</div><div class="line"><a name="l06051"></a><span class="lineno"> 6051</span>&#160;        uint32_t valueCount;</div><div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</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;</div><div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;    VmaStringBuilder&amp; m_SB;</div><div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div><div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</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;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div><div class="line"><a name="l06060"></a><span class="lineno"> 6060</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="l06061"></a><span class="lineno"> 6061</span>&#160;};</div><div class="line"><a name="l06062"></a><span class="lineno"> 6062</span>&#160;</div><div class="line"><a name="l06063"></a><span class="lineno"> 6063</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="l06064"></a><span class="lineno"> 6064</span>&#160;</div><div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div><div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;    m_SB(sb),</div><div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div><div class="line"><a name="l06068"></a><span class="lineno"> 6068</span>&#160;    m_InsideString(false)</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;}</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;VmaJsonWriter::~VmaJsonWriter()</div><div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;{</div><div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;    VMA_ASSERT(m_Stack.empty());</div><div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;}</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;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;{</div><div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;    VMA_ASSERT(!m_InsideString);</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;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06083"></a><span class="lineno"> 6083</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</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;    StackItem item;</div><div class="line"><a name="l06086"></a><span class="lineno"> 6086</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div><div class="line"><a name="l06087"></a><span class="lineno"> 6087</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l06089"></a><span class="lineno"> 6089</span>&#160;    m_Stack.push_back(item);</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="keywordtype">void</span> VmaJsonWriter::EndObject()</div><div class="line"><a name="l06093"></a><span class="lineno"> 6093</span>&#160;{</div><div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06095"></a><span class="lineno"> 6095</span>&#160;</div><div class="line"><a name="l06096"></a><span class="lineno"> 6096</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l06097"></a><span class="lineno"> 6097</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</div><div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;</div><div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div><div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;}</div><div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>&#160;</div><div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l06104"></a><span class="lineno"> 6104</span>&#160;{</div><div class="line"><a name="l06105"></a><span class="lineno"> 6105</span>&#160;    VMA_ASSERT(!m_InsideString);</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;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</span>);</div><div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;</div><div class="line"><a name="l06110"></a><span class="lineno"> 6110</span>&#160;    StackItem item;</div><div class="line"><a name="l06111"></a><span class="lineno"> 6111</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div><div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;    m_Stack.push_back(item);</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;</div><div class="line"><a name="l06117"></a><span class="lineno"> 6117</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</div><div class="line"><a name="l06118"></a><span class="lineno"> 6118</span>&#160;{</div><div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>&#160;</div><div class="line"><a name="l06121"></a><span class="lineno"> 6121</span>&#160;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l06122"></a><span class="lineno"> 6122</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div><div class="line"><a name="l06123"></a><span class="lineno"> 6123</span>&#160;</div><div class="line"><a name="l06124"></a><span class="lineno"> 6124</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div><div class="line"><a name="l06125"></a><span class="lineno"> 6125</span>&#160;    m_Stack.pop_back();</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;</div><div class="line"><a name="l06128"></a><span class="lineno"> 6128</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="l06129"></a><span class="lineno"> 6129</span>&#160;{</div><div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;    BeginString(pStr);</div><div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;    EndString();</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;</div><div class="line"><a name="l06134"></a><span class="lineno"> 6134</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="l06135"></a><span class="lineno"> 6135</span>&#160;{</div><div class="line"><a name="l06136"></a><span class="lineno"> 6136</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06137"></a><span class="lineno"> 6137</span>&#160;</div><div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;    BeginValue(<span class="keyword">true</span>);</div><div class="line"><a name="l06139"></a><span class="lineno"> 6139</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l06140"></a><span class="lineno"> 6140</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div><div class="line"><a name="l06141"></a><span class="lineno"> 6141</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="l06142"></a><span class="lineno"> 6142</span>&#160;    {</div><div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;    }</div><div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;}</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;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l06148"></a><span class="lineno"> 6148</span>&#160;{</div><div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;    VMA_ASSERT(m_InsideString);</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;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l06152"></a><span class="lineno"> 6152</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="l06153"></a><span class="lineno"> 6153</span>&#160;    {</div><div class="line"><a name="l06154"></a><span class="lineno"> 6154</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div><div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\\&#39;</span>)</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;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</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="keywordflow">else</span> <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;&quot;&#39;</span>)</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;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</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="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</div><div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;        {</div><div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;            m_SB.Add(ch);</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;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</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="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div><div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div><div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06172"></a><span class="lineno"> 6172</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div><div class="line"><a name="l06173"></a><span class="lineno"> 6173</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div><div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div><div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div><div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div><div class="line"><a name="l06179"></a><span class="lineno"> 6179</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div><div class="line"><a name="l06180"></a><span class="lineno"> 6180</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06181"></a><span class="lineno"> 6181</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div><div class="line"><a name="l06182"></a><span class="lineno"> 6182</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div><div class="line"><a name="l06183"></a><span class="lineno"> 6183</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06184"></a><span class="lineno"> 6184</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div><div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>&#160;        }</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;</div><div class="line"><a name="l06191"></a><span class="lineno"> 6191</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</div><div class="line"><a name="l06192"></a><span class="lineno"> 6192</span>&#160;{</div><div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;    m_SB.AddNumber(n);</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;</div><div class="line"><a name="l06197"></a><span class="lineno"> 6197</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint64_t n)</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;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l06200"></a><span class="lineno"> 6200</span>&#160;    m_SB.AddNumber(n);</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="keywordtype">void</span> VmaJsonWriter::ContinueString_Pointer(<span class="keyword">const</span> <span class="keywordtype">void</span>* ptr)</div><div class="line"><a name="l06204"></a><span class="lineno"> 6204</span>&#160;{</div><div class="line"><a name="l06205"></a><span class="lineno"> 6205</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;    m_SB.AddPointer(ptr);</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;<span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</div><div class="line"><a name="l06210"></a><span class="lineno"> 6210</span>&#160;{</div><div class="line"><a name="l06211"></a><span class="lineno"> 6211</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l06212"></a><span class="lineno"> 6212</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="l06213"></a><span class="lineno"> 6213</span>&#160;    {</div><div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;        ContinueString(pStr);</div><div class="line"><a name="l06215"></a><span class="lineno"> 6215</span>&#160;    }</div><div class="line"><a name="l06216"></a><span class="lineno"> 6216</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;    m_InsideString = <span class="keyword">false</span>;</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;</div><div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div><div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;{</div><div class="line"><a name="l06222"></a><span class="lineno"> 6222</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06223"></a><span class="lineno"> 6223</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;    m_SB.AddNumber(n);</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="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;}</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="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div><div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;{</div><div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06238"></a><span class="lineno"> 6238</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="l06239"></a><span class="lineno"> 6239</span>&#160;}</div><div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;</div><div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</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;</div><div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</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;    <span class="keywordflow">if</span>(!m_Stack.empty())</div><div class="line"><a name="l06251"></a><span class="lineno"> 6251</span>&#160;    {</div><div class="line"><a name="l06252"></a><span class="lineno"> 6252</span>&#160;        StackItem&amp; currItem = m_Stack.back();</div><div class="line"><a name="l06253"></a><span class="lineno"> 6253</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;            currItem.valueCount % 2 == 0)</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(isString);</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="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l06260"></a><span class="lineno"> 6260</span>&#160;            currItem.valueCount % 2 != 0)</div><div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;        {</div><div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</div><div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;        }</div><div class="line"><a name="l06264"></a><span class="lineno"> 6264</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</div><div class="line"><a name="l06265"></a><span class="lineno"> 6265</span>&#160;        {</div><div class="line"><a name="l06266"></a><span class="lineno"> 6266</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div><div class="line"><a name="l06267"></a><span class="lineno"> 6267</span>&#160;            WriteIndent();</div><div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;        }</div><div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;        {</div><div class="line"><a name="l06271"></a><span class="lineno"> 6271</span>&#160;            WriteIndent();</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;        ++currItem.valueCount;</div><div class="line"><a name="l06274"></a><span class="lineno"> 6274</span>&#160;    }</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;</div><div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</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;    <span class="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</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_SB.AddNewLine();</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;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div><div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</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;            --count;</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;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; count; ++i)</div><div class="line"><a name="l06289"></a><span class="lineno"> 6289</span>&#160;        {</div><div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160;            m_SB.Add(INDENT);</div><div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;        }</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="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06296"></a><span class="lineno"> 6296</span>&#160;</div><div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;</div><div class="line"><a name="l06299"></a><span class="lineno"> 6299</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="l06300"></a><span class="lineno"> 6300</span>&#160;{</div><div class="line"><a name="l06301"></a><span class="lineno"> 6301</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</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;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</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;        FreeUserDataString(hAllocator);</div><div class="line"><a name="l06306"></a><span class="lineno"> 6306</span>&#160;</div><div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</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;            <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="l06310"></a><span class="lineno"> 6310</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> newStrLen = strlen(newStrSrc);</div><div class="line"><a name="l06311"></a><span class="lineno"> 6311</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="l06312"></a><span class="lineno"> 6312</span>&#160;            memcpy(newStrDst, newStrSrc, newStrLen + 1);</div><div class="line"><a name="l06313"></a><span class="lineno"> 6313</span>&#160;            m_pUserData = newStrDst;</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="keywordflow">else</span></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;        m_pUserData = pUserData;</div><div class="line"><a name="l06319"></a><span class="lineno"> 6319</span>&#160;    }</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;</div><div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div><div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06324"></a><span class="lineno"> 6324</span>&#160;    VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l06325"></a><span class="lineno"> 6325</span>&#160;    VkDeviceSize offset)</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;    VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l06328"></a><span class="lineno"> 6328</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l06329"></a><span class="lineno"> 6329</span>&#160;</div><div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div><div class="line"><a name="l06331"></a><span class="lineno"> 6331</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div><div class="line"><a name="l06332"></a><span class="lineno"> 6332</span>&#160;    {</div><div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div><div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div><div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>&#160;            ++mapRefCount;</div><div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div><div class="line"><a name="l06337"></a><span class="lineno"> 6337</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</div><div class="line"><a name="l06338"></a><span class="lineno"> 6338</span>&#160;    }</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;    m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l06341"></a><span class="lineno"> 6341</span>&#160;    m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l06342"></a><span class="lineno"> 6342</span>&#160;}</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="keywordtype">void</span> VmaAllocation_T::ChangeSize(VkDeviceSize newSize)</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;    VMA_ASSERT(newSize &gt; 0);</div><div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160;    m_Size = newSize;</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;</div><div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div><div class="line"><a name="l06351"></a><span class="lineno"> 6351</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06352"></a><span class="lineno"> 6352</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06355"></a><span class="lineno"> 6355</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div><div class="line"><a name="l06356"></a><span class="lineno"> 6356</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06357"></a><span class="lineno"> 6357</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l06358"></a><span class="lineno"> 6358</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06360"></a><span class="lineno"> 6360</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;    }</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;</div><div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div><div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06369"></a><span class="lineno"> 6369</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div><div class="line"><a name="l06370"></a><span class="lineno"> 6370</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06371"></a><span class="lineno"> 6371</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div><div class="line"><a name="l06372"></a><span class="lineno"> 6372</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06373"></a><span class="lineno"> 6373</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06374"></a><span class="lineno"> 6374</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</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;}</div><div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;</div><div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;uint32_t VmaAllocation_T::GetMemoryTypeIndex()<span class="keyword"> const</span></div><div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_MemoryTypeIndex;</div><div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;        <span class="keywordflow">return</span> UINT32_MAX;</div><div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;    }</div><div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;}</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;<span class="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div><div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;    {</div><div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</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="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div><div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div><div class="line"><a name="l06401"></a><span class="lineno"> 6401</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</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="keywordflow">else</span></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;            <span class="keywordflow">return</span> VMA_NULL;</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="keywordflow">break</span>;</div><div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div><div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</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;</div><div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div><div class="line"><a name="l06418"></a><span class="lineno"> 6418</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06419"></a><span class="lineno"> 6419</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;    {</div><div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div><div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;    }</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;</div><div class="line"><a name="l06431"></a><span class="lineno"> 6431</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="l06432"></a><span class="lineno"> 6432</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06433"></a><span class="lineno"> 6433</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l06434"></a><span class="lineno"> 6434</span>&#160;    <span class="keywordflow">return</span> m_BlockAllocation.m_hPool;</div><div class="line"><a name="l06435"></a><span class="lineno"> 6435</span>&#160;}</div><div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;</div><div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160;{</div><div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;    VMA_ASSERT(CanBecomeLost());</div><div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;</div><div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div><div class="line"><a name="l06446"></a><span class="lineno"> 6446</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l06447"></a><span class="lineno"> 6447</span>&#160;    {</div><div class="line"><a name="l06448"></a><span class="lineno"> 6448</span>&#160;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</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;            VMA_ASSERT(0);</div><div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</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="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;        }</div><div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;        <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></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;            <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;            {</div><div class="line"><a name="l06461"></a><span class="lineno"> 6461</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="l06462"></a><span class="lineno"> 6462</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>&#160;            }</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;</div><div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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">// Correspond to values of enum VmaSuballocationType.</span></div><div class="line"><a name="l06472"></a><span class="lineno"> 6472</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="l06473"></a><span class="lineno"> 6473</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div><div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div><div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div><div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div><div class="line"><a name="l06477"></a><span class="lineno"> 6477</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div><div class="line"><a name="l06478"></a><span class="lineno"> 6478</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</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">void</span> VmaAllocation_T::PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json)<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;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</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;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l06487"></a><span class="lineno"> 6487</span>&#160;    json.WriteNumber(m_Size);</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">if</span>(m_pUserData != VMA_NULL)</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;        json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l06492"></a><span class="lineno"> 6492</span>&#160;        <span class="keywordflow">if</span>(IsUserDataString())</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;            json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</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">else</span></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;            json.BeginString();</div><div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;            json.ContinueString_Pointer(m_pUserData);</div><div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;            json.EndString();</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;    }</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;    json.WriteString(<span class="stringliteral">&quot;CreationFrameIndex&quot;</span>);</div><div class="line"><a name="l06505"></a><span class="lineno"> 6505</span>&#160;    json.WriteNumber(m_CreationFrameIndex);</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;    json.WriteString(<span class="stringliteral">&quot;LastUseFrameIndex&quot;</span>);</div><div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;    json.WriteNumber(GetLastUseFrameIndex());</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="keywordflow">if</span>(m_BufferImageUsage != 0)</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;        json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div><div class="line"><a name="l06513"></a><span class="lineno"> 6513</span>&#160;        json.WriteNumber(m_BufferImageUsage);</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;}</div><div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;</div><div class="line"><a name="l06517"></a><span class="lineno"> 6517</span>&#160;<span class="preprocessor">#endif</span></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;<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="l06520"></a><span class="lineno"> 6520</span>&#160;{</div><div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;    VMA_ASSERT(IsUserDataString());</div><div class="line"><a name="l06522"></a><span class="lineno"> 6522</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l06523"></a><span class="lineno"> 6523</span>&#160;    {</div><div class="line"><a name="l06524"></a><span class="lineno"> 6524</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="l06525"></a><span class="lineno"> 6525</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldStrLen = strlen(oldStr);</div><div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;        vma_delete_array(hAllocator, oldStr, oldStrLen + 1);</div><div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;        m_pUserData = VMA_NULL;</div><div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;    }</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;</div><div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</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;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>&#160;    {</div><div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>&#160;        ++m_MapCount;</div><div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;    }</div><div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;    {</div><div class="line"><a name="l06541"></a><span class="lineno"> 6541</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="l06542"></a><span class="lineno"> 6542</span>&#160;    }</div><div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;}</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;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</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;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l06548"></a><span class="lineno"> 6548</span>&#160;</div><div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</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;        --m_MapCount;</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="keywordflow">else</span></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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</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;}</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;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="l06560"></a><span class="lineno"> 6560</span>&#160;{</div><div class="line"><a name="l06561"></a><span class="lineno"> 6561</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</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;    <span class="keywordflow">if</span>(m_MapCount != 0)</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</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;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div><div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;            ++m_MapCount;</div><div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;        }</div><div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>&#160;        <span class="keywordflow">else</span></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;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Dedicated allocation mapped too many times simultaneously.&quot;</span>);</div><div class="line"><a name="l06575"></a><span class="lineno"> 6575</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l06576"></a><span class="lineno"> 6576</span>&#160;        }</div><div class="line"><a name="l06577"></a><span class="lineno"> 6577</span>&#160;    }</div><div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>&#160;    {</div><div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l06581"></a><span class="lineno"> 6581</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06582"></a><span class="lineno"> 6582</span>&#160;            m_DedicatedAllocation.m_hMemory,</div><div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l06586"></a><span class="lineno"> 6586</span>&#160;            ppData);</div><div class="line"><a name="l06587"></a><span class="lineno"> 6587</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</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;            m_DedicatedAllocation.m_pMappedData = *ppData;</div><div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;            m_MapCount = 1;</div><div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;        }</div><div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160;        <span class="keywordflow">return</span> result;</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;</div><div class="line"><a name="l06596"></a><span class="lineno"> 6596</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="l06597"></a><span class="lineno"> 6597</span>&#160;{</div><div class="line"><a name="l06598"></a><span class="lineno"> 6598</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l06599"></a><span class="lineno"> 6599</span>&#160;</div><div class="line"><a name="l06600"></a><span class="lineno"> 6600</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l06601"></a><span class="lineno"> 6601</span>&#160;    {</div><div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;        --m_MapCount;</div><div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</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;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div><div class="line"><a name="l06606"></a><span class="lineno"> 6606</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div><div class="line"><a name="l06607"></a><span class="lineno"> 6607</span>&#160;                hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06608"></a><span class="lineno"> 6608</span>&#160;                m_DedicatedAllocation.m_hMemory);</div><div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;        }</div><div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;    }</div><div class="line"><a name="l06611"></a><span class="lineno"> 6611</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06612"></a><span class="lineno"> 6612</span>&#160;    {</div><div class="line"><a name="l06613"></a><span class="lineno"> 6613</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="l06614"></a><span class="lineno"> 6614</span>&#160;    }</div><div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;}</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="preprocessor">#if VMA_STATS_STRING_ENABLED</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;<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="l06620"></a><span class="lineno"> 6620</span>&#160;{</div><div class="line"><a name="l06621"></a><span class="lineno"> 6621</span>&#160;    json.BeginObject();</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;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</div><div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;</div><div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div><div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</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">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> &gt; 1)</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;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div><div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div><div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;        json.EndObject();</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="keywordflow">if</span>(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> &gt; 1)</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;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div><div class="line"><a name="l06654"></a><span class="lineno"> 6654</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06655"></a><span class="lineno"> 6655</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l06656"></a><span class="lineno"> 6656</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l06657"></a><span class="lineno"> 6657</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div><div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l06661"></a><span class="lineno"> 6661</span>&#160;        json.EndObject();</div><div class="line"><a name="l06662"></a><span class="lineno"> 6662</span>&#160;    }</div><div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;</div><div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;    json.EndObject();</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;</div><div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;</div><div class="line"><a name="l06669"></a><span class="lineno"> 6669</span>&#160;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div><div class="line"><a name="l06670"></a><span class="lineno"> 6670</span>&#160;{</div><div class="line"><a name="l06671"></a><span class="lineno"> 6671</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l06672"></a><span class="lineno"> 6672</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l06673"></a><span class="lineno"> 6673</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div><div class="line"><a name="l06674"></a><span class="lineno"> 6674</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06675"></a><span class="lineno"> 6675</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</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="keywordtype">bool</span> operator()(</div><div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l06679"></a><span class="lineno"> 6679</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div><div class="line"><a name="l06680"></a><span class="lineno"> 6680</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</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;};</div><div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;</div><div class="line"><a name="l06685"></a><span class="lineno"> 6685</span>&#160;</div><div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;<span class="comment">// class VmaBlockMetadata</span></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;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;    m_Size(0),</div><div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;    m_pAllocationCallbacks(hAllocator-&gt;GetAllocationCallbacks())</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;}</div><div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>&#160;</div><div class="line"><a name="l06695"></a><span class="lineno"> 6695</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160;    VkDeviceSize unusedBytes,</div><div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;    <span class="keywordtype">size_t</span> unusedRangeCount)<span class="keyword"> const</span></div><div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;    json.BeginObject();</div><div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;</div><div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div><div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;    json.WriteNumber(GetSize());</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;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l06708"></a><span class="lineno"> 6708</span>&#160;    json.WriteNumber(unusedBytes);</div><div class="line"><a name="l06709"></a><span class="lineno"> 6709</span>&#160;</div><div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;    json.WriteNumber((uint64_t)allocationCount);</div><div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;</div><div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;    json.WriteNumber((uint64_t)unusedRangeCount);</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;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div><div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;    json.BeginArray();</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;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l06721"></a><span class="lineno"> 6721</span>&#160;    VkDeviceSize offset,</div><div class="line"><a name="l06722"></a><span class="lineno"> 6722</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l06723"></a><span class="lineno"> 6723</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</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;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>&#160;    json.WriteNumber(offset);</div><div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160;</div><div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;    hAllocation-&gt;PrintParameters(json);</div><div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160;</div><div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;    json.EndObject();</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="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;    VkDeviceSize offset,</div><div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;    VkDeviceSize size)<span class="keyword"> const</span></div><div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160;        </div><div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l06741"></a><span class="lineno"> 6741</span>&#160;    json.WriteNumber(offset);</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;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l06744"></a><span class="lineno"> 6744</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</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;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;    json.WriteNumber(size);</div><div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;</div><div class="line"><a name="l06749"></a><span class="lineno"> 6749</span>&#160;    json.EndObject();</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> VmaBlockMetadata::PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l06753"></a><span class="lineno"> 6753</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06754"></a><span class="lineno"> 6754</span>&#160;    json.EndArray();</div><div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    json.EndObject();</div><div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;}</div><div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>&#160;</div><div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;</div><div class="line"><a name="l06761"></a><span class="lineno"> 6761</span>&#160;<span class="comment">// class VmaBlockMetadata_Generic</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;VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160;    m_FreeCount(0),</div><div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;{</div><div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160;}</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;VmaBlockMetadata_Generic::~VmaBlockMetadata_Generic()</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;}</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="keywordtype">void</span> VmaBlockMetadata_Generic::Init(VkDeviceSize size)</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;    VmaBlockMetadata::Init(size);</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;    m_FreeCount = 1;</div><div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;    m_SumFreeSize = size;</div><div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;</div><div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;    VmaSuballocation suballoc = {};</div><div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;    suballoc.offset = 0;</div><div class="line"><a name="l06785"></a><span class="lineno"> 6785</span>&#160;    suballoc.size = size;</div><div class="line"><a name="l06786"></a><span class="lineno"> 6786</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06787"></a><span class="lineno"> 6787</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</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;    VMA_ASSERT(size &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div><div class="line"><a name="l06790"></a><span class="lineno"> 6790</span>&#160;    m_Suballocations.push_back(suballoc);</div><div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div><div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;    --suballocItem;</div><div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</div><div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;}</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="keywordtype">bool</span> VmaBlockMetadata_Generic::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l06797"></a><span class="lineno"> 6797</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;    VMA_VALIDATE(!m_Suballocations.empty());</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;    <span class="comment">// Expected offset of new suballocation as calculated from previous ones.</span></div><div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;    VkDeviceSize calculatedOffset = 0;</div><div class="line"><a name="l06802"></a><span class="lineno"> 6802</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l06803"></a><span class="lineno"> 6803</span>&#160;    uint32_t calculatedFreeCount = 0;</div><div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div><div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div><div class="line"><a name="l06807"></a><span class="lineno"> 6807</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div><div class="line"><a name="l06808"></a><span class="lineno"> 6808</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div><div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;    <span class="comment">// True if previous visited suballocation was free.</span></div><div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</div><div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;</div><div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l06813"></a><span class="lineno"> 6813</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l06814"></a><span class="lineno"> 6814</span>&#160;        ++suballocItem)</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;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</div><div class="line"><a name="l06817"></a><span class="lineno"> 6817</span>&#160;        </div><div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>&#160;        <span class="comment">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div><div class="line"><a name="l06819"></a><span class="lineno"> 6819</span>&#160;        VMA_VALIDATE(subAlloc.offset == calculatedOffset);</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="keyword">const</span> <span class="keywordtype">bool</span> currFree = (subAlloc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div><div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;        VMA_VALIDATE(!prevFree || !currFree);</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;        VMA_VALIDATE(currFree == (subAlloc.hAllocation == VK_NULL_HANDLE));</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;        <span class="keywordflow">if</span>(currFree)</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;            calculatedSumFreeSize += subAlloc.size;</div><div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>&#160;            ++calculatedFreeCount;</div><div class="line"><a name="l06831"></a><span class="lineno"> 6831</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;                ++freeSuballocationsToRegister;</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;</div><div class="line"><a name="l06836"></a><span class="lineno"> 6836</span>&#160;            <span class="comment">// Margin required between allocations - every free space must be at least that large.</span></div><div class="line"><a name="l06837"></a><span class="lineno"> 6837</span>&#160;            VMA_VALIDATE(subAlloc.size &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;        }</div><div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160;        <span class="keywordflow">else</span></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;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetOffset() == subAlloc.offset);</div><div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetSize() == subAlloc.size);</div><div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;</div><div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;            <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div><div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;            VMA_VALIDATE(VMA_DEBUG_MARGIN == 0 || prevFree);</div><div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>&#160;        }</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;        calculatedOffset += subAlloc.size;</div><div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;        prevFree = currFree;</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;</div><div class="line"><a name="l06852"></a><span class="lineno"> 6852</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div><div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;    <span class="comment">// match expected one.</span></div><div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;    VMA_VALIDATE(m_FreeSuballocationsBySize.size() == freeSuballocationsToRegister);</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;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l06857"></a><span class="lineno"> 6857</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="l06858"></a><span class="lineno"> 6858</span>&#160;    {</div><div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</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="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div><div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;        VMA_VALIDATE(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div><div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;        VMA_VALIDATE(suballocItem-&gt;size &gt;= lastSize);</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;        lastSize = suballocItem-&gt;size;</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;</div><div class="line"><a name="l06869"></a><span class="lineno"> 6869</span>&#160;    <span class="comment">// Check if totals match calculacted values.</span></div><div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;    VMA_VALIDATE(ValidateFreeSuballocationList());</div><div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;    VMA_VALIDATE(calculatedOffset == GetSize());</div><div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;    VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);</div><div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;    VMA_VALIDATE(calculatedFreeCount == m_FreeCount);</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">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l06878"></a><span class="lineno"> 6878</span>&#160;VkDeviceSize VmaBlockMetadata_Generic::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l06879"></a><span class="lineno"> 6879</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</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;        <span class="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</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;    <span class="keywordflow">else</span></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">return</span> 0;</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;}</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;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsEmpty()<span class="keyword"> const</span></div><div class="line"><a name="l06891"></a><span class="lineno"> 6891</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06892"></a><span class="lineno"> 6892</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</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="keywordtype">void</span> VmaBlockMetadata_Generic::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="l06896"></a><span class="lineno"> 6896</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06897"></a><span class="lineno"> 6897</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</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;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div><div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</div><div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;    </div><div class="line"><a name="l06903"></a><span class="lineno"> 6903</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div><div class="line"><a name="l06904"></a><span class="lineno"> 6904</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = GetSize() - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06907"></a><span class="lineno"> 6907</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l06908"></a><span class="lineno"> 6908</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>&#160;</div><div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l06912"></a><span class="lineno"> 6912</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l06913"></a><span class="lineno"> 6913</span>&#160;        ++suballocItem)</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="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</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;            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="l06919"></a><span class="lineno"> 6919</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="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">else</span></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;            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="l06924"></a><span class="lineno"> 6924</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="l06925"></a><span class="lineno"> 6925</span>&#160;        }</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;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::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="l06930"></a><span class="lineno"> 6930</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</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;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div><div class="line"><a name="l06934"></a><span class="lineno"> 6934</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div><div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div><div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l06937"></a><span class="lineno"> 6937</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="l06938"></a><span class="lineno"> 6938</span>&#160;}</div><div class="line"><a name="l06939"></a><span class="lineno"> 6939</span>&#160;</div><div class="line"><a name="l06940"></a><span class="lineno"> 6940</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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="keywordtype">void</span> VmaBlockMetadata_Generic::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06944"></a><span class="lineno"> 6944</span>&#160;    PrintDetailedMap_Begin(json,</div><div class="line"><a name="l06945"></a><span class="lineno"> 6945</span>&#160;        m_SumFreeSize, <span class="comment">// unusedBytes</span></div><div class="line"><a name="l06946"></a><span class="lineno"> 6946</span>&#160;        m_Suballocations.size() - (size_t)m_FreeCount, <span class="comment">// allocationCount</span></div><div class="line"><a name="l06947"></a><span class="lineno"> 6947</span>&#160;        m_FreeCount); <span class="comment">// unusedRangeCount</span></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;    <span class="keywordtype">size_t</span> i = 0;</div><div class="line"><a name="l06950"></a><span class="lineno"> 6950</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l06951"></a><span class="lineno"> 6951</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;        ++suballocItem, ++i)</div><div class="line"><a name="l06953"></a><span class="lineno"> 6953</span>&#160;    {</div><div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            PrintDetailedMap_UnusedRange(json, suballocItem-&gt;offset, suballocItem-&gt;size);</div><div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;        }</div><div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;        <span class="keywordflow">else</span></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;            PrintDetailedMap_Allocation(json, suballocItem-&gt;offset, suballocItem-&gt;hAllocation);</div><div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;        }</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;</div><div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160;    PrintDetailedMap_End(json);</div><div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;}</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;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CreateAllocationRequest(</div><div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l06975"></a><span class="lineno"> 6975</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l06976"></a><span class="lineno"> 6976</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l06977"></a><span class="lineno"> 6977</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l06979"></a><span class="lineno"> 6979</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l06982"></a><span class="lineno"> 6982</span>&#160;    VMA_ASSERT(!upperAddress);</div><div class="line"><a name="l06983"></a><span class="lineno"> 6983</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06984"></a><span class="lineno"> 6984</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l06985"></a><span class="lineno"> 6985</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160;</div><div class="line"><a name="l06987"></a><span class="lineno"> 6987</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="l06988"></a><span class="lineno"> 6988</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp;</div><div class="line"><a name="l06989"></a><span class="lineno"> 6989</span>&#160;        m_SumFreeSize &lt; allocSize + 2 * VMA_DEBUG_MARGIN)</div><div class="line"><a name="l06990"></a><span class="lineno"> 6990</span>&#160;    {</div><div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;</div><div class="line"><a name="l06994"></a><span class="lineno"> 6994</span>&#160;    <span class="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div><div class="line"><a name="l06995"></a><span class="lineno"> 6995</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l06996"></a><span class="lineno"> 6996</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</div><div class="line"><a name="l06997"></a><span class="lineno"> 6997</span>&#160;    {</div><div class="line"><a name="l06998"></a><span class="lineno"> 6998</span>&#160;        <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</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">// Find first free suballocation with size not less than allocSize + 2 * VMA_DEBUG_MARGIN.</span></div><div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;                m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div><div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;                allocSize + 2 * VMA_DEBUG_MARGIN,</div><div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;                VmaSuballocationItemSizeLess());</div><div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</div><div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>&#160;            {</div><div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l07010"></a><span class="lineno"> 7010</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07011"></a><span class="lineno"> 7011</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l07012"></a><span class="lineno"> 7012</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l07013"></a><span class="lineno"> 7013</span>&#160;                    allocSize,</div><div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;                    allocAlignment,</div><div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;                    allocType,</div><div class="line"><a name="l07016"></a><span class="lineno"> 7016</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l07017"></a><span class="lineno"> 7017</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l07019"></a><span class="lineno"> 7019</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l07020"></a><span class="lineno"> 7020</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</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;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;                }</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;        <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div><div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;        {</div><div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160;            <span class="comment">// Search staring from biggest suballocations.</span></div><div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</div><div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;            {</div><div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l07037"></a><span class="lineno"> 7037</span>&#160;                    allocSize,</div><div class="line"><a name="l07038"></a><span class="lineno"> 7038</span>&#160;                    allocAlignment,</div><div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;                    allocType,</div><div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l07043"></a><span class="lineno"> 7043</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l07044"></a><span class="lineno"> 7044</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;                {</div><div class="line"><a name="l07047"></a><span class="lineno"> 7047</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l07048"></a><span class="lineno"> 7048</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;        }</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;</div><div class="line"><a name="l07054"></a><span class="lineno"> 7054</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l07055"></a><span class="lineno"> 7055</span>&#160;    {</div><div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160;        <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></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;        pAllocationRequest-&gt;sumFreeSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;        pAllocationRequest-&gt;sumItemSize = VK_WHOLE_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;        VmaAllocationRequest tmpAllocRequest = {};</div><div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div><div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;            suballocIt != m_Suballocations.end();</div><div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;            ++suballocIt)</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;            <span class="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div><div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</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="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;                    allocSize,</div><div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;                    allocAlignment,</div><div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;                    allocType,</div><div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;                    suballocIt,</div><div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;                    &amp;tmpAllocRequest.offset,</div><div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div><div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div><div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div><div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;                {</div><div class="line"><a name="l07083"></a><span class="lineno"> 7083</span>&#160;                    tmpAllocRequest.item = suballocIt;</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;                    <span class="keywordflow">if</span>(tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost() ||</div><div class="line"><a name="l07086"></a><span class="lineno"> 7086</span>&#160;                        strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</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;                        *pAllocationRequest = tmpAllocRequest;</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;                }</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;        }</div><div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;</div><div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;sumItemSize != VK_WHOLE_SIZE)</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;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;        }</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;</div><div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;}</div><div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>&#160;</div><div class="line"><a name="l07103"></a><span class="lineno"> 7103</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::MakeRequestedAllocationsLost(</div><div class="line"><a name="l07104"></a><span class="lineno"> 7104</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</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;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            ++pAllocationRequest-&gt;item;</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;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>&#160;        {</div><div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div><div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</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;        <span class="keywordflow">else</span></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="keywordflow">return</span> <span class="keyword">false</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;    }</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_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;    </div><div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;uint32_t VmaBlockMetadata_Generic::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</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;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;        ++it)</div><div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;    {</div><div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l07144"></a><span class="lineno"> 7144</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            it = FreeSuballocation(it);</div><div class="line"><a name="l07147"></a><span class="lineno"> 7147</span>&#160;            ++lostAllocationCount;</div><div class="line"><a name="l07148"></a><span class="lineno"> 7148</span>&#160;        }</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;    <span class="keywordflow">return</span> lostAllocationCount;</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;</div><div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;VkResult VmaBlockMetadata_Generic::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div><div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;{</div><div class="line"><a name="l07155"></a><span class="lineno"> 7155</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l07156"></a><span class="lineno"> 7156</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;        ++it)</div><div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160;    {</div><div class="line"><a name="l07159"></a><span class="lineno"> 7159</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</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="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;            {</div><div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l07164"></a><span class="lineno"> 7164</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset + it-&gt;size))</div><div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;            {</div><div class="line"><a name="l07168"></a><span class="lineno"> 7168</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l07169"></a><span class="lineno"> 7169</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;        }</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;</div><div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;}</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="keywordtype">void</span> VmaBlockMetadata_Generic::Alloc(</div><div class="line"><a name="l07178"></a><span class="lineno"> 7178</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l07179"></a><span class="lineno"> 7179</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l07182"></a><span class="lineno"> 7182</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l07183"></a><span class="lineno"> 7183</span>&#160;{</div><div class="line"><a name="l07184"></a><span class="lineno"> 7184</span>&#160;    VMA_ASSERT(!upperAddress);</div><div class="line"><a name="l07185"></a><span class="lineno"> 7185</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div><div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div><div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div><div class="line"><a name="l07188"></a><span class="lineno"> 7188</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07189"></a><span class="lineno"> 7189</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div><div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div><div class="line"><a name="l07191"></a><span class="lineno"> 7191</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div><div class="line"><a name="l07192"></a><span class="lineno"> 7192</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div><div class="line"><a name="l07193"></a><span class="lineno"> 7193</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</div><div class="line"><a name="l07194"></a><span class="lineno"> 7194</span>&#160;</div><div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>&#160;    <span class="comment">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div><div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;    <span class="comment">// it to become used.</span></div><div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;    UnregisterFreeSuballocation(request.item);</div><div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>&#160;</div><div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>&#160;    suballoc.offset = request.offset;</div><div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;    suballoc.size = allocSize;</div><div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;    suballoc.type = type;</div><div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;    suballoc.hAllocation = hAllocation;</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="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="l07205"></a><span class="lineno"> 7205</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</div><div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>&#160;    {</div><div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div><div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>&#160;        paddingSuballoc.size = paddingEnd;</div><div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;        VmaSuballocationList::iterator next = request.item;</div><div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;        ++next;</div><div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div><div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div><div class="line"><a name="l07215"></a><span class="lineno"> 7215</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</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="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="l07219"></a><span class="lineno"> 7219</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div><div class="line"><a name="l07220"></a><span class="lineno"> 7220</span>&#160;    {</div><div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l07222"></a><span class="lineno"> 7222</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div><div class="line"><a name="l07223"></a><span class="lineno"> 7223</span>&#160;        paddingSuballoc.size = paddingBegin;</div><div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div><div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div><div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</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="comment">// Update totals.</span></div><div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;    m_FreeCount = m_FreeCount - 1;</div><div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</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;        ++m_FreeCount;</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;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</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;        ++m_FreeCount;</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;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;{</div><div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160;        ++suballocItem)</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;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</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;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;            <span class="keywordflow">return</span>;</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;    }</div><div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</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;</div><div class="line"><a name="l07260"></a><span class="lineno"> 7260</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::FreeAtOffset(VkDeviceSize offset)</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="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l07263"></a><span class="lineno"> 7263</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l07264"></a><span class="lineno"> 7264</span>&#160;        ++suballocItem)</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;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</div><div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;        {</div><div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;            <span class="keywordflow">return</span>;</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;    }</div><div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</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;</div><div class="line"><a name="l07276"></a><span class="lineno"> 7276</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::ResizeAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize newSize)</div><div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;{</div><div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;    <span class="keyword">typedef</span> VmaSuballocationList::iterator iter_type;</div><div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;    <span class="keywordflow">for</span>(iter_type suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;        ++suballocItem)</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;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == alloc)</div><div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;        {</div><div class="line"><a name="l07286"></a><span class="lineno"> 7286</span>&#160;            iter_type nextItem = suballocItem;</div><div class="line"><a name="l07287"></a><span class="lineno"> 7287</span>&#160;            ++nextItem;</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="comment">// Should have been ensured on higher level.</span></div><div class="line"><a name="l07290"></a><span class="lineno"> 7290</span>&#160;            VMA_ASSERT(newSize != alloc-&gt;GetSize() &amp;&amp; newSize &gt; 0);</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">// Shrinking.</span></div><div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>&#160;            <span class="keywordflow">if</span>(newSize &lt; alloc-&gt;GetSize())</div><div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;            {</div><div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;                <span class="keyword">const</span> VkDeviceSize sizeDiff = suballoc.size - newSize;</div><div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>&#160;</div><div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>&#160;                <span class="comment">// There is next item.</span></div><div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;                <span class="keywordflow">if</span>(nextItem != m_Suballocations.end())</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;                    <span class="comment">// Next item is free.</span></div><div class="line"><a name="l07301"></a><span class="lineno"> 7301</span>&#160;                    <span class="keywordflow">if</span>(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l07302"></a><span class="lineno"> 7302</span>&#160;                    {</div><div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;                        <span class="comment">// Grow this next item backward.</span></div><div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;                        UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160;                        nextItem-&gt;offset -= sizeDiff;</div><div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;                        nextItem-&gt;size += sizeDiff;</div><div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;                        RegisterFreeSuballocation(nextItem);</div><div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;                    }</div><div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;                    <span class="comment">// Next item is not free.</span></div><div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>&#160;                    {</div><div class="line"><a name="l07312"></a><span class="lineno"> 7312</span>&#160;                        <span class="comment">// Create free item after current one.</span></div><div class="line"><a name="l07313"></a><span class="lineno"> 7313</span>&#160;                        VmaSuballocation newFreeSuballoc;</div><div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;                        newFreeSuballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l07315"></a><span class="lineno"> 7315</span>&#160;                        newFreeSuballoc.offset = suballoc.offset + newSize;</div><div class="line"><a name="l07316"></a><span class="lineno"> 7316</span>&#160;                        newFreeSuballoc.size = sizeDiff;</div><div class="line"><a name="l07317"></a><span class="lineno"> 7317</span>&#160;                        newFreeSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07318"></a><span class="lineno"> 7318</span>&#160;                        iter_type newFreeSuballocIt = m_Suballocations.insert(nextItem, newFreeSuballoc);</div><div class="line"><a name="l07319"></a><span class="lineno"> 7319</span>&#160;                        RegisterFreeSuballocation(newFreeSuballocIt);</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;                        ++m_FreeCount;</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;                }</div><div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160;                <span class="comment">// This is the last item.</span></div><div class="line"><a name="l07325"></a><span class="lineno"> 7325</span>&#160;                <span class="keywordflow">else</span></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="comment">// Create free item at the end.</span></div><div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;                    VmaSuballocation newFreeSuballoc;</div><div class="line"><a name="l07329"></a><span class="lineno"> 7329</span>&#160;                    newFreeSuballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l07330"></a><span class="lineno"> 7330</span>&#160;                    newFreeSuballoc.offset = suballoc.offset + newSize;</div><div class="line"><a name="l07331"></a><span class="lineno"> 7331</span>&#160;                    newFreeSuballoc.size = sizeDiff;</div><div class="line"><a name="l07332"></a><span class="lineno"> 7332</span>&#160;                    newFreeSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>&#160;                    m_Suballocations.push_back(newFreeSuballoc);</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;                    iter_type newFreeSuballocIt = m_Suballocations.end();</div><div class="line"><a name="l07336"></a><span class="lineno"> 7336</span>&#160;                    RegisterFreeSuballocation(--newFreeSuballocIt);</div><div class="line"><a name="l07337"></a><span class="lineno"> 7337</span>&#160;</div><div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;                    ++m_FreeCount;</div><div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;                }</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;                suballoc.size = newSize;</div><div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160;                m_SumFreeSize += sizeDiff;</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;            <span class="comment">// Growing.</span></div><div class="line"><a name="l07345"></a><span class="lineno"> 7345</span>&#160;            <span class="keywordflow">else</span></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;                <span class="keyword">const</span> VkDeviceSize sizeDiff = newSize - suballoc.size;</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">// There is next item.</span></div><div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;                <span class="keywordflow">if</span>(nextItem != m_Suballocations.end())</div><div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>&#160;                {</div><div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;                    <span class="comment">// Next item is free.</span></div><div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160;                    <span class="keywordflow">if</span>(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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="comment">// There is not enough free space, including margin.</span></div><div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;                        <span class="keywordflow">if</span>(nextItem-&gt;size &lt; sizeDiff + VMA_DEBUG_MARGIN)</div><div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;                        {</div><div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;                        }</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="comment">// There is more free space than required.</span></div><div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;                        <span class="keywordflow">if</span>(nextItem-&gt;size &gt; sizeDiff)</div><div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;                        {</div><div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;                            <span class="comment">// Move and shrink this next item.</span></div><div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160;                            UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l07366"></a><span class="lineno"> 7366</span>&#160;                            nextItem-&gt;offset += sizeDiff;</div><div class="line"><a name="l07367"></a><span class="lineno"> 7367</span>&#160;                            nextItem-&gt;size -= sizeDiff;</div><div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;                            RegisterFreeSuballocation(nextItem);</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;                        <span class="comment">// There is exactly the amount of free space required.</span></div><div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;                        <span class="keywordflow">else</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;                            <span class="comment">// Remove this next free item.</span></div><div class="line"><a name="l07374"></a><span class="lineno"> 7374</span>&#160;                            UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l07375"></a><span class="lineno"> 7375</span>&#160;                            m_Suballocations.erase(nextItem);</div><div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;                            --m_FreeCount;</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;                    }</div><div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;                    <span class="comment">// Next item is not free - there is no space to grow.</span></div><div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;                    {</div><div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;                }</div><div class="line"><a name="l07385"></a><span class="lineno"> 7385</span>&#160;                <span class="comment">// This is the last item - there is no space to grow.</span></div><div class="line"><a name="l07386"></a><span class="lineno"> 7386</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07387"></a><span class="lineno"> 7387</span>&#160;                {</div><div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;                    <span class="keywordflow">return</span> <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;                suballoc.size = newSize;</div><div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;                m_SumFreeSize -= sizeDiff;</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;</div><div class="line"><a name="l07395"></a><span class="lineno"> 7395</span>&#160;            <span class="comment">// We cannot call Validate() here because alloc object is updated to new size outside of this call.</span></div><div class="line"><a name="l07396"></a><span class="lineno"> 7396</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</div><div class="line"><a name="l07400"></a><span class="lineno"> 7400</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;}</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;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::ValidateFreeSuballocationList()<span class="keyword"> const</span></div><div class="line"><a name="l07404"></a><span class="lineno"> 7404</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07405"></a><span class="lineno"> 7405</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l07406"></a><span class="lineno"> 7406</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="l07407"></a><span class="lineno"> 7407</span>&#160;    {</div><div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</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;        VMA_VALIDATE(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div><div class="line"><a name="l07412"></a><span class="lineno"> 7412</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= lastSize);</div><div class="line"><a name="l07413"></a><span class="lineno"> 7413</span>&#160;        lastSize = it-&gt;size;</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">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CheckAllocation(</div><div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07420"></a><span class="lineno"> 7420</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l07421"></a><span class="lineno"> 7421</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l07422"></a><span class="lineno"> 7422</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l07423"></a><span class="lineno"> 7423</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l07425"></a><span class="lineno"> 7425</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l07426"></a><span class="lineno"> 7426</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l07427"></a><span class="lineno"> 7427</span>&#160;    VkDeviceSize* pOffset,</div><div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;    VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l07430"></a><span class="lineno"> 7430</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div><div class="line"><a name="l07431"></a><span class="lineno"> 7431</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07432"></a><span class="lineno"> 7432</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l07433"></a><span class="lineno"> 7433</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07434"></a><span class="lineno"> 7434</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div><div class="line"><a name="l07435"></a><span class="lineno"> 7435</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</div><div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>&#160;    </div><div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160;    *itemsToMakeLostCount = 0;</div><div class="line"><a name="l07438"></a><span class="lineno"> 7438</span>&#160;    *pSumFreeSize = 0;</div><div class="line"><a name="l07439"></a><span class="lineno"> 7439</span>&#160;    *pSumItemSize = 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;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;    {</div><div class="line"><a name="l07443"></a><span class="lineno"> 7443</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l07444"></a><span class="lineno"> 7444</span>&#160;        {</div><div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;            *pSumFreeSize = suballocItem-&gt;size;</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;        {</div><div class="line"><a name="l07449"></a><span class="lineno"> 7449</span>&#160;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l07450"></a><span class="lineno"> 7450</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                ++*itemsToMakeLostCount;</div><div class="line"><a name="l07453"></a><span class="lineno"> 7453</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</div><div class="line"><a name="l07454"></a><span class="lineno"> 7454</span>&#160;            }</div><div class="line"><a name="l07455"></a><span class="lineno"> 7455</span>&#160;            <span class="keywordflow">else</span></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">return</span> <span class="keyword">false</span>;</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;        }</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="comment">// Remaining size is too small for this request: Early return.</span></div><div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;        <span class="keywordflow">if</span>(GetSize() - suballocItem-&gt;offset &lt; allocSize)</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">return</span> <span class="keyword">false</span>;</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;</div><div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;        *pOffset = suballocItem-&gt;offset;</div><div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;    </div><div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;        {</div><div class="line"><a name="l07473"></a><span class="lineno"> 7473</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l07474"></a><span class="lineno"> 7474</span>&#160;        }</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">// Apply alignment.</span></div><div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;</div><div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l07484"></a><span class="lineno"> 7484</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l07485"></a><span class="lineno"> 7485</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>&#160;            {</div><div class="line"><a name="l07487"></a><span class="lineno"> 7487</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l07488"></a><span class="lineno"> 7488</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;                {</div><div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;                    {</div><div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;                        <span class="keywordflow">break</span>;</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;                }</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;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;                    <span class="keywordflow">break</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="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;            {</div><div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>&#160;            }</div><div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;        }</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;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div><div class="line"><a name="l07508"></a><span class="lineno"> 7508</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="l07509"></a><span class="lineno"> 7509</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</div><div class="line"><a name="l07510"></a><span class="lineno"> 7510</span>&#160;        {</div><div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>&#160;        }</div><div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>&#160;    </div><div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;        <span class="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</div><div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>&#160;</div><div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div><div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;</div><div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>&#160;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div><div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;        <span class="comment">// Another early return check.</span></div><div class="line"><a name="l07522"></a><span class="lineno"> 7522</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; GetSize())</div><div class="line"><a name="l07523"></a><span class="lineno"> 7523</span>&#160;        {</div><div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</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;</div><div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;        <span class="comment">// Advance lastSuballocItem until desired size is reached.</span></div><div class="line"><a name="l07528"></a><span class="lineno"> 7528</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div><div class="line"><a name="l07529"></a><span class="lineno"> 7529</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div><div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</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;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div><div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</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;                ++lastSuballocItem;</div><div class="line"><a name="l07536"></a><span class="lineno"> 7536</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</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="keywordflow">return</span> <span class="keyword">false</span>;</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;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;                    *pSumFreeSize += lastSuballocItem-&gt;size;</div><div class="line"><a name="l07543"></a><span class="lineno"> 7543</span>&#160;                }</div><div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;                {</div><div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l07548"></a><span class="lineno"> 7548</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l07549"></a><span class="lineno"> 7549</span>&#160;                    {</div><div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160;                        ++*itemsToMakeLostCount;</div><div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</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;                    <span class="keywordflow">else</span></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">return</span> <span class="keyword">false</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;                }</div><div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div><div class="line"><a name="l07559"></a><span class="lineno"> 7559</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div><div class="line"><a name="l07560"></a><span class="lineno"> 7560</span>&#160;            }</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;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l07565"></a><span class="lineno"> 7565</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l07566"></a><span class="lineno"> 7566</span>&#160;        {</div><div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div><div class="line"><a name="l07568"></a><span class="lineno"> 7568</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l07569"></a><span class="lineno"> 7569</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</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;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;                    {</div><div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l07578"></a><span class="lineno"> 7578</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                            ++*itemsToMakeLostCount;</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">else</span></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> <span class="keyword">false</span>;</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;                    }</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">else</span></div><div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>&#160;                {</div><div class="line"><a name="l07590"></a><span class="lineno"> 7590</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l07591"></a><span class="lineno"> 7591</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l07592"></a><span class="lineno"> 7592</span>&#160;                }</div><div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;                ++nextSuballocItem;</div><div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;            }</div><div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>&#160;        }</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;    <span class="keywordflow">else</span></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;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07600"></a><span class="lineno"> 7600</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</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;        *pSumFreeSize = suballoc.size;</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="comment">// Size of this suballocation is too small for this request: Early return.</span></div><div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</div><div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>&#160;        {</div><div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>&#160;        }</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;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;        *pOffset = suballoc.offset;</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;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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;            *pOffset += VMA_DEBUG_MARGIN;</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;    </div><div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l07620"></a><span class="lineno"> 7620</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l07621"></a><span class="lineno"> 7621</span>&#160;    </div><div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</div><div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;            {</div><div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160;                --prevSuballocItem;</div><div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;                {</div><div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;                    {</div><div class="line"><a name="l07636"></a><span class="lineno"> 7636</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l07637"></a><span class="lineno"> 7637</span>&#160;                        <span class="keywordflow">break</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;                }</div><div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;                    <span class="keywordflow">break</span>;</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="keywordflow">if</span>(bufferImageGranularityConflict)</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;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</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;        }</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">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</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;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l07654"></a><span class="lineno"> 7654</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</div><div class="line"><a name="l07655"></a><span class="lineno"> 7655</span>&#160;</div><div class="line"><a name="l07656"></a><span class="lineno"> 7656</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="l07657"></a><span class="lineno"> 7657</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div><div class="line"><a name="l07658"></a><span class="lineno"> 7658</span>&#160;        {</div><div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160;        }</div><div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;</div><div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l07664"></a><span class="lineno"> 7664</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l07665"></a><span class="lineno"> 7665</span>&#160;        {</div><div class="line"><a name="l07666"></a><span class="lineno"> 7666</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div><div class="line"><a name="l07667"></a><span class="lineno"> 7667</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l07668"></a><span class="lineno"> 7668</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</div><div class="line"><a name="l07669"></a><span class="lineno"> 7669</span>&#160;            {</div><div class="line"><a name="l07670"></a><span class="lineno"> 7670</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l07671"></a><span class="lineno"> 7671</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</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;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;                }</div><div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;                <span class="keywordflow">else</span></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">// Already on next page.</span></div><div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;                    <span class="keywordflow">break</span>;</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;                ++nextSuballocItem;</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;        }</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;</div><div class="line"><a name="l07688"></a><span class="lineno"> 7688</span>&#160;    <span class="comment">// All tests passed: Success. pOffset is already filled.</span></div><div class="line"><a name="l07689"></a><span class="lineno"> 7689</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::MergeFreeWithNext(VmaSuballocationList::iterator item)</div><div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160;{</div><div class="line"><a name="l07694"></a><span class="lineno"> 7694</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div><div class="line"><a name="l07695"></a><span class="lineno"> 7695</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</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;    VmaSuballocationList::iterator nextItem = item;</div><div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>&#160;    ++nextItem;</div><div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div><div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</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;    item-&gt;size += nextItem-&gt;size;</div><div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;    m_Suballocations.erase(nextItem);</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;VmaSuballocationList::iterator VmaBlockMetadata_Generic::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</div><div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;{</div><div class="line"><a name="l07709"></a><span class="lineno"> 7709</span>&#160;    <span class="comment">// Change this suballocation to be marked as free.</span></div><div class="line"><a name="l07710"></a><span class="lineno"> 7710</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07711"></a><span class="lineno"> 7711</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07712"></a><span class="lineno"> 7712</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;    </div><div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;    <span class="comment">// Update totals.</span></div><div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;    m_SumFreeSize += suballoc.size;</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;    <span class="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div><div class="line"><a name="l07719"></a><span class="lineno"> 7719</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div><div class="line"><a name="l07720"></a><span class="lineno"> 7720</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div><div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160;    </div><div class="line"><a name="l07722"></a><span class="lineno"> 7722</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div><div class="line"><a name="l07723"></a><span class="lineno"> 7723</span>&#160;    ++nextItem;</div><div class="line"><a name="l07724"></a><span class="lineno"> 7724</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="l07725"></a><span class="lineno"> 7725</span>&#160;    {</div><div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</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;    VmaSuballocationList::iterator prevItem = suballocItem;</div><div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</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;        --prevItem;</div><div class="line"><a name="l07733"></a><span class="lineno"> 7733</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            mergeWithPrev = <span class="keyword">true</span>;</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;</div><div class="line"><a name="l07739"></a><span class="lineno"> 7739</span>&#160;    <span class="keywordflow">if</span>(mergeWithNext)</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;        UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l07742"></a><span class="lineno"> 7742</span>&#160;        MergeFreeWithNext(suballocItem);</div><div class="line"><a name="l07743"></a><span class="lineno"> 7743</span>&#160;    }</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="keywordflow">if</span>(mergeWithPrev)</div><div class="line"><a name="l07746"></a><span class="lineno"> 7746</span>&#160;    {</div><div class="line"><a name="l07747"></a><span class="lineno"> 7747</span>&#160;        UnregisterFreeSuballocation(prevItem);</div><div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;        MergeFreeWithNext(prevItem);</div><div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;        RegisterFreeSuballocation(prevItem);</div><div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;        <span class="keywordflow">return</span> prevItem;</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;    <span class="keywordflow">else</span></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;        RegisterFreeSuballocation(suballocItem);</div><div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;        <span class="keywordflow">return</span> suballocItem;</div><div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;    }</div><div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>&#160;}</div><div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>&#160;</div><div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;{</div><div class="line"><a name="l07761"></a><span class="lineno"> 7761</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07762"></a><span class="lineno"> 7762</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;</div><div class="line"><a name="l07764"></a><span class="lineno"> 7764</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="l07765"></a><span class="lineno"> 7765</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l07766"></a><span class="lineno"> 7766</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l07767"></a><span class="lineno"> 7767</span>&#160;</div><div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;        <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</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;            m_FreeSuballocationsBySize.push_back(item);</div><div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>&#160;        }</div><div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>&#160;        <span class="keywordflow">else</span></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;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</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;    }</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;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</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;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;{</div><div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;</div><div class="line"><a name="l07789"></a><span class="lineno"> 7789</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="l07790"></a><span class="lineno"> 7790</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l07791"></a><span class="lineno"> 7791</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</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="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;            m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div><div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;            item,</div><div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;            VmaSuballocationItemSizeLess());</div><div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l07802"></a><span class="lineno"> 7802</span>&#160;            ++index)</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">if</span>(m_FreeSuballocationsBySize[index] == item)</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;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div><div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>&#160;            }</div><div class="line"><a name="l07809"></a><span class="lineno"> 7809</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="l07810"></a><span class="lineno"> 7810</span>&#160;        }</div><div class="line"><a name="l07811"></a><span class="lineno"> 7811</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</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;</div><div class="line"><a name="l07814"></a><span class="lineno"> 7814</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></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="l07818"></a><span class="lineno"> 7818</span>&#160;<span class="comment">// class VmaBlockMetadata_Linear</span></div><div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;</div><div class="line"><a name="l07820"></a><span class="lineno"> 7820</span>&#160;VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l07821"></a><span class="lineno"> 7821</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l07822"></a><span class="lineno"> 7822</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l07823"></a><span class="lineno"> 7823</span>&#160;    m_Suballocations0(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07824"></a><span class="lineno"> 7824</span>&#160;    m_Suballocations1(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07825"></a><span class="lineno"> 7825</span>&#160;    m_1stVectorIndex(0),</div><div class="line"><a name="l07826"></a><span class="lineno"> 7826</span>&#160;    m_2ndVectorMode(SECOND_VECTOR_EMPTY),</div><div class="line"><a name="l07827"></a><span class="lineno"> 7827</span>&#160;    m_1stNullItemsBeginCount(0),</div><div class="line"><a name="l07828"></a><span class="lineno"> 7828</span>&#160;    m_1stNullItemsMiddleCount(0),</div><div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;    m_2ndNullItemsCount(0)</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;}</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;VmaBlockMetadata_Linear::~VmaBlockMetadata_Linear()</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;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Init(VkDeviceSize size)</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;    VmaBlockMetadata::Init(size);</div><div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;    m_SumFreeSize = size;</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;</div><div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l07844"></a><span class="lineno"> 7844</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07845"></a><span class="lineno"> 7845</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>&#160;</div><div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>&#160;    VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));</div><div class="line"><a name="l07849"></a><span class="lineno"> 7849</span>&#160;    VMA_VALIDATE(!suballocations1st.empty() ||</div><div class="line"><a name="l07850"></a><span class="lineno"> 7850</span>&#160;        suballocations2nd.empty() ||</div><div class="line"><a name="l07851"></a><span class="lineno"> 7851</span>&#160;        m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);</div><div class="line"><a name="l07852"></a><span class="lineno"> 7852</span>&#160;</div><div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</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;        <span class="comment">// Null item at the beginning should be accounted into m_1stNullItemsBeginCount.</span></div><div class="line"><a name="l07856"></a><span class="lineno"> 7856</span>&#160;        VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07857"></a><span class="lineno"> 7857</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div><div class="line"><a name="l07858"></a><span class="lineno"> 7858</span>&#160;        VMA_VALIDATE(suballocations1st.back().hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160;    }</div><div class="line"><a name="l07860"></a><span class="lineno"> 7860</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</div><div class="line"><a name="l07861"></a><span class="lineno"> 7861</span>&#160;    {</div><div class="line"><a name="l07862"></a><span class="lineno"> 7862</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div><div class="line"><a name="l07863"></a><span class="lineno"> 7863</span>&#160;        VMA_VALIDATE(suballocations2nd.back().hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;    }</div><div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>&#160;</div><div class="line"><a name="l07866"></a><span class="lineno"> 7866</span>&#160;    VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount &lt;= suballocations1st.size());</div><div class="line"><a name="l07867"></a><span class="lineno"> 7867</span>&#160;    VMA_VALIDATE(m_2ndNullItemsCount &lt;= suballocations2nd.size());</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;    VkDeviceSize sumUsedSize = 0;</div><div class="line"><a name="l07870"></a><span class="lineno"> 7870</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l07871"></a><span class="lineno"> 7871</span>&#160;    VkDeviceSize offset = VMA_DEBUG_MARGIN;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div><div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; suballoc2ndCount; ++i)</div><div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;        {</div><div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l07880"></a><span class="lineno"> 7880</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="l07881"></a><span class="lineno"> 7881</span>&#160;</div><div class="line"><a name="l07882"></a><span class="lineno"> 7882</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l07883"></a><span class="lineno"> 7883</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</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="keywordflow">if</span>(!currFree)</div><div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>&#160;            {</div><div class="line"><a name="l07887"></a><span class="lineno"> 7887</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l07888"></a><span class="lineno"> 7888</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l07889"></a><span class="lineno"> 7889</span>&#160;                sumUsedSize += suballoc.size;</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;            <span class="keywordflow">else</span></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;                ++nullItem2ndCount;</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;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</div><div class="line"><a name="l07900"></a><span class="lineno"> 7900</span>&#160;    }</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_1stNullItemsBeginCount; ++i)</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l07905"></a><span class="lineno"> 7905</span>&#160;        VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l07906"></a><span class="lineno"> 7906</span>&#160;            suballoc.hAllocation == VK_NULL_HANDLE);</div><div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;    }</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="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount;</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount; i &lt; suballoc1stCount; ++i)</div><div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;    {</div><div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l07914"></a><span class="lineno"> 7914</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="l07915"></a><span class="lineno"> 7915</span>&#160;</div><div class="line"><a name="l07916"></a><span class="lineno"> 7916</span>&#160;        VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l07917"></a><span class="lineno"> 7917</span>&#160;        VMA_VALIDATE(suballoc.offset &gt;= offset);</div><div class="line"><a name="l07918"></a><span class="lineno"> 7918</span>&#160;        VMA_VALIDATE(i &gt;= m_1stNullItemsBeginCount || currFree);</div><div class="line"><a name="l07919"></a><span class="lineno"> 7919</span>&#160;</div><div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;        <span class="keywordflow">if</span>(!currFree)</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;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l07923"></a><span class="lineno"> 7923</span>&#160;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l07924"></a><span class="lineno"> 7924</span>&#160;            sumUsedSize += suballoc.size;</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;        {</div><div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;            ++nullItem1stCount;</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;</div><div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;        offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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;    VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);</div><div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160;</div><div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div><div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = suballoc2ndCount; i--; )</div><div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;        {</div><div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l07942"></a><span class="lineno"> 7942</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="l07943"></a><span class="lineno"> 7943</span>&#160;</div><div class="line"><a name="l07944"></a><span class="lineno"> 7944</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l07945"></a><span class="lineno"> 7945</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</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;            <span class="keywordflow">if</span>(!currFree)</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;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160;                sumUsedSize += suballoc.size;</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;            <span class="keywordflow">else</span></div><div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;            {</div><div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;                ++nullItem2ndCount;</div><div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;            }</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;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</div><div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;        }</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;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</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;</div><div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;    VMA_VALIDATE(offset &lt;= GetSize());</div><div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;    VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);</div><div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;</div><div class="line"><a name="l07967"></a><span class="lineno"> 7967</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07968"></a><span class="lineno"> 7968</span>&#160;}</div><div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;</div><div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;<span class="keywordtype">size_t</span> VmaBlockMetadata_Linear::GetAllocationCount()<span class="keyword"> const</span></div><div class="line"><a name="l07971"></a><span class="lineno"> 7971</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;    <span class="keywordflow">return</span> AccessSuballocations1st().size() - (m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount) +</div><div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160;        AccessSuballocations2nd().size() - m_2ndNullItemsCount;</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;VkDeviceSize VmaBlockMetadata_Linear::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l07977"></a><span class="lineno"> 7977</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07978"></a><span class="lineno"> 7978</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</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">/*</span></div><div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;<span class="comment">    We don&#39;t consider gaps inside allocation vectors with freed allocations because</span></div><div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;<span class="comment">    they are not suitable for reuse in linear allocator. We consider only space that</span></div><div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;<span class="comment">    is available for new allocations.</span></div><div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</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;        <span class="keywordflow">return</span> size;</div><div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160;    }</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;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>&#160;</div><div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;    <span class="keywordflow">switch</span>(m_2ndVectorMode)</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;    <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div><div class="line"><a name="l07995"></a><span class="lineno"> 7995</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;<span class="comment">        Available space is after end of 1st, as well as before beginning of 1st (which</span></div><div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;<span class="comment">        whould make it a ring buffer).</span></div><div class="line"><a name="l07998"></a><span class="lineno"> 7998</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l07999"></a><span class="lineno"> 7999</span>&#160;        {</div><div class="line"><a name="l08000"></a><span class="lineno"> 8000</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocations1stCount = suballocations1st.size();</div><div class="line"><a name="l08001"></a><span class="lineno"> 8001</span>&#160;            VMA_ASSERT(suballocations1stCount &gt; m_1stNullItemsBeginCount);</div><div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc  = suballocations1st[suballocations1stCount - 1];</div><div class="line"><a name="l08004"></a><span class="lineno"> 8004</span>&#160;            <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l08005"></a><span class="lineno"> 8005</span>&#160;                firstSuballoc.offset,</div><div class="line"><a name="l08006"></a><span class="lineno"> 8006</span>&#160;                size - (lastSuballoc.offset + lastSuballoc.size));</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;        <span class="keywordflow">break</span>;</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">case</span> SECOND_VECTOR_RING_BUFFER:</div><div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;<span class="comment">        Available space is only between end of 2nd and beginning of 1st.</span></div><div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;<span class="comment">        */</span></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;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08016"></a><span class="lineno"> 8016</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc2nd = suballocations2nd.back();</div><div class="line"><a name="l08017"></a><span class="lineno"> 8017</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc1st = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;            <span class="keywordflow">return</span> firstSuballoc1st.offset - (lastSuballoc2nd.offset + lastSuballoc2nd.size);</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="keywordflow">break</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="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div><div class="line"><a name="l08023"></a><span class="lineno"> 8023</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l08024"></a><span class="lineno"> 8024</span>&#160;<span class="comment">        Available space is only between end of 1st and top of 2nd.</span></div><div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;<span class="comment">        */</span></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> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; topSuballoc2nd = suballocations2nd.back();</div><div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc1st = suballocations1st.back();</div><div class="line"><a name="l08030"></a><span class="lineno"> 8030</span>&#160;            <span class="keywordflow">return</span> topSuballoc2nd.offset - (lastSuballoc1st.offset + lastSuballoc1st.size);</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">break</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;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;        <span class="keywordflow">return</span> 0;</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;</div><div class="line"><a name="l08040"></a><span class="lineno"> 8040</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::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="l08041"></a><span class="lineno"> 8041</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l08044"></a><span class="lineno"> 8044</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08045"></a><span class="lineno"> 8045</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l08046"></a><span class="lineno"> 8046</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l08047"></a><span class="lineno"> 8047</span>&#160;</div><div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = (uint32_t)GetAllocationCount();</div><div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = 0;</div><div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l08055"></a><span class="lineno"> 8055</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l08056"></a><span class="lineno"> 8056</span>&#160;</div><div class="line"><a name="l08057"></a><span class="lineno"> 8057</span>&#160;    VkDeviceSize lastOffset = 0;</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="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;    {</div><div class="line"><a name="l08061"></a><span class="lineno"> 8061</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l08062"></a><span class="lineno"> 8062</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l08063"></a><span class="lineno"> 8063</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08064"></a><span class="lineno"> 8064</span>&#160;        {</div><div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08066"></a><span class="lineno"> 8066</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l08067"></a><span class="lineno"> 8067</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;            {</div><div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;                ++nextAlloc2ndIndex;</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;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08073"></a><span class="lineno"> 8073</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08078"></a><span class="lineno"> 8078</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08084"></a><span class="lineno"> 8084</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>, unusedRangeSize);</div><div class="line"><a name="l08085"></a><span class="lineno"> 8085</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</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;            </div><div class="line"><a name="l08088"></a><span class="lineno"> 8088</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08090"></a><span class="lineno"> 8090</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l08091"></a><span class="lineno"> 8091</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="l08092"></a><span class="lineno"> 8092</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</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="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;                ++nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>&#160;            {</div><div class="line"><a name="l08101"></a><span class="lineno"> 8101</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l08102"></a><span class="lineno"> 8102</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08103"></a><span class="lineno"> 8103</span>&#160;                {</div><div class="line"><a name="l08104"></a><span class="lineno"> 8104</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l08105"></a><span class="lineno"> 8105</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08107"></a><span class="lineno"> 8107</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>, unusedRangeSize);</div><div class="line"><a name="l08108"></a><span class="lineno"> 8108</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</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;</div><div class="line"><a name="l08111"></a><span class="lineno"> 8111</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</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;        }</div><div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;    }</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;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08118"></a><span class="lineno"> 8118</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l08119"></a><span class="lineno"> 8119</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l08120"></a><span class="lineno"> 8120</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08123"></a><span class="lineno"> 8123</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;        {</div><div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160;            ++nextAlloc1stIndex;</div><div class="line"><a name="l08127"></a><span class="lineno"> 8127</span>&#160;        }</div><div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>&#160;</div><div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>&#160;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div><div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>&#160;        {</div><div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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;            <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08135"></a><span class="lineno"> 8135</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08140"></a><span class="lineno"> 8140</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08141"></a><span class="lineno"> 8141</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>, unusedRangeSize);</div><div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</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;            </div><div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l08148"></a><span class="lineno"> 8148</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="l08149"></a><span class="lineno"> 8149</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div><div class="line"><a name="l08150"></a><span class="lineno"> 8150</span>&#160;            </div><div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08152"></a><span class="lineno"> 8152</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08153"></a><span class="lineno"> 8153</span>&#160;            ++nextAlloc1stIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l08156"></a><span class="lineno"> 8156</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08157"></a><span class="lineno"> 8157</span>&#160;        {</div><div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;            <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l08159"></a><span class="lineno"> 8159</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div><div class="line"><a name="l08160"></a><span class="lineno"> 8160</span>&#160;            {</div><div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08164"></a><span class="lineno"> 8164</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>, unusedRangeSize);</div><div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div><div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;           }</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="comment">// End of loop.</span></div><div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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;    }</div><div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>&#160;</div><div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l08176"></a><span class="lineno"> 8176</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l08180"></a><span class="lineno"> 8180</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08181"></a><span class="lineno"> 8181</span>&#160;            {</div><div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;                --nextAlloc2ndIndex;</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="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08186"></a><span class="lineno"> 8186</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div><div class="line"><a name="l08187"></a><span class="lineno"> 8187</span>&#160;            {</div><div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>&#160;            </div><div class="line"><a name="l08190"></a><span class="lineno"> 8190</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08191"></a><span class="lineno"> 8191</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08197"></a><span class="lineno"> 8197</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>, unusedRangeSize);</div><div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div><div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>&#160;                }</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;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08202"></a><span class="lineno"> 8202</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08203"></a><span class="lineno"> 8203</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l08204"></a><span class="lineno"> 8204</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="l08205"></a><span class="lineno"> 8205</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160;                --nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;            <span class="keywordflow">else</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;                <span class="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08220"></a><span class="lineno"> 8220</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>, unusedRangeSize);</div><div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</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="comment">// End of loop.</span></div><div class="line"><a name="l08225"></a><span class="lineno"> 8225</span>&#160;                lastOffset = size;</div><div class="line"><a name="l08226"></a><span class="lineno"> 8226</span>&#160;            }</div><div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>&#160;        }</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = size - outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</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> VmaBlockMetadata_Linear::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="l08234"></a><span class="lineno"> 8234</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08237"></a><span class="lineno"> 8237</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l08238"></a><span class="lineno"> 8238</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l08239"></a><span class="lineno"> 8239</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l08240"></a><span class="lineno"> 8240</span>&#160;</div><div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += size;</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;    VkDeviceSize lastOffset = 0;</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">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08249"></a><span class="lineno"> 8249</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l08253"></a><span class="lineno"> 8253</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</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;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08259"></a><span class="lineno"> 8259</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;                {</div><div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08268"></a><span class="lineno"> 8268</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08269"></a><span class="lineno"> 8269</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08270"></a><span class="lineno"> 8270</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>, unusedRangeSize);</div><div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>&#160;                }</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;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08275"></a><span class="lineno"> 8275</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08278"></a><span class="lineno"> 8278</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08279"></a><span class="lineno"> 8279</span>&#160;                ++nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08282"></a><span class="lineno"> 8282</span>&#160;            <span class="keywordflow">else</span></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>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08289"></a><span class="lineno"> 8289</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08290"></a><span class="lineno"> 8290</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>, unusedRangeSize);</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;</div><div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</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;        }</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;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08300"></a><span class="lineno"> 8300</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l08301"></a><span class="lineno"> 8301</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08305"></a><span class="lineno"> 8305</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l08306"></a><span class="lineno"> 8306</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</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;</div><div class="line"><a name="l08311"></a><span class="lineno"> 8311</span>&#160;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08312"></a><span class="lineno"> 8312</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</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;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;            {</div><div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08320"></a><span class="lineno"> 8320</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08321"></a><span class="lineno"> 8321</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08323"></a><span class="lineno"> 8323</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>, unusedRangeSize);</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;            </div><div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08327"></a><span class="lineno"> 8327</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08328"></a><span class="lineno"> 8328</span>&#160;            ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08332"></a><span class="lineno"> 8332</span>&#160;            ++nextAlloc1stIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160;        <span class="keywordflow">else</span></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;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div><div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;            {</div><div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08343"></a><span class="lineno"> 8343</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>, unusedRangeSize);</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="comment">// End of loop.</span></div><div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div><div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160;        }</div><div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;    }</div><div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;</div><div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div><div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;    {</div><div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;            {</div><div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;                --nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08364"></a><span class="lineno"> 8364</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>&#160;            </div><div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08375"></a><span class="lineno"> 8375</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>, unusedRangeSize);</div><div class="line"><a name="l08376"></a><span class="lineno"> 8376</span>&#160;                }</div><div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160;            </div><div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;                --nextAlloc2ndIndex;</div><div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;            }</div><div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;            {</div><div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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;                    <span class="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08395"></a><span class="lineno"> 8395</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>, unusedRangeSize);</div><div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;                }</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">// End of loop.</span></div><div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>&#160;                lastOffset = size;</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;        }</div><div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>&#160;    }</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;</div><div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08406"></a><span class="lineno"> 8406</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l08407"></a><span class="lineno"> 8407</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l08410"></a><span class="lineno"> 8410</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08411"></a><span class="lineno"> 8411</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l08412"></a><span class="lineno"> 8412</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</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="comment">// FIRST PASS</span></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;    <span class="keywordtype">size_t</span> unusedRangeCount = 0;</div><div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;    VkDeviceSize usedBytes = 0;</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;    VkDeviceSize lastOffset = 0;</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="keywordtype">size_t</span> alloc2ndCount = 0;</div><div class="line"><a name="l08422"></a><span class="lineno"> 8422</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l08425"></a><span class="lineno"> 8425</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l08426"></a><span class="lineno"> 8426</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;        {</div><div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l08430"></a><span class="lineno"> 8430</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08435"></a><span class="lineno"> 8435</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div><div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;            {</div><div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;            </div><div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>&#160;                {</div><div class="line"><a name="l08443"></a><span class="lineno"> 8443</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08444"></a><span class="lineno"> 8444</span>&#160;                    ++unusedRangeCount;</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;            </div><div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;                ++alloc2ndCount;</div><div class="line"><a name="l08450"></a><span class="lineno"> 8450</span>&#160;                usedBytes += suballoc.size;</div><div class="line"><a name="l08451"></a><span class="lineno"> 8451</span>&#160;            </div><div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08453"></a><span class="lineno"> 8453</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08454"></a><span class="lineno"> 8454</span>&#160;                ++nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;            <span class="keywordflow">else</span></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="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>&#160;                {</div><div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;                    ++unusedRangeCount;</div><div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</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;        }</div><div class="line"><a name="l08469"></a><span class="lineno"> 8469</span>&#160;    }</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;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;    <span class="keywordtype">size_t</span> alloc1stCount = 0;</div><div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div><div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;    {</div><div class="line"><a name="l08477"></a><span class="lineno"> 8477</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08478"></a><span class="lineno"> 8478</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;        {</div><div class="line"><a name="l08481"></a><span class="lineno"> 8481</span>&#160;            ++nextAlloc1stIndex;</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;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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;            <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08490"></a><span class="lineno"> 8490</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08493"></a><span class="lineno"> 8493</span>&#160;                ++unusedRangeCount;</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="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;            ++alloc1stCount;</div><div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;            usedBytes += suballoc.size;</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="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08502"></a><span class="lineno"> 8502</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08503"></a><span class="lineno"> 8503</span>&#160;            ++nextAlloc1stIndex;</div><div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;        }</div><div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;        <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;        <span class="keywordflow">else</span></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;            <span class="keywordflow">if</span>(lastOffset &lt; size)</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="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;                ++unusedRangeCount;</div><div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;            }</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;            <span class="comment">// End of loop.</span></div><div class="line"><a name="l08515"></a><span class="lineno"> 8515</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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;    }</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</div><div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;        {</div><div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;            {</div><div class="line"><a name="l08528"></a><span class="lineno"> 8528</span>&#160;                --nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08532"></a><span class="lineno"> 8532</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08537"></a><span class="lineno"> 8537</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;                    ++unusedRangeCount;</div><div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;                }</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;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08545"></a><span class="lineno"> 8545</span>&#160;                ++alloc2ndCount;</div><div class="line"><a name="l08546"></a><span class="lineno"> 8546</span>&#160;                usedBytes += suballoc.size;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;                --nextAlloc2ndIndex;</div><div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>&#160;            }</div><div class="line"><a name="l08552"></a><span class="lineno"> 8552</span>&#160;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08553"></a><span class="lineno"> 8553</span>&#160;            <span class="keywordflow">else</span></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;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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;                    <span class="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;                    ++unusedRangeCount;</div><div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;                }</div><div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;</div><div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>&#160;                lastOffset = size;</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="l08565"></a><span class="lineno"> 8565</span>&#160;    }</div><div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>&#160;</div><div class="line"><a name="l08567"></a><span class="lineno"> 8567</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusedBytes = size - usedBytes;</div><div class="line"><a name="l08568"></a><span class="lineno"> 8568</span>&#160;    PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);</div><div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;</div><div class="line"><a name="l08570"></a><span class="lineno"> 8570</span>&#160;    <span class="comment">// SECOND PASS</span></div><div class="line"><a name="l08571"></a><span class="lineno"> 8571</span>&#160;    lastOffset = 0;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;    {</div><div class="line"><a name="l08575"></a><span class="lineno"> 8575</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l08576"></a><span class="lineno"> 8576</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;        {</div><div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08580"></a><span class="lineno"> 8580</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == 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;                ++nextAlloc2ndIndex;</div><div class="line"><a name="l08584"></a><span class="lineno"> 8584</span>&#160;            }</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;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08587"></a><span class="lineno"> 8587</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;            </div><div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08592"></a><span class="lineno"> 8592</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08593"></a><span class="lineno"> 8593</span>&#160;                {</div><div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08596"></a><span class="lineno"> 8596</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l08597"></a><span class="lineno"> 8597</span>&#160;                }</div><div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;            </div><div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08600"></a><span class="lineno"> 8600</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08601"></a><span class="lineno"> 8601</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div><div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;            </div><div class="line"><a name="l08603"></a><span class="lineno"> 8603</span>&#160;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08604"></a><span class="lineno"> 8604</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160;                ++nextAlloc2ndIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;            <span class="keywordflow">else</span></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;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l08613"></a><span class="lineno"> 8613</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l08614"></a><span class="lineno"> 8614</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;                }</div><div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;</div><div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08618"></a><span class="lineno"> 8618</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div><div class="line"><a name="l08619"></a><span class="lineno"> 8619</span>&#160;            }</div><div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;        }</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;</div><div class="line"><a name="l08623"></a><span class="lineno"> 8623</span>&#160;    nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08624"></a><span class="lineno"> 8624</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08627"></a><span class="lineno"> 8627</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l08628"></a><span class="lineno"> 8628</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>&#160;        {</div><div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>&#160;            ++nextAlloc1stIndex;</div><div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;        }</div><div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>&#160;</div><div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08634"></a><span class="lineno"> 8634</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>&#160;            {</div><div class="line"><a name="l08641"></a><span class="lineno"> 8641</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08642"></a><span class="lineno"> 8642</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;            }</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;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08647"></a><span class="lineno"> 8647</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08648"></a><span class="lineno"> 8648</span>&#160;            PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div><div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;            </div><div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160;            ++nextAlloc1stIndex;</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;        <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;        <span class="keywordflow">else</span></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">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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;</div><div class="line"><a name="l08664"></a><span class="lineno"> 8664</span>&#160;            <span class="comment">// End of loop.</span></div><div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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;</div><div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l08672"></a><span class="lineno"> 8672</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08675"></a><span class="lineno"> 8675</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l08676"></a><span class="lineno"> 8676</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                --nextAlloc2ndIndex;</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="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;                }</div><div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>&#160;            </div><div class="line"><a name="l08694"></a><span class="lineno"> 8694</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08695"></a><span class="lineno"> 8695</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08696"></a><span class="lineno"> 8696</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</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="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08699"></a><span class="lineno"> 8699</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08700"></a><span class="lineno"> 8700</span>&#160;                --nextAlloc2ndIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;            {</div><div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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;                    <span class="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l08708"></a><span class="lineno"> 8708</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l08709"></a><span class="lineno"> 8709</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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;</div><div class="line"><a name="l08712"></a><span class="lineno"> 8712</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08713"></a><span class="lineno"> 8713</span>&#160;                lastOffset = size;</div><div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;            }</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;    }</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;    PrintDetailedMap_End(json);</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;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest(</div><div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l08724"></a><span class="lineno"> 8724</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l08725"></a><span class="lineno"> 8725</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l08727"></a><span class="lineno"> 8727</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l08728"></a><span class="lineno"> 8728</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l08729"></a><span class="lineno"> 8729</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l08732"></a><span class="lineno"> 8732</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l08733"></a><span class="lineno"> 8733</span>&#160;{</div><div class="line"><a name="l08734"></a><span class="lineno"> 8734</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l08735"></a><span class="lineno"> 8735</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08736"></a><span class="lineno"> 8736</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l08737"></a><span class="lineno"> 8737</span>&#160;    VMA_HEAVY_ASSERT(Validate());</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="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;</div><div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;    <span class="keywordflow">if</span>(upperAddress)</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;        <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;        {</div><div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Trying to use pool with linear algorithm as double stack, while it is already being used as ring buffer.&quot;</span>);</div><div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;</div><div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;        <span class="comment">// Try to allocate before 2nd.back(), or end of block if 2nd.empty().</span></div><div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;        <span class="keywordflow">if</span>(allocSize &gt; size)</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        VkDeviceSize resultBaseOffset = size - allocSize;</div><div class="line"><a name="l08757"></a><span class="lineno"> 8757</span>&#160;        <span class="keywordflow">if</span>(!suballocations2nd.empty())</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="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>&#160;            resultBaseOffset = lastSuballoc.offset - allocSize;</div><div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160;            <span class="keywordflow">if</span>(allocSize &gt; lastSuballoc.offset)</div><div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>&#160;            {</div><div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;            }</div><div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;        }</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">// Start from offset equal to end of free space.</span></div><div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</div><div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;</div><div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the end.</span></div><div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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>(resultOffset &lt; VMA_DEBUG_MARGIN)</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;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;            resultOffset -= VMA_DEBUG_MARGIN;</div><div class="line"><a name="l08778"></a><span class="lineno"> 8778</span>&#160;        }</div><div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160;</div><div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>&#160;        resultOffset = VmaAlignDown(resultOffset, allocAlignment);</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;        <span class="comment">// Check next suballocations from 2nd for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</div><div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;        {</div><div class="line"><a name="l08787"></a><span class="lineno"> 8787</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l08788"></a><span class="lineno"> 8788</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</div><div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>&#160;            {</div><div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div><div class="line"><a name="l08791"></a><span class="lineno"> 8791</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l08792"></a><span class="lineno"> 8792</span>&#160;                {</div><div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))</div><div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;                    {</div><div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>&#160;                    }</div><div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;                }</div><div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;                    <span class="comment">// Already on previous page.</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;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160;            {</div><div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160;                resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);</div><div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;            }</div><div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;        }</div><div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;</div><div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;        <span class="comment">// There is enough free space.</span></div><div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;        <span class="keyword">const</span> VkDeviceSize endOf1st = !suballocations1st.empty() ?</div><div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160;            suballocations1st.back().offset + suballocations1st.back().size :</div><div class="line"><a name="l08812"></a><span class="lineno"> 8812</span>&#160;            0;</div><div class="line"><a name="l08813"></a><span class="lineno"> 8813</span>&#160;        <span class="keywordflow">if</span>(endOf1st + VMA_DEBUG_MARGIN &lt;= resultOffset)</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;            <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08816"></a><span class="lineno"> 8816</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l08817"></a><span class="lineno"> 8817</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div><div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>&#160;                {</div><div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div><div class="line"><a name="l08822"></a><span class="lineno"> 8822</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div><div class="line"><a name="l08823"></a><span class="lineno"> 8823</span>&#160;                    {</div><div class="line"><a name="l08824"></a><span class="lineno"> 8824</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))</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> <span class="keyword">false</span>;</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;                    }</div><div class="line"><a name="l08829"></a><span class="lineno"> 8829</span>&#160;                    <span class="keywordflow">else</span></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;                        <span class="comment">// Already on next page.</span></div><div class="line"><a name="l08832"></a><span class="lineno"> 8832</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08833"></a><span class="lineno"> 8833</span>&#160;                    }</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;</div><div class="line"><a name="l08837"></a><span class="lineno"> 8837</span>&#160;            <span class="comment">// All tests passed: Success.</span></div><div class="line"><a name="l08838"></a><span class="lineno"> 8838</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l08839"></a><span class="lineno"> 8839</span>&#160;            pAllocationRequest-&gt;sumFreeSize = resultBaseOffset + allocSize - endOf1st;</div><div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;            pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l08841"></a><span class="lineno"> 8841</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item unused.</span></div><div class="line"><a name="l08842"></a><span class="lineno"> 8842</span>&#160;            pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    }</div><div class="line"><a name="l08846"></a><span class="lineno"> 8846</span>&#160;    <span class="keywordflow">else</span> <span class="comment">// !upperAddress</span></div><div class="line"><a name="l08847"></a><span class="lineno"> 8847</span>&#160;    {</div><div class="line"><a name="l08848"></a><span class="lineno"> 8848</span>&#160;        <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;            <span class="comment">// Try to allocate at the end of 1st vector.</span></div><div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;</div><div class="line"><a name="l08852"></a><span class="lineno"> 8852</span>&#160;            VkDeviceSize resultBaseOffset = 0;</div><div class="line"><a name="l08853"></a><span class="lineno"> 8853</span>&#160;            <span class="keywordflow">if</span>(!suballocations1st.empty())</div><div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160;            {</div><div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div><div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;                resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div><div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;            }</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;            <span class="comment">// Start from offset equal to beginning of free space.</span></div><div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;            VkDeviceSize resultOffset = resultBaseOffset;</div><div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>&#160;</div><div class="line"><a name="l08862"></a><span class="lineno"> 8862</span>&#160;            <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l08863"></a><span class="lineno"> 8863</span>&#160;            <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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;                resultOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>&#160;            }</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">// Apply alignment.</span></div><div class="line"><a name="l08869"></a><span class="lineno"> 8869</span>&#160;            resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div><div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;</div><div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;            <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;            <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations1st.empty())</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;                <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div><div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>&#160;                {</div><div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div><div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div><div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>&#160;                    {</div><div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;                        {</div><div class="line"><a name="l08883"></a><span class="lineno"> 8883</span>&#160;                            bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l08884"></a><span class="lineno"> 8884</span>&#160;                            <span class="keywordflow">break</span>;</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;                    }</div><div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160;                        <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08889"></a><span class="lineno"> 8889</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08890"></a><span class="lineno"> 8890</span>&#160;                }</div><div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>&#160;                {</div><div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>&#160;                    resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</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;            }</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="keyword">const</span> VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?</div><div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;                suballocations2nd.back().offset : size;</div><div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;</div><div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;            <span class="comment">// There is enough free space at the end after alignment.</span></div><div class="line"><a name="l08901"></a><span class="lineno"> 8901</span>&#160;            <span class="keywordflow">if</span>(resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= freeSpaceEnd)</div><div class="line"><a name="l08902"></a><span class="lineno"> 8902</span>&#160;            {</div><div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;                <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08904"></a><span class="lineno"> 8904</span>&#160;                <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l08905"></a><span class="lineno"> 8905</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;                    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</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="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div><div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160;                        <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;                            {</div><div class="line"><a name="l08914"></a><span class="lineno"> 8914</span>&#160;                                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;                        }</div><div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160;                        <span class="keywordflow">else</span></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;                            <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08920"></a><span class="lineno"> 8920</span>&#160;                            <span class="keywordflow">break</span>;</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;                    }</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;</div><div class="line"><a name="l08925"></a><span class="lineno"> 8925</span>&#160;                <span class="comment">// All tests passed: Success.</span></div><div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;                pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;                pAllocationRequest-&gt;sumFreeSize = freeSpaceEnd - resultBaseOffset;</div><div class="line"><a name="l08928"></a><span class="lineno"> 8928</span>&#160;                pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l08929"></a><span class="lineno"> 8929</span>&#160;                <span class="comment">// pAllocationRequest-&gt;item unused.</span></div><div class="line"><a name="l08930"></a><span class="lineno"> 8930</span>&#160;                pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l08931"></a><span class="lineno"> 8931</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>&#160;        <span class="comment">// Wrap-around to end of 2nd vector. Try to allocate there, watching for the</span></div><div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>&#160;        <span class="comment">// beginning of 1st vector as the end of free space.</span></div><div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>&#160;        <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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(!suballocations1st.empty());</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;            VkDeviceSize resultBaseOffset = 0;</div><div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;            <span class="keywordflow">if</span>(!suballocations2nd.empty())</div><div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>&#160;            {</div><div class="line"><a name="l08944"></a><span class="lineno"> 8944</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l08945"></a><span class="lineno"> 8945</span>&#160;                resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div><div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>&#160;            }</div><div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>&#160;</div><div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>&#160;            <span class="comment">// Start from offset equal to beginning of free space.</span></div><div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;            VkDeviceSize resultOffset = resultBaseOffset;</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;            <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;            <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160;            {</div><div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160;                resultOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;            }</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;            <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l08958"></a><span class="lineno"> 8958</span>&#160;            resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div><div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>&#160;</div><div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>&#160;            <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>&#160;            <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</div><div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>&#160;            {</div><div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;                <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )</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;                    <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations2nd[prevSuballocIndex];</div><div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div><div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160;                    {</div><div class="line"><a name="l08970"></a><span class="lineno"> 8970</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</div><div class="line"><a name="l08971"></a><span class="lineno"> 8971</span>&#160;                        {</div><div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>&#160;                            bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>&#160;                        }</div><div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>&#160;                    }</div><div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>&#160;                        <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08979"></a><span class="lineno"> 8979</span>&#160;                }</div><div class="line"><a name="l08980"></a><span class="lineno"> 8980</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l08981"></a><span class="lineno"> 8981</span>&#160;                {</div><div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>&#160;                    resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div><div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160;                }</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;            pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160;            pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;            <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>&#160;</div><div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>&#160;            <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160;            {</div><div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;                <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size() &amp;&amp;</div><div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;                    resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; suballocations1st[index1st].offset)</div><div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>&#160;                {</div><div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>&#160;                    <span class="comment">// Next colliding allocation at the beginning of 1st vector found. Try to make it lost.</span></div><div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div><div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;                    <span class="keywordflow">if</span>(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;                    {</div><div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;                        <span class="comment">// No problem.</span></div><div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160;                    }</div><div class="line"><a name="l09001"></a><span class="lineno"> 9001</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l09002"></a><span class="lineno"> 9002</span>&#160;                    {</div><div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>&#160;                        VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;                        <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;                            suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>&#160;                        {</div><div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>&#160;                            ++pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l09008"></a><span class="lineno"> 9008</span>&#160;                            pAllocationRequest-&gt;sumItemSize += suballoc.size;</div><div class="line"><a name="l09009"></a><span class="lineno"> 9009</span>&#160;                        }</div><div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l09011"></a><span class="lineno"> 9011</span>&#160;                        {</div><div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>&#160;                        }</div><div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>&#160;                    }</div><div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160;                    ++index1st;</div><div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;                }</div><div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>&#160;</div><div class="line"><a name="l09018"></a><span class="lineno"> 9018</span>&#160;                <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l09019"></a><span class="lineno"> 9019</span>&#160;                <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l09020"></a><span class="lineno"> 9020</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l09021"></a><span class="lineno"> 9021</span>&#160;                {</div><div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>&#160;                    <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size())</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div><div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>&#160;                        <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, suballoc.offset, bufferImageGranularity))</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;                            <span class="keywordflow">if</span>(suballoc.hAllocation != VK_NULL_HANDLE)</div><div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>&#160;                            {</div><div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>&#160;                                <span class="comment">// Not checking actual VmaIsBufferImageGranularityConflict(allocType, suballoc.type).</span></div><div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160;                                <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160;                                    suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>&#160;                                {</div><div class="line"><a name="l09033"></a><span class="lineno"> 9033</span>&#160;                                    ++pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l09034"></a><span class="lineno"> 9034</span>&#160;                                    pAllocationRequest-&gt;sumItemSize += suballoc.size;</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;                                <span class="keywordflow">else</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;                                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;                            }</div><div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>&#160;                        }</div><div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;                        {</div><div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>&#160;                            <span class="comment">// Already on next page.</span></div><div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;                            <span class="keywordflow">break</span>;</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;                        ++index1st;</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;                }</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="comment">// There is enough free space at the end after alignment.</span></div><div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160;            <span class="keywordflow">if</span>((index1st == suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt; size) ||</div><div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;                (index1st &lt; suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= suballocations1st[index1st].offset))</div><div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>&#160;            {</div><div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>&#160;                <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;                <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>&#160;                {</div><div class="line"><a name="l09060"></a><span class="lineno"> 9060</span>&#160;                    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = index1st;</div><div class="line"><a name="l09061"></a><span class="lineno"> 9061</span>&#160;                        nextSuballocIndex &lt; suballocations1st.size();</div><div class="line"><a name="l09062"></a><span class="lineno"> 9062</span>&#160;                        nextSuballocIndex++)</div><div class="line"><a name="l09063"></a><span class="lineno"> 9063</span>&#160;                    {</div><div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>&#160;                        <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations1st[nextSuballocIndex];</div><div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>&#160;                        <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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;                            <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;                            {</div><div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>&#160;                                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>&#160;                            }</div><div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>&#160;                        }</div><div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>&#160;                        {</div><div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>&#160;                            <span class="comment">// Already on next page.</span></div><div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;                            <span class="keywordflow">break</span>;</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;                    }</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;                <span class="comment">// All tests passed: Success.</span></div><div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>&#160;                pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>&#160;                pAllocationRequest-&gt;sumFreeSize =</div><div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;                    (index1st &lt; suballocations1st.size() ? suballocations1st[index1st].offset : size)</div><div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;                    - resultBaseOffset</div><div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160;                    - pAllocationRequest-&gt;sumItemSize;</div><div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160;                <span class="comment">// pAllocationRequest-&gt;item unused.</span></div><div class="line"><a name="l09087"></a><span class="lineno"> 9087</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09088"></a><span class="lineno"> 9088</span>&#160;            }</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;</div><div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09093"></a><span class="lineno"> 9093</span>&#160;}</div><div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>&#160;</div><div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::MakeRequestedAllocationsLost(</div><div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09097"></a><span class="lineno"> 9097</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09098"></a><span class="lineno"> 9098</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    <span class="keywordflow">if</span>(pAllocationRequest-&gt;itemsToMakeLostCount == 0)</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;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09103"></a><span class="lineno"> 9103</span>&#160;    }</div><div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>&#160;</div><div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;    VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);</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;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09108"></a><span class="lineno"> 9108</span>&#160;    <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09109"></a><span class="lineno"> 9109</span>&#160;    <span class="keywordtype">size_t</span> madeLostCount = 0;</div><div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>&#160;    <span class="keywordflow">while</span>(madeLostCount &lt; pAllocationRequest-&gt;itemsToMakeLostCount)</div><div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>&#160;    {</div><div class="line"><a name="l09112"></a><span class="lineno"> 9112</span>&#160;        VMA_ASSERT(index1st &lt; suballocations1st.size());</div><div class="line"><a name="l09113"></a><span class="lineno"> 9113</span>&#160;        VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div><div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>&#160;        {</div><div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;            VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>&#160;            VMA_ASSERT(suballoc.hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>&#160;            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>&#160;            {</div><div class="line"><a name="l09120"></a><span class="lineno"> 9120</span>&#160;                suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09121"></a><span class="lineno"> 9121</span>&#160;                suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09122"></a><span class="lineno"> 9122</span>&#160;                m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l09123"></a><span class="lineno"> 9123</span>&#160;                ++m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;                ++madeLostCount;</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="keywordflow">else</span></div><div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>&#160;            {</div><div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        }</div><div class="line"><a name="l09131"></a><span class="lineno"> 9131</span>&#160;        ++index1st;</div><div class="line"><a name="l09132"></a><span class="lineno"> 9132</span>&#160;    }</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;    CleanupAfterFree();</div><div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(Validate()); // Already called by ClanupAfterFree().</span></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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>&#160;}</div><div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>&#160;</div><div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160;{</div><div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;    </div><div class="line"><a name="l09144"></a><span class="lineno"> 9144</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09145"></a><span class="lineno"> 9145</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i &lt; count; ++i)</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;        VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l09150"></a><span class="lineno"> 9150</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l09151"></a><span class="lineno"> 9151</span>&#160;        {</div><div class="line"><a name="l09152"></a><span class="lineno"> 9152</span>&#160;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09153"></a><span class="lineno"> 9153</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>&#160;            ++m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>&#160;            m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;            ++lostAllocationCount;</div><div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>&#160;        }</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;</div><div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i &lt; count; ++i)</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;        VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l09164"></a><span class="lineno"> 9164</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l09165"></a><span class="lineno"> 9165</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l09166"></a><span class="lineno"> 9166</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>&#160;            ++m_2ndNullItemsCount;</div><div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;            ++lostAllocationCount;</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;    }</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;    <span class="keywordflow">if</span>(lostAllocationCount)</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;        CleanupAfterFree();</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;</div><div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</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;</div><div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>&#160;VkResult VmaBlockMetadata_Linear::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div><div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>&#160;{</div><div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i &lt; count; ++i)</div><div class="line"><a name="l09187"></a><span class="lineno"> 9187</span>&#160;    {</div><div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>&#160;        {</div><div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160;            {</div><div class="line"><a name="l09193"></a><span class="lineno"> 9193</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l09194"></a><span class="lineno"> 9194</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div><div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;            {</div><div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>&#160;            }</div><div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>&#160;        }</div><div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>&#160;    }</div><div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>&#160;</div><div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i &lt; count; ++i)</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>&#160;        {</div><div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>&#160;            {</div><div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l09213"></a><span class="lineno"> 9213</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l09214"></a><span class="lineno"> 9214</span>&#160;            }</div><div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div><div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>&#160;            {</div><div class="line"><a name="l09217"></a><span class="lineno"> 9217</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l09218"></a><span class="lineno"> 9218</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;            }</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;    }</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;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>&#160;}</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="keywordtype">void</span> VmaBlockMetadata_Linear::Alloc(</div><div class="line"><a name="l09227"></a><span class="lineno"> 9227</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l09228"></a><span class="lineno"> 9228</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09230"></a><span class="lineno"> 9230</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l09231"></a><span class="lineno"> 9231</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;{</div><div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;    <span class="keyword">const</span> VmaSuballocation newSuballoc = { request.offset, allocSize, hAllocation, type };</div><div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>&#160;</div><div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>&#160;    <span class="keywordflow">if</span>(upperAddress)</div><div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>&#160;    {</div><div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>&#160;        VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &amp;&amp;</div><div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160;            <span class="stringliteral">&quot;CRITICAL ERROR: Trying to use linear allocator as double stack while it was already used as ring buffer.&quot;</span>);</div><div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;        SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;        suballocations2nd.push_back(newSuballoc);</div><div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;        m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;</div><div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>&#160;    }</div><div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;    {</div><div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160;        SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160;</div><div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;        <span class="comment">// First allocation.</span></div><div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>&#160;        <span class="keywordflow">if</span>(suballocations1st.empty())</div><div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>&#160;        {</div><div class="line"><a name="l09250"></a><span class="lineno"> 9250</span>&#160;            suballocations1st.push_back(newSuballoc);</div><div class="line"><a name="l09251"></a><span class="lineno"> 9251</span>&#160;        }</div><div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;        {</div><div class="line"><a name="l09254"></a><span class="lineno"> 9254</span>&#160;            <span class="comment">// New allocation at the end of 1st vector.</span></div><div class="line"><a name="l09255"></a><span class="lineno"> 9255</span>&#160;            <span class="keywordflow">if</span>(request.offset &gt;= suballocations1st.back().offset + suballocations1st.back().size)</div><div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>&#160;            {</div><div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>&#160;                <span class="comment">// Check if it fits before the end of the block.</span></div><div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>&#160;                VMA_ASSERT(request.offset + allocSize &lt;= GetSize());</div><div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;                suballocations1st.push_back(newSuballoc);</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;            <span class="comment">// New allocation at the end of 2-part ring buffer, so before first allocation from 1st vector.</span></div><div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(request.offset + allocSize &lt;= suballocations1st[m_1stNullItemsBeginCount].offset)</div><div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>&#160;            {</div><div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>&#160;                SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>&#160;</div><div class="line"><a name="l09266"></a><span class="lineno"> 9266</span>&#160;                <span class="keywordflow">switch</span>(m_2ndVectorMode)</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="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div><div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;                    <span class="comment">// First allocation from second part ring buffer.</span></div><div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>&#160;                    VMA_ASSERT(suballocations2nd.empty());</div><div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>&#160;                    m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;</div><div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160;                <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div><div class="line"><a name="l09274"></a><span class="lineno"> 9274</span>&#160;                    <span class="comment">// 2-part ring buffer is already started.</span></div><div class="line"><a name="l09275"></a><span class="lineno"> 9275</span>&#160;                    VMA_ASSERT(!suballocations2nd.empty());</div><div class="line"><a name="l09276"></a><span class="lineno"> 9276</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09277"></a><span class="lineno"> 9277</span>&#160;                <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div><div class="line"><a name="l09278"></a><span class="lineno"> 9278</span>&#160;                    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL ERROR: Trying to use linear allocator as ring buffer while it was already used as double stack.&quot;</span>);</div><div class="line"><a name="l09279"></a><span class="lineno"> 9279</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160;                    VMA_ASSERT(0);</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;</div><div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>&#160;                suballocations2nd.push_back(newSuballoc);</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;            <span class="keywordflow">else</span></div><div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>&#160;            {</div><div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL INTERNAL ERROR.&quot;</span>);</div><div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>&#160;            }</div><div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>&#160;        }</div><div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>&#160;    }</div><div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>&#160;</div><div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160;    m_SumFreeSize -= newSuballoc.size;</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;</div><div class="line"><a name="l09296"></a><span class="lineno"> 9296</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l09297"></a><span class="lineno"> 9297</span>&#160;{</div><div class="line"><a name="l09298"></a><span class="lineno"> 9298</span>&#160;    FreeAtOffset(allocation-&gt;GetOffset());</div><div class="line"><a name="l09299"></a><span class="lineno"> 9299</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::FreeAtOffset(VkDeviceSize offset)</div><div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>&#160;{</div><div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>&#160;</div><div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div><div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;    {</div><div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>&#160;        <span class="comment">// First allocation: Mark it as next empty at the beginning.</span></div><div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>&#160;        VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>&#160;        <span class="keywordflow">if</span>(firstSuballoc.offset == offset)</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;            firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160;            firstSuballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>&#160;            m_SumFreeSize += firstSuballoc.size;</div><div class="line"><a name="l09315"></a><span class="lineno"> 9315</span>&#160;            ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l09316"></a><span class="lineno"> 9316</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>&#160;        }</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;</div><div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>&#160;    <span class="comment">// Last allocation in 2-part ring buffer or top of upper stack (same logic).</span></div><div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||</div><div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div><div class="line"><a name="l09324"></a><span class="lineno"> 9324</span>&#160;    {</div><div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>&#160;        VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l09326"></a><span class="lineno"> 9326</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div><div class="line"><a name="l09327"></a><span class="lineno"> 9327</span>&#160;        {</div><div class="line"><a name="l09328"></a><span class="lineno"> 9328</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div><div class="line"><a name="l09329"></a><span class="lineno"> 9329</span>&#160;            suballocations2nd.pop_back();</div><div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>&#160;        }</div><div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>&#160;    }</div><div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>&#160;    <span class="comment">// Last allocation in 1st vector.</span></div><div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY)</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;        VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div><div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div><div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>&#160;        {</div><div class="line"><a name="l09340"></a><span class="lineno"> 9340</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div><div class="line"><a name="l09341"></a><span class="lineno"> 9341</span>&#160;            suballocations1st.pop_back();</div><div class="line"><a name="l09342"></a><span class="lineno"> 9342</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09343"></a><span class="lineno"> 9343</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>&#160;        }</div><div class="line"><a name="l09345"></a><span class="lineno"> 9345</span>&#160;    }</div><div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>&#160;</div><div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160;    <span class="comment">// Item from the middle of 1st vector.</span></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;        VmaSuballocation refSuballoc;</div><div class="line"><a name="l09350"></a><span class="lineno"> 9350</span>&#160;        refSuballoc.offset = offset;</div><div class="line"><a name="l09351"></a><span class="lineno"> 9351</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div><div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;        SuballocationVectorType::iterator it = VmaVectorFindSorted&lt;VmaSuballocationOffsetLess&gt;(</div><div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>&#160;            suballocations1st.begin() + m_1stNullItemsBeginCount,</div><div class="line"><a name="l09354"></a><span class="lineno"> 9354</span>&#160;            suballocations1st.end(),</div><div class="line"><a name="l09355"></a><span class="lineno"> 9355</span>&#160;            refSuballoc);</div><div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>&#160;        <span class="keywordflow">if</span>(it != suballocations1st.end())</div><div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>&#160;        {</div><div class="line"><a name="l09358"></a><span class="lineno"> 9358</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09359"></a><span class="lineno"> 9359</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>&#160;            ++m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09361"></a><span class="lineno"> 9361</span>&#160;            m_SumFreeSize += it-&gt;size;</div><div class="line"><a name="l09362"></a><span class="lineno"> 9362</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09363"></a><span class="lineno"> 9363</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>&#160;        }</div><div class="line"><a name="l09365"></a><span class="lineno"> 9365</span>&#160;    }</div><div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>&#160;</div><div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode != SECOND_VECTOR_EMPTY)</div><div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>&#160;    {</div><div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>&#160;        <span class="comment">// Item from the middle of 2nd vector.</span></div><div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>&#160;        VmaSuballocation refSuballoc;</div><div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>&#160;        refSuballoc.offset = offset;</div><div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div><div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>&#160;        SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?</div><div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>&#160;            VmaVectorFindSorted&lt;VmaSuballocationOffsetLess&gt;(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc) :</div><div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>&#160;            VmaVectorFindSorted&lt;VmaSuballocationOffsetGreater&gt;(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc);</div><div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>&#160;        <span class="keywordflow">if</span>(it != suballocations2nd.end())</div><div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>&#160;        {</div><div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>&#160;            ++m_2ndNullItemsCount;</div><div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>&#160;            m_SumFreeSize += it-&gt;size;</div><div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09383"></a><span class="lineno"> 9383</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l09384"></a><span class="lineno"> 9384</span>&#160;        }</div><div class="line"><a name="l09385"></a><span class="lineno"> 9385</span>&#160;    }</div><div class="line"><a name="l09386"></a><span class="lineno"> 9386</span>&#160;</div><div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation to free not found in linear allocator!&quot;</span>);</div><div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>&#160;}</div><div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>&#160;</div><div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::ShouldCompact1st()<span class="keyword"> const</span></div><div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocCount = AccessSuballocations1st().size();</div><div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>&#160;    <span class="keywordflow">return</span> suballocCount &gt; 32 &amp;&amp; nullItemCount * 2 &gt;= (suballocCount - nullItemCount) * 3;</div><div class="line"><a name="l09395"></a><span class="lineno"> 9395</span>&#160;}</div><div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>&#160;</div><div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::CleanupAfterFree()</div><div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>&#160;{</div><div class="line"><a name="l09399"></a><span class="lineno"> 9399</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>&#160;</div><div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>&#160;    {</div><div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>&#160;        suballocations1st.clear();</div><div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>&#160;        suballocations2nd.clear();</div><div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>&#160;        m_1stNullItemsBeginCount = 0;</div><div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>&#160;        m_1stNullItemsMiddleCount = 0;</div><div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>&#160;        m_2ndNullItemsCount = 0;</div><div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>&#160;        m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div><div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>&#160;    }</div><div class="line"><a name="l09411"></a><span class="lineno"> 9411</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09412"></a><span class="lineno"> 9412</span>&#160;    {</div><div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l09414"></a><span class="lineno"> 9414</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>&#160;        VMA_ASSERT(nullItem1stCount &lt;= suballoc1stCount);</div><div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>&#160;</div><div class="line"><a name="l09417"></a><span class="lineno"> 9417</span>&#160;        <span class="comment">// Find more null items at the beginning of 1st vector.</span></div><div class="line"><a name="l09418"></a><span class="lineno"> 9418</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>&#160;            suballocations1st[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>&#160;        {</div><div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>&#160;            ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>&#160;            --m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>&#160;        }</div><div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>&#160;</div><div class="line"><a name="l09425"></a><span class="lineno"> 9425</span>&#160;        <span class="comment">// Find more null items at the end of 1st vector.</span></div><div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsMiddleCount &gt; 0 &amp;&amp;</div><div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>&#160;            suballocations1st.back().hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>&#160;        {</div><div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>&#160;            --m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>&#160;            suballocations1st.pop_back();</div><div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>&#160;        }</div><div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>&#160;</div><div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>&#160;        <span class="comment">// Find more null items at the end of 2nd vector.</span></div><div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div><div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>&#160;            suballocations2nd.back().hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>&#160;        {</div><div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>&#160;            --m_2ndNullItemsCount;</div><div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>&#160;            suballocations2nd.pop_back();</div><div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>&#160;        }</div><div class="line"><a name="l09440"></a><span class="lineno"> 9440</span>&#160;</div><div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>&#160;        <span class="keywordflow">if</span>(ShouldCompact1st())</div><div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>&#160;        {</div><div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> nonNullItemCount = suballoc1stCount - nullItem1stCount;</div><div class="line"><a name="l09444"></a><span class="lineno"> 9444</span>&#160;            <span class="keywordtype">size_t</span> srcIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstIndex = 0; dstIndex &lt; nonNullItemCount; ++dstIndex)</div><div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>&#160;            {</div><div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>&#160;                <span class="keywordflow">while</span>(suballocations1st[srcIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>&#160;                {</div><div class="line"><a name="l09449"></a><span class="lineno"> 9449</span>&#160;                    ++srcIndex;</div><div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>&#160;                }</div><div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>&#160;                <span class="keywordflow">if</span>(dstIndex != srcIndex)</div><div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>&#160;                {</div><div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>&#160;                    suballocations1st[dstIndex] = suballocations1st[srcIndex];</div><div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>&#160;                }</div><div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>&#160;                ++srcIndex;</div><div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>&#160;            }</div><div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>&#160;            suballocations1st.resize(nonNullItemCount);</div><div class="line"><a name="l09458"></a><span class="lineno"> 9458</span>&#160;            m_1stNullItemsBeginCount = 0;</div><div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>&#160;            m_1stNullItemsMiddleCount = 0;</div><div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>&#160;        }</div><div class="line"><a name="l09461"></a><span class="lineno"> 9461</span>&#160;</div><div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>&#160;        <span class="comment">// 2nd vector became empty.</span></div><div class="line"><a name="l09463"></a><span class="lineno"> 9463</span>&#160;        <span class="keywordflow">if</span>(suballocations2nd.empty())</div><div class="line"><a name="l09464"></a><span class="lineno"> 9464</span>&#160;        {</div><div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>&#160;            m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div><div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>&#160;        }</div><div class="line"><a name="l09467"></a><span class="lineno"> 9467</span>&#160;</div><div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>&#160;        <span class="comment">// 1st vector became empty.</span></div><div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>&#160;        <span class="keywordflow">if</span>(suballocations1st.size() - m_1stNullItemsBeginCount == 0)</div><div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>&#160;        {</div><div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>&#160;            suballocations1st.clear();</div><div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>&#160;            m_1stNullItemsBeginCount = 0;</div><div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>&#160;</div><div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>&#160;            <span class="keywordflow">if</span>(!suballocations2nd.empty() &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l09475"></a><span class="lineno"> 9475</span>&#160;            {</div><div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>&#160;                <span class="comment">// Swap 1st with 2nd. Now 2nd is empty.</span></div><div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div><div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>&#160;                m_1stNullItemsMiddleCount = m_2ndNullItemsCount;</div><div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>&#160;                <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballocations2nd.size() &amp;&amp;</div><div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>&#160;                    suballocations2nd[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>&#160;                {</div><div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>&#160;                    ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>&#160;                    --m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>&#160;                }</div><div class="line"><a name="l09485"></a><span class="lineno"> 9485</span>&#160;                m_2ndNullItemsCount = 0;</div><div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>&#160;                m_1stVectorIndex ^= 1;</div><div class="line"><a name="l09487"></a><span class="lineno"> 9487</span>&#160;            }</div><div class="line"><a name="l09488"></a><span class="lineno"> 9488</span>&#160;        }</div><div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>&#160;    }</div><div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>&#160;</div><div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>&#160;}</div><div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>&#160;</div><div class="line"><a name="l09494"></a><span class="lineno"> 9494</span>&#160;</div><div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>&#160;<span class="comment">// class VmaBlockMetadata_Buddy</span></div><div class="line"><a name="l09497"></a><span class="lineno"> 9497</span>&#160;</div><div class="line"><a name="l09498"></a><span class="lineno"> 9498</span>&#160;VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>&#160;    m_Root(VMA_NULL),</div><div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>&#160;    m_AllocationCount(0),</div><div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>&#160;    m_FreeCount(1),</div><div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>&#160;    m_SumFreeSize(0)</div><div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>&#160;{</div><div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>&#160;    memset(m_FreeList, 0, <span class="keyword">sizeof</span>(m_FreeList));</div><div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>&#160;}</div><div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>&#160;</div><div class="line"><a name="l09508"></a><span class="lineno"> 9508</span>&#160;VmaBlockMetadata_Buddy::~VmaBlockMetadata_Buddy()</div><div class="line"><a name="l09509"></a><span class="lineno"> 9509</span>&#160;{</div><div class="line"><a name="l09510"></a><span class="lineno"> 9510</span>&#160;    DeleteNode(m_Root);</div><div class="line"><a name="l09511"></a><span class="lineno"> 9511</span>&#160;}</div><div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>&#160;</div><div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Init(VkDeviceSize size)</div><div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>&#160;{</div><div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>&#160;    VmaBlockMetadata::Init(size);</div><div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>&#160;</div><div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>&#160;    m_UsableSize = VmaPrevPow2(size);</div><div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>&#160;    m_SumFreeSize = m_UsableSize;</div><div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>&#160;</div><div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>&#160;    <span class="comment">// Calculate m_LevelCount.</span></div><div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>&#160;    m_LevelCount = 1;</div><div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>&#160;    <span class="keywordflow">while</span>(m_LevelCount &lt; MAX_LEVELS &amp;&amp;</div><div class="line"><a name="l09523"></a><span class="lineno"> 9523</span>&#160;        LevelToNodeSize(m_LevelCount) &gt;= MIN_NODE_SIZE)</div><div class="line"><a name="l09524"></a><span class="lineno"> 9524</span>&#160;    {</div><div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>&#160;        ++m_LevelCount;</div><div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>&#160;    }</div><div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>&#160;</div><div class="line"><a name="l09528"></a><span class="lineno"> 9528</span>&#160;    Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>&#160;    rootNode-&gt;offset = 0;</div><div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>&#160;    rootNode-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>&#160;    rootNode-&gt;parent = VMA_NULL;</div><div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>&#160;    rootNode-&gt;buddy = VMA_NULL;</div><div class="line"><a name="l09533"></a><span class="lineno"> 9533</span>&#160;</div><div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>&#160;    m_Root = rootNode;</div><div class="line"><a name="l09535"></a><span class="lineno"> 9535</span>&#160;    AddToFreeListFront(0, rootNode);</div><div class="line"><a name="l09536"></a><span class="lineno"> 9536</span>&#160;}</div><div class="line"><a name="l09537"></a><span class="lineno"> 9537</span>&#160;</div><div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09540"></a><span class="lineno"> 9540</span>&#160;    <span class="comment">// Validate tree.</span></div><div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>&#160;    ValidationContext ctx;</div><div class="line"><a name="l09542"></a><span class="lineno"> 9542</span>&#160;    <span class="keywordflow">if</span>(!ValidateNode(ctx, VMA_NULL, m_Root, 0, LevelToNodeSize(0)))</div><div class="line"><a name="l09543"></a><span class="lineno"> 9543</span>&#160;    {</div><div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>&#160;        VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode failed.&quot;</span>);</div><div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>&#160;    }</div><div class="line"><a name="l09546"></a><span class="lineno"> 9546</span>&#160;    VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);</div><div class="line"><a name="l09547"></a><span class="lineno"> 9547</span>&#160;    VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);</div><div class="line"><a name="l09548"></a><span class="lineno"> 9548</span>&#160;</div><div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>&#160;    <span class="comment">// Validate free node lists.</span></div><div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div><div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>&#160;    {</div><div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL ||</div><div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>&#160;            m_FreeList[level].front-&gt;free.prev == VMA_NULL);</div><div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>&#160;</div><div class="line"><a name="l09555"></a><span class="lineno"> 9555</span>&#160;        <span class="keywordflow">for</span>(Node* node = m_FreeList[level].front;</div><div class="line"><a name="l09556"></a><span class="lineno"> 9556</span>&#160;            node != VMA_NULL;</div><div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>&#160;            node = node-&gt;free.next)</div><div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>&#160;        {</div><div class="line"><a name="l09559"></a><span class="lineno"> 9559</span>&#160;            VMA_VALIDATE(node-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>&#160;            </div><div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>&#160;            <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div><div class="line"><a name="l09562"></a><span class="lineno"> 9562</span>&#160;            {</div><div class="line"><a name="l09563"></a><span class="lineno"> 9563</span>&#160;                VMA_VALIDATE(m_FreeList[level].back == node);</div><div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>&#160;            }</div><div class="line"><a name="l09565"></a><span class="lineno"> 9565</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>&#160;            {</div><div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>&#160;                VMA_VALIDATE(node-&gt;free.next-&gt;free.prev == node);</div><div class="line"><a name="l09568"></a><span class="lineno"> 9568</span>&#160;            }</div><div class="line"><a name="l09569"></a><span class="lineno"> 9569</span>&#160;        }</div><div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>&#160;    }</div><div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>&#160;</div><div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>&#160;    <span class="comment">// Validate that free lists ar higher levels are empty.</span></div><div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = m_LevelCount; level &lt; MAX_LEVELS; ++level)</div><div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>&#160;    {</div><div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL &amp;&amp; m_FreeList[level].back == VMA_NULL);</div><div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>&#160;    }</div><div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>&#160;</div><div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>&#160;}</div><div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>&#160;</div><div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>&#160;VkDeviceSize VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div><div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>&#160;    {</div><div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>&#160;        <span class="keywordflow">if</span>(m_FreeList[level].front != VMA_NULL)</div><div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>&#160;        {</div><div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>&#160;            <span class="keywordflow">return</span> LevelToNodeSize(level);</div><div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>&#160;        }</div><div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>&#160;    }</div><div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>&#160;    <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>&#160;}</div><div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>&#160;</div><div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::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="l09594"></a><span class="lineno"> 9594</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div><div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>&#160;</div><div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>&#160;</div><div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>&#160;</div><div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l09603"></a><span class="lineno"> 9603</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#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = 0; <span class="comment">// Unused.</span></div><div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>&#160;</div><div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>&#160;    CalcAllocationStatInfoNode(outInfo, m_Root, LevelToNodeSize(0));</div><div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>&#160;</div><div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div><div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>&#160;    {</div><div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusableSize;</div><div class="line"><a name="l09612"></a><span class="lineno"> 9612</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>, unusableSize);</div><div class="line"><a name="l09613"></a><span class="lineno"> 9613</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>, unusableSize);</div><div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>&#160;    }</div><div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>&#160;}</div><div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>&#160;</div><div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::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="l09618"></a><span class="lineno"> 9618</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div><div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>&#160;</div><div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div><div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize + unusableSize;</div><div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += m_AllocationCount;</div><div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l09625"></a><span class="lineno"> 9625</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="l09626"></a><span class="lineno"> 9626</span>&#160;</div><div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div><div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>&#160;    {</div><div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>&#160;        ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>&#160;        <span class="comment">// Not updating inoutStats.unusedRangeSizeMax with unusableSize because this space is not available for allocations.</span></div><div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>&#160;    }</div><div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>&#160;}</div><div class="line"><a name="l09633"></a><span class="lineno"> 9633</span>&#160;</div><div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>&#160;</div><div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>&#160;    <span class="comment">// TODO optimize</span></div><div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> stat;</div><div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>&#160;    CalcAllocationStatInfo(stat);</div><div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>&#160;</div><div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>&#160;    PrintDetailedMap_Begin(</div><div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>&#160;        json,</div><div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>,</div><div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>,</div><div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div><div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>&#160;</div><div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>&#160;    PrintDetailedMapNode(json, m_Root, LevelToNodeSize(0));</div><div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>&#160;</div><div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div><div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div><div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>&#160;    {</div><div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>&#160;        PrintDetailedMap_UnusedRange(json,</div><div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>&#160;            m_UsableSize, <span class="comment">// offset</span></div><div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>&#160;            unusableSize); <span class="comment">// size</span></div><div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>&#160;    }</div><div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>&#160;</div><div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>&#160;    PrintDetailedMap_End(json);</div><div class="line"><a name="l09659"></a><span class="lineno"> 9659</span>&#160;}</div><div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>&#160;</div><div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>&#160;</div><div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::CreateAllocationRequest(</div><div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>&#160;{</div><div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>&#160;    VMA_ASSERT(!upperAddress &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT can be used only with linear algorithm.&quot;</span>);</div><div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>&#160;</div><div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>&#160;    <span class="comment">// Simple way to respect bufferImageGranularity. May be optimized some day.</span></div><div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>&#160;    <span class="comment">// Whenever it might be an OPTIMAL image...</span></div><div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>&#160;    <span class="keywordflow">if</span>(allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||</div><div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)</div><div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>&#160;    {</div><div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>&#160;        allocAlignment = VMA_MAX(allocAlignment, bufferImageGranularity);</div><div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>&#160;        allocSize = VMA_MAX(allocSize, bufferImageGranularity);</div><div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>&#160;    }</div><div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>&#160;</div><div class="line"><a name="l09687"></a><span class="lineno"> 9687</span>&#160;    <span class="keywordflow">if</span>(allocSize &gt; m_UsableSize)</div><div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>&#160;    {</div><div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>&#160;    }</div><div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>&#160;</div><div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div><div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = targetLevel + 1; level--; )</div><div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>&#160;    {</div><div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>&#160;        <span class="keywordflow">for</span>(Node* freeNode = m_FreeList[level].front;</div><div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>&#160;            freeNode != VMA_NULL;</div><div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>&#160;            freeNode = freeNode-&gt;free.next)</div><div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>&#160;        {</div><div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>&#160;            <span class="keywordflow">if</span>(freeNode-&gt;offset % allocAlignment == 0)</div><div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>&#160;            {</div><div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>&#160;                pAllocationRequest-&gt;offset = freeNode-&gt;offset;</div><div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>&#160;                pAllocationRequest-&gt;sumFreeSize = LevelToNodeSize(level);</div><div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>&#160;                pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>&#160;                pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>&#160;                pAllocationRequest-&gt;customData = (<span class="keywordtype">void</span>*)(uintptr_t)level;</div><div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>&#160;            }</div><div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>&#160;        }</div><div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>&#160;    }</div><div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>&#160;</div><div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>&#160;}</div><div class="line"><a name="l09713"></a><span class="lineno"> 9713</span>&#160;</div><div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::MakeRequestedAllocationsLost(</div><div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>&#160;{</div><div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div><div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>&#160;<span class="comment">    Support might be added in the future.</span></div><div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>&#160;    <span class="keywordflow">return</span> pAllocationRequest-&gt;itemsToMakeLostCount == 0;</div><div class="line"><a name="l09724"></a><span class="lineno"> 9724</span>&#160;}</div><div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>&#160;</div><div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>&#160;uint32_t VmaBlockMetadata_Buddy::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>&#160;{</div><div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div><div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>&#160;<span class="comment">    Support might be added in the future.</span></div><div class="line"><a name="l09731"></a><span class="lineno"> 9731</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>&#160;    <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l09733"></a><span class="lineno"> 9733</span>&#160;}</div><div class="line"><a name="l09734"></a><span class="lineno"> 9734</span>&#160;</div><div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Alloc(</div><div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>&#160;{</div><div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div><div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>&#160;    uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;</div><div class="line"><a name="l09744"></a><span class="lineno"> 9744</span>&#160;    </div><div class="line"><a name="l09745"></a><span class="lineno"> 9745</span>&#160;    Node* currNode = m_FreeList[currLevel].front;</div><div class="line"><a name="l09746"></a><span class="lineno"> 9746</span>&#160;    VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09747"></a><span class="lineno"> 9747</span>&#160;    <span class="keywordflow">while</span>(currNode-&gt;offset != request.offset)</div><div class="line"><a name="l09748"></a><span class="lineno"> 9748</span>&#160;    {</div><div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>&#160;        currNode = currNode-&gt;free.next;</div><div class="line"><a name="l09750"></a><span class="lineno"> 9750</span>&#160;        VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09751"></a><span class="lineno"> 9751</span>&#160;    }</div><div class="line"><a name="l09752"></a><span class="lineno"> 9752</span>&#160;    </div><div class="line"><a name="l09753"></a><span class="lineno"> 9753</span>&#160;    <span class="comment">// Go down, splitting free nodes.</span></div><div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>&#160;    <span class="keywordflow">while</span>(currLevel &lt; targetLevel)</div><div class="line"><a name="l09755"></a><span class="lineno"> 9755</span>&#160;    {</div><div class="line"><a name="l09756"></a><span class="lineno"> 9756</span>&#160;        <span class="comment">// currNode is already first free node at currLevel.</span></div><div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>&#160;        <span class="comment">// Remove it from list of free nodes at this currLevel.</span></div><div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>&#160;        RemoveFromFreeList(currLevel, currNode);</div><div class="line"><a name="l09759"></a><span class="lineno"> 9759</span>&#160;         </div><div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>&#160;        <span class="keyword">const</span> uint32_t childrenLevel = currLevel + 1;</div><div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>&#160;</div><div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>&#160;        <span class="comment">// Create two free sub-nodes.</span></div><div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>&#160;        Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>&#160;        Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>&#160;</div><div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>&#160;        leftChild-&gt;offset = currNode-&gt;offset;</div><div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>&#160;        leftChild-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>&#160;        leftChild-&gt;parent = currNode;</div><div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>&#160;        leftChild-&gt;buddy = rightChild;</div><div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>&#160;</div><div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>&#160;        rightChild-&gt;offset = currNode-&gt;offset + LevelToNodeSize(childrenLevel);</div><div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>&#160;        rightChild-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>&#160;        rightChild-&gt;parent = currNode;</div><div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>&#160;        rightChild-&gt;buddy = leftChild;</div><div class="line"><a name="l09775"></a><span class="lineno"> 9775</span>&#160;</div><div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>&#160;        <span class="comment">// Convert current currNode to split type.</span></div><div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>&#160;        currNode-&gt;type = Node::TYPE_SPLIT;</div><div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>&#160;        currNode-&gt;split.leftChild = leftChild;</div><div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>&#160;</div><div class="line"><a name="l09780"></a><span class="lineno"> 9780</span>&#160;        <span class="comment">// Add child nodes to free list. Order is important!</span></div><div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>&#160;        AddToFreeListFront(childrenLevel, rightChild);</div><div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>&#160;        AddToFreeListFront(childrenLevel, leftChild);</div><div class="line"><a name="l09783"></a><span class="lineno"> 9783</span>&#160;</div><div class="line"><a name="l09784"></a><span class="lineno"> 9784</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>&#160;        <span class="comment">//m_SumFreeSize -= LevelToNodeSize(currLevel) % 2; // Useful only when level node sizes can be non power of 2.</span></div><div class="line"><a name="l09786"></a><span class="lineno"> 9786</span>&#160;        ++currLevel;</div><div class="line"><a name="l09787"></a><span class="lineno"> 9787</span>&#160;        currNode = m_FreeList[currLevel].front;</div><div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>&#160;</div><div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>&#160;<span class="comment">        We can be sure that currNode, as left child of node previously split,</span></div><div class="line"><a name="l09791"></a><span class="lineno"> 9791</span>&#160;<span class="comment">        also fullfills the alignment requirement.</span></div><div class="line"><a name="l09792"></a><span class="lineno"> 9792</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>&#160;    }</div><div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>&#160;</div><div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>&#160;    <span class="comment">// Remove from free list.</span></div><div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>&#160;    VMA_ASSERT(currLevel == targetLevel &amp;&amp;</div><div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>&#160;        currNode != VMA_NULL &amp;&amp;</div><div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>&#160;        currNode-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>&#160;    RemoveFromFreeList(currLevel, currNode);</div><div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>&#160;</div><div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>&#160;    <span class="comment">// Convert to allocation node.</span></div><div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>&#160;    currNode-&gt;type = Node::TYPE_ALLOCATION;</div><div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>&#160;    currNode-&gt;allocation.alloc = hAllocation;</div><div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>&#160;</div><div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>&#160;    ++m_AllocationCount;</div><div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>&#160;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>&#160;}</div><div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>&#160;</div><div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::DeleteNode(Node* node)</div><div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>&#160;{</div><div class="line"><a name="l09812"></a><span class="lineno"> 9812</span>&#160;    <span class="keywordflow">if</span>(node-&gt;type == Node::TYPE_SPLIT)</div><div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>&#160;    {</div><div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>&#160;        DeleteNode(node-&gt;split.leftChild-&gt;buddy);</div><div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>&#160;        DeleteNode(node-&gt;split.leftChild);</div><div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>&#160;    }</div><div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>&#160;</div><div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>&#160;    vma_delete(GetAllocationCallbacks(), node);</div><div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>&#160;}</div><div class="line"><a name="l09820"></a><span class="lineno"> 9820</span>&#160;</div><div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::ValidateNode(ValidationContext&amp; ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div><div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>&#160;    VMA_VALIDATE(level &lt; m_LevelCount);</div><div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>&#160;    VMA_VALIDATE(curr-&gt;parent == parent);</div><div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>&#160;    VMA_VALIDATE((curr-&gt;buddy == VMA_NULL) == (parent == VMA_NULL));</div><div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>&#160;    VMA_VALIDATE(curr-&gt;buddy == VMA_NULL || curr-&gt;buddy-&gt;buddy == curr);</div><div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>&#160;    <span class="keywordflow">switch</span>(curr-&gt;type)</div><div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>&#160;    {</div><div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>&#160;        <span class="comment">// curr-&gt;free.prev, next are validated separately.</span></div><div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize;</div><div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>&#160;        ++ctx.calculatedFreeCount;</div><div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div><div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>&#160;        ++ctx.calculatedAllocationCount;</div><div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize - curr-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>&#160;        VMA_VALIDATE(curr-&gt;allocation.alloc != VK_NULL_HANDLE);</div><div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div><div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>&#160;        {</div><div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>&#160;            <span class="keyword">const</span> uint32_t childrenLevel = level + 1;</div><div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenLevelNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = curr-&gt;split.leftChild;</div><div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>&#160;            VMA_VALIDATE(leftChild != VMA_NULL);</div><div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>&#160;            VMA_VALIDATE(leftChild-&gt;offset == curr-&gt;offset);</div><div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, leftChild, childrenLevel, childrenLevelNodeSize))</div><div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>&#160;            {</div><div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>&#160;                VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode for left child failed.&quot;</span>);</div><div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>&#160;            }</div><div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>&#160;            VMA_VALIDATE(rightChild-&gt;offset == curr-&gt;offset + childrenLevelNodeSize);</div><div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, rightChild, childrenLevel, childrenLevelNodeSize))</div><div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>&#160;            {</div><div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>&#160;                VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode for right child failed.&quot;</span>);</div><div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>&#160;            }</div><div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>&#160;        }</div><div class="line"><a name="l09857"></a><span class="lineno"> 9857</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09858"></a><span class="lineno"> 9858</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>&#160;    }</div><div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>&#160;</div><div class="line"><a name="l09862"></a><span class="lineno"> 9862</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>&#160;}</div><div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>&#160;</div><div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>&#160;uint32_t VmaBlockMetadata_Buddy::AllocSizeToLevel(VkDeviceSize allocSize)<span class="keyword"> const</span></div><div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>&#160;    <span class="comment">// I know this could be optimized somehow e.g. by using std::log2p1 from C++20.</span></div><div class="line"><a name="l09868"></a><span class="lineno"> 9868</span>&#160;    uint32_t level = 0;</div><div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>&#160;    VkDeviceSize currLevelNodeSize = m_UsableSize;</div><div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>&#160;    VkDeviceSize nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>&#160;    <span class="keywordflow">while</span>(allocSize &lt;= nextLevelNodeSize &amp;&amp; level + 1 &lt; m_LevelCount)</div><div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>&#160;    {</div><div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>&#160;        ++level;</div><div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>&#160;        currLevelNodeSize = nextLevelNodeSize;</div><div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>&#160;        nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l09876"></a><span class="lineno"> 9876</span>&#160;    }</div><div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>&#160;    <span class="keywordflow">return</span> level;</div><div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>&#160;}</div><div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>&#160;</div><div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset)</div><div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>&#160;{</div><div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>&#160;    <span class="comment">// Find node and level.</span></div><div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>&#160;    Node* node = m_Root;</div><div class="line"><a name="l09884"></a><span class="lineno"> 9884</span>&#160;    VkDeviceSize nodeOffset = 0;</div><div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>&#160;    uint32_t level = 0;</div><div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>&#160;    VkDeviceSize levelNodeSize = LevelToNodeSize(0);</div><div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>&#160;    <span class="keywordflow">while</span>(node-&gt;type == Node::TYPE_SPLIT)</div><div class="line"><a name="l09888"></a><span class="lineno"> 9888</span>&#160;    {</div><div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>&#160;        <span class="keyword">const</span> VkDeviceSize nextLevelSize = levelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>&#160;        <span class="keywordflow">if</span>(offset &lt; nodeOffset + nextLevelSize)</div><div class="line"><a name="l09891"></a><span class="lineno"> 9891</span>&#160;        {</div><div class="line"><a name="l09892"></a><span class="lineno"> 9892</span>&#160;            node = node-&gt;split.leftChild;</div><div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>&#160;        }</div><div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>&#160;        {</div><div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>&#160;            node = node-&gt;split.leftChild-&gt;buddy;</div><div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>&#160;            nodeOffset += nextLevelSize;</div><div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>&#160;        }</div><div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>&#160;        ++level;</div><div class="line"><a name="l09900"></a><span class="lineno"> 9900</span>&#160;        levelNodeSize = nextLevelSize;</div><div class="line"><a name="l09901"></a><span class="lineno"> 9901</span>&#160;    }</div><div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>&#160;</div><div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>&#160;    VMA_ASSERT(node != VMA_NULL &amp;&amp; node-&gt;type == Node::TYPE_ALLOCATION);</div><div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>&#160;    VMA_ASSERT(alloc == VK_NULL_HANDLE || node-&gt;allocation.alloc == alloc);</div><div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>&#160;</div><div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>&#160;    --m_AllocationCount;</div><div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>&#160;    m_SumFreeSize += alloc-&gt;GetSize();</div><div class="line"><a name="l09909"></a><span class="lineno"> 9909</span>&#160;</div><div class="line"><a name="l09910"></a><span class="lineno"> 9910</span>&#160;    node-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>&#160;</div><div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>&#160;    <span class="comment">// Join free nodes if possible.</span></div><div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>&#160;    <span class="keywordflow">while</span>(level &gt; 0 &amp;&amp; node-&gt;buddy-&gt;type == Node::TYPE_FREE)</div><div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>&#160;    {</div><div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>&#160;        RemoveFromFreeList(level, node-&gt;buddy);</div><div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>&#160;        Node* <span class="keyword">const</span> parent = node-&gt;parent;</div><div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>&#160;</div><div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>&#160;        vma_delete(GetAllocationCallbacks(), node-&gt;buddy);</div><div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>&#160;        vma_delete(GetAllocationCallbacks(), node);</div><div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>&#160;        parent-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>&#160;        </div><div class="line"><a name="l09922"></a><span class="lineno"> 9922</span>&#160;        node = parent;</div><div class="line"><a name="l09923"></a><span class="lineno"> 9923</span>&#160;        --level;</div><div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>&#160;        <span class="comment">//m_SumFreeSize += LevelToNodeSize(level) % 2; // Useful only when level node sizes can be non power of 2.</span></div><div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>&#160;        --m_FreeCount;</div><div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>&#160;    }</div><div class="line"><a name="l09927"></a><span class="lineno"> 9927</span>&#160;</div><div class="line"><a name="l09928"></a><span class="lineno"> 9928</span>&#160;    AddToFreeListFront(level, node);</div><div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>&#160;}</div><div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>&#160;</div><div class="line"><a name="l09931"></a><span class="lineno"> 9931</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div><div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div><div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>&#160;    {</div><div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l09936"></a><span class="lineno"> 9936</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += levelNodeSize;</div><div class="line"><a name="l09938"></a><span class="lineno"> 9938</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>, levelNodeSize);</div><div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, levelNodeSize);</div><div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div><div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>&#160;        {</div><div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>&#160;            ++outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += allocSize;</div><div class="line"><a name="l09946"></a><span class="lineno"> 9946</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>, allocSize);</div><div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocSize);</div><div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>&#160;</div><div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>&#160;            <span class="keyword">const</span> VkDeviceSize unusedRangeSize = levelNodeSize - allocSize;</div><div class="line"><a name="l09950"></a><span class="lineno"> 9950</span>&#160;            <span class="keywordflow">if</span>(unusedRangeSize &gt; 0)</div><div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>&#160;            {</div><div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l09954"></a><span class="lineno"> 9954</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>, unusedRangeSize);</div><div class="line"><a name="l09955"></a><span class="lineno"> 9955</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div><div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>&#160;            }</div><div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>&#160;        }</div><div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div><div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>&#160;        {</div><div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div><div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>&#160;            CalcAllocationStatInfoNode(outInfo, leftChild, childrenNodeSize);</div><div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>&#160;            CalcAllocationStatInfoNode(outInfo, rightChild, childrenNodeSize);</div><div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>&#160;        }</div><div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09970"></a><span class="lineno"> 9970</span>&#160;    }</div><div class="line"><a name="l09971"></a><span class="lineno"> 9971</span>&#160;}</div><div class="line"><a name="l09972"></a><span class="lineno"> 9972</span>&#160;</div><div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddToFreeListFront(uint32_t level, Node* node)</div><div class="line"><a name="l09974"></a><span class="lineno"> 9974</span>&#160;{</div><div class="line"><a name="l09975"></a><span class="lineno"> 9975</span>&#160;    VMA_ASSERT(node-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>&#160;</div><div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>&#160;    <span class="comment">// List is empty.</span></div><div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>&#160;    Node* <span class="keyword">const</span> frontNode = m_FreeList[level].front;</div><div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>&#160;    <span class="keywordflow">if</span>(frontNode == VMA_NULL)</div><div class="line"><a name="l09980"></a><span class="lineno"> 9980</span>&#160;    {</div><div class="line"><a name="l09981"></a><span class="lineno"> 9981</span>&#160;        VMA_ASSERT(m_FreeList[level].back == VMA_NULL);</div><div class="line"><a name="l09982"></a><span class="lineno"> 9982</span>&#160;        node-&gt;free.prev = node-&gt;free.next = VMA_NULL;</div><div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>&#160;        m_FreeList[level].front = m_FreeList[level].back = node;</div><div class="line"><a name="l09984"></a><span class="lineno"> 9984</span>&#160;    }</div><div class="line"><a name="l09985"></a><span class="lineno"> 9985</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>&#160;    {</div><div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>&#160;        VMA_ASSERT(frontNode-&gt;free.prev == VMA_NULL);</div><div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>&#160;        node-&gt;free.prev = VMA_NULL;</div><div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>&#160;        node-&gt;free.next = frontNode;</div><div class="line"><a name="l09990"></a><span class="lineno"> 9990</span>&#160;        frontNode-&gt;free.prev = node;</div><div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>&#160;        m_FreeList[level].front = node;</div><div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>&#160;    }</div><div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>&#160;}</div><div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>&#160;</div><div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::RemoveFromFreeList(uint32_t level, Node* node)</div><div class="line"><a name="l09996"></a><span class="lineno"> 9996</span>&#160;{</div><div class="line"><a name="l09997"></a><span class="lineno"> 9997</span>&#160;    VMA_ASSERT(m_FreeList[level].front != VMA_NULL);</div><div class="line"><a name="l09998"></a><span class="lineno"> 9998</span>&#160;</div><div class="line"><a name="l09999"></a><span class="lineno"> 9999</span>&#160;    <span class="comment">// It is at the front.</span></div><div class="line"><a name="l10000"></a><span class="lineno">10000</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.prev == VMA_NULL)</div><div class="line"><a name="l10001"></a><span class="lineno">10001</span>&#160;    {</div><div class="line"><a name="l10002"></a><span class="lineno">10002</span>&#160;        VMA_ASSERT(m_FreeList[level].front == node);</div><div class="line"><a name="l10003"></a><span class="lineno">10003</span>&#160;        m_FreeList[level].front = node-&gt;free.next;</div><div class="line"><a name="l10004"></a><span class="lineno">10004</span>&#160;    }</div><div class="line"><a name="l10005"></a><span class="lineno">10005</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l10006"></a><span class="lineno">10006</span>&#160;    {</div><div class="line"><a name="l10007"></a><span class="lineno">10007</span>&#160;        Node* <span class="keyword">const</span> prevFreeNode = node-&gt;free.prev;</div><div class="line"><a name="l10008"></a><span class="lineno">10008</span>&#160;        VMA_ASSERT(prevFreeNode-&gt;free.next == node);</div><div class="line"><a name="l10009"></a><span class="lineno">10009</span>&#160;        prevFreeNode-&gt;free.next = node-&gt;free.next;</div><div class="line"><a name="l10010"></a><span class="lineno">10010</span>&#160;    }</div><div class="line"><a name="l10011"></a><span class="lineno">10011</span>&#160;</div><div class="line"><a name="l10012"></a><span class="lineno">10012</span>&#160;    <span class="comment">// It is at the back.</span></div><div class="line"><a name="l10013"></a><span class="lineno">10013</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div><div class="line"><a name="l10014"></a><span class="lineno">10014</span>&#160;    {</div><div class="line"><a name="l10015"></a><span class="lineno">10015</span>&#160;        VMA_ASSERT(m_FreeList[level].back == node);</div><div class="line"><a name="l10016"></a><span class="lineno">10016</span>&#160;        m_FreeList[level].back = node-&gt;free.prev;</div><div class="line"><a name="l10017"></a><span class="lineno">10017</span>&#160;    }</div><div class="line"><a name="l10018"></a><span class="lineno">10018</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l10019"></a><span class="lineno">10019</span>&#160;    {</div><div class="line"><a name="l10020"></a><span class="lineno">10020</span>&#160;        Node* <span class="keyword">const</span> nextFreeNode = node-&gt;free.next;</div><div class="line"><a name="l10021"></a><span class="lineno">10021</span>&#160;        VMA_ASSERT(nextFreeNode-&gt;free.prev == node);</div><div class="line"><a name="l10022"></a><span class="lineno">10022</span>&#160;        nextFreeNode-&gt;free.prev = node-&gt;free.prev;</div><div class="line"><a name="l10023"></a><span class="lineno">10023</span>&#160;    }</div><div class="line"><a name="l10024"></a><span class="lineno">10024</span>&#160;}</div><div class="line"><a name="l10025"></a><span class="lineno">10025</span>&#160;</div><div class="line"><a name="l10026"></a><span class="lineno">10026</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10027"></a><span class="lineno">10027</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter&amp; json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div><div class="line"><a name="l10028"></a><span class="lineno">10028</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10029"></a><span class="lineno">10029</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div><div class="line"><a name="l10030"></a><span class="lineno">10030</span>&#160;    {</div><div class="line"><a name="l10031"></a><span class="lineno">10031</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l10032"></a><span class="lineno">10032</span>&#160;        PrintDetailedMap_UnusedRange(json, node-&gt;offset, levelNodeSize);</div><div class="line"><a name="l10033"></a><span class="lineno">10033</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10034"></a><span class="lineno">10034</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div><div class="line"><a name="l10035"></a><span class="lineno">10035</span>&#160;        {   </div><div class="line"><a name="l10036"></a><span class="lineno">10036</span>&#160;            PrintDetailedMap_Allocation(json, node-&gt;offset, node-&gt;allocation.alloc);</div><div class="line"><a name="l10037"></a><span class="lineno">10037</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l10038"></a><span class="lineno">10038</span>&#160;            <span class="keywordflow">if</span>(allocSize &lt; levelNodeSize)</div><div class="line"><a name="l10039"></a><span class="lineno">10039</span>&#160;            {</div><div class="line"><a name="l10040"></a><span class="lineno">10040</span>&#160;                PrintDetailedMap_UnusedRange(json, node-&gt;offset + allocSize, levelNodeSize - allocSize);</div><div class="line"><a name="l10041"></a><span class="lineno">10041</span>&#160;            }</div><div class="line"><a name="l10042"></a><span class="lineno">10042</span>&#160;        }</div><div class="line"><a name="l10043"></a><span class="lineno">10043</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10044"></a><span class="lineno">10044</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div><div class="line"><a name="l10045"></a><span class="lineno">10045</span>&#160;        {</div><div class="line"><a name="l10046"></a><span class="lineno">10046</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l10047"></a><span class="lineno">10047</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div><div class="line"><a name="l10048"></a><span class="lineno">10048</span>&#160;            PrintDetailedMapNode(json, leftChild, childrenNodeSize);</div><div class="line"><a name="l10049"></a><span class="lineno">10049</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l10050"></a><span class="lineno">10050</span>&#160;            PrintDetailedMapNode(json, rightChild, childrenNodeSize);</div><div class="line"><a name="l10051"></a><span class="lineno">10051</span>&#160;        }</div><div class="line"><a name="l10052"></a><span class="lineno">10052</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10053"></a><span class="lineno">10053</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l10054"></a><span class="lineno">10054</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l10055"></a><span class="lineno">10055</span>&#160;    }</div><div class="line"><a name="l10056"></a><span class="lineno">10056</span>&#160;}</div><div class="line"><a name="l10057"></a><span class="lineno">10057</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10058"></a><span class="lineno">10058</span>&#160;</div><div class="line"><a name="l10059"></a><span class="lineno">10059</span>&#160;</div><div class="line"><a name="l10061"></a><span class="lineno">10061</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></div><div class="line"><a name="l10062"></a><span class="lineno">10062</span>&#160;</div><div class="line"><a name="l10063"></a><span class="lineno">10063</span>&#160;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l10064"></a><span class="lineno">10064</span>&#160;    m_pMetadata(VMA_NULL),</div><div class="line"><a name="l10065"></a><span class="lineno">10065</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div><div class="line"><a name="l10066"></a><span class="lineno">10066</span>&#160;    m_Id(0),</div><div class="line"><a name="l10067"></a><span class="lineno">10067</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div><div class="line"><a name="l10068"></a><span class="lineno">10068</span>&#160;    m_MapCount(0),</div><div class="line"><a name="l10069"></a><span class="lineno">10069</span>&#160;    m_pMappedData(VMA_NULL)</div><div class="line"><a name="l10070"></a><span class="lineno">10070</span>&#160;{</div><div class="line"><a name="l10071"></a><span class="lineno">10071</span>&#160;}</div><div class="line"><a name="l10072"></a><span class="lineno">10072</span>&#160;</div><div class="line"><a name="l10073"></a><span class="lineno">10073</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div><div class="line"><a name="l10074"></a><span class="lineno">10074</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10075"></a><span class="lineno">10075</span>&#160;    uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l10076"></a><span class="lineno">10076</span>&#160;    VkDeviceMemory newMemory,</div><div class="line"><a name="l10077"></a><span class="lineno">10077</span>&#160;    VkDeviceSize newSize,</div><div class="line"><a name="l10078"></a><span class="lineno">10078</span>&#160;    uint32_t <span class="keywordtype">id</span>,</div><div class="line"><a name="l10079"></a><span class="lineno">10079</span>&#160;    uint32_t algorithm)</div><div class="line"><a name="l10080"></a><span class="lineno">10080</span>&#160;{</div><div class="line"><a name="l10081"></a><span class="lineno">10081</span>&#160;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l10082"></a><span class="lineno">10082</span>&#160;</div><div class="line"><a name="l10083"></a><span class="lineno">10083</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div><div class="line"><a name="l10084"></a><span class="lineno">10084</span>&#160;    m_Id = id;</div><div class="line"><a name="l10085"></a><span class="lineno">10085</span>&#160;    m_hMemory = newMemory;</div><div class="line"><a name="l10086"></a><span class="lineno">10086</span>&#160;</div><div class="line"><a name="l10087"></a><span class="lineno">10087</span>&#160;    <span class="keywordflow">switch</span>(algorithm)</div><div class="line"><a name="l10088"></a><span class="lineno">10088</span>&#160;    {</div><div class="line"><a name="l10089"></a><span class="lineno">10089</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div><div class="line"><a name="l10090"></a><span class="lineno">10090</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator);</div><div class="line"><a name="l10091"></a><span class="lineno">10091</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10092"></a><span class="lineno">10092</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div><div class="line"><a name="l10093"></a><span class="lineno">10093</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Buddy)(hAllocator);</div><div class="line"><a name="l10094"></a><span class="lineno">10094</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10095"></a><span class="lineno">10095</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l10096"></a><span class="lineno">10096</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l10097"></a><span class="lineno">10097</span>&#160;        <span class="comment">// Fall-through.</span></div><div class="line"><a name="l10098"></a><span class="lineno">10098</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l10099"></a><span class="lineno">10099</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);</div><div class="line"><a name="l10100"></a><span class="lineno">10100</span>&#160;    }</div><div class="line"><a name="l10101"></a><span class="lineno">10101</span>&#160;    m_pMetadata-&gt;Init(newSize);</div><div class="line"><a name="l10102"></a><span class="lineno">10102</span>&#160;}</div><div class="line"><a name="l10103"></a><span class="lineno">10103</span>&#160;</div><div class="line"><a name="l10104"></a><span class="lineno">10104</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="l10105"></a><span class="lineno">10105</span>&#160;{</div><div class="line"><a name="l10106"></a><span class="lineno">10106</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div><div class="line"><a name="l10107"></a><span class="lineno">10107</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div><div class="line"><a name="l10108"></a><span class="lineno">10108</span>&#160;    VMA_ASSERT(m_pMetadata-&gt;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="l10109"></a><span class="lineno">10109</span>&#160;</div><div class="line"><a name="l10110"></a><span class="lineno">10110</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l10111"></a><span class="lineno">10111</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata-&gt;GetSize(), m_hMemory);</div><div class="line"><a name="l10112"></a><span class="lineno">10112</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l10113"></a><span class="lineno">10113</span>&#160;</div><div class="line"><a name="l10114"></a><span class="lineno">10114</span>&#160;    vma_delete(allocator, m_pMetadata);</div><div class="line"><a name="l10115"></a><span class="lineno">10115</span>&#160;    m_pMetadata = VMA_NULL;</div><div class="line"><a name="l10116"></a><span class="lineno">10116</span>&#160;}</div><div class="line"><a name="l10117"></a><span class="lineno">10117</span>&#160;</div><div class="line"><a name="l10118"></a><span class="lineno">10118</span>&#160;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l10119"></a><span class="lineno">10119</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10120"></a><span class="lineno">10120</span>&#160;    VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &amp;&amp;</div><div class="line"><a name="l10121"></a><span class="lineno">10121</span>&#160;        (m_pMetadata-&gt;GetSize() != 0));</div><div class="line"><a name="l10122"></a><span class="lineno">10122</span>&#160;    </div><div class="line"><a name="l10123"></a><span class="lineno">10123</span>&#160;    <span class="keywordflow">return</span> m_pMetadata-&gt;Validate();</div><div class="line"><a name="l10124"></a><span class="lineno">10124</span>&#160;}</div><div class="line"><a name="l10125"></a><span class="lineno">10125</span>&#160;</div><div class="line"><a name="l10126"></a><span class="lineno">10126</span>&#160;VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l10127"></a><span class="lineno">10127</span>&#160;{</div><div class="line"><a name="l10128"></a><span class="lineno">10128</span>&#160;    <span class="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l10129"></a><span class="lineno">10129</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l10130"></a><span class="lineno">10130</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10131"></a><span class="lineno">10131</span>&#160;    {</div><div class="line"><a name="l10132"></a><span class="lineno">10132</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10133"></a><span class="lineno">10133</span>&#160;    }</div><div class="line"><a name="l10134"></a><span class="lineno">10134</span>&#160;</div><div class="line"><a name="l10135"></a><span class="lineno">10135</span>&#160;    res = m_pMetadata-&gt;CheckCorruption(pData);</div><div class="line"><a name="l10136"></a><span class="lineno">10136</span>&#160;</div><div class="line"><a name="l10137"></a><span class="lineno">10137</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l10138"></a><span class="lineno">10138</span>&#160;</div><div class="line"><a name="l10139"></a><span class="lineno">10139</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10140"></a><span class="lineno">10140</span>&#160;}</div><div class="line"><a name="l10141"></a><span class="lineno">10141</span>&#160;</div><div class="line"><a name="l10142"></a><span class="lineno">10142</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="l10143"></a><span class="lineno">10143</span>&#160;{</div><div class="line"><a name="l10144"></a><span class="lineno">10144</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l10145"></a><span class="lineno">10145</span>&#160;    {</div><div class="line"><a name="l10146"></a><span class="lineno">10146</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10147"></a><span class="lineno">10147</span>&#160;    }</div><div class="line"><a name="l10148"></a><span class="lineno">10148</span>&#160;</div><div class="line"><a name="l10149"></a><span class="lineno">10149</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10150"></a><span class="lineno">10150</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l10151"></a><span class="lineno">10151</span>&#160;    {</div><div class="line"><a name="l10152"></a><span class="lineno">10152</span>&#160;        m_MapCount += count;</div><div class="line"><a name="l10153"></a><span class="lineno">10153</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div><div class="line"><a name="l10154"></a><span class="lineno">10154</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l10155"></a><span class="lineno">10155</span>&#160;        {</div><div class="line"><a name="l10156"></a><span class="lineno">10156</span>&#160;            *ppData = m_pMappedData;</div><div class="line"><a name="l10157"></a><span class="lineno">10157</span>&#160;        }</div><div class="line"><a name="l10158"></a><span class="lineno">10158</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10159"></a><span class="lineno">10159</span>&#160;    }</div><div class="line"><a name="l10160"></a><span class="lineno">10160</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l10161"></a><span class="lineno">10161</span>&#160;    {</div><div class="line"><a name="l10162"></a><span class="lineno">10162</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l10163"></a><span class="lineno">10163</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l10164"></a><span class="lineno">10164</span>&#160;            m_hMemory,</div><div class="line"><a name="l10165"></a><span class="lineno">10165</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l10166"></a><span class="lineno">10166</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l10167"></a><span class="lineno">10167</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l10168"></a><span class="lineno">10168</span>&#160;            &amp;m_pMappedData);</div><div class="line"><a name="l10169"></a><span class="lineno">10169</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l10170"></a><span class="lineno">10170</span>&#160;        {</div><div class="line"><a name="l10171"></a><span class="lineno">10171</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l10172"></a><span class="lineno">10172</span>&#160;            {</div><div class="line"><a name="l10173"></a><span class="lineno">10173</span>&#160;                *ppData = m_pMappedData;</div><div class="line"><a name="l10174"></a><span class="lineno">10174</span>&#160;            }</div><div class="line"><a name="l10175"></a><span class="lineno">10175</span>&#160;            m_MapCount = count;</div><div class="line"><a name="l10176"></a><span class="lineno">10176</span>&#160;        }</div><div class="line"><a name="l10177"></a><span class="lineno">10177</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l10178"></a><span class="lineno">10178</span>&#160;    }</div><div class="line"><a name="l10179"></a><span class="lineno">10179</span>&#160;}</div><div class="line"><a name="l10180"></a><span class="lineno">10180</span>&#160;</div><div class="line"><a name="l10181"></a><span class="lineno">10181</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="l10182"></a><span class="lineno">10182</span>&#160;{</div><div class="line"><a name="l10183"></a><span class="lineno">10183</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l10184"></a><span class="lineno">10184</span>&#160;    {</div><div class="line"><a name="l10185"></a><span class="lineno">10185</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l10186"></a><span class="lineno">10186</span>&#160;    }</div><div class="line"><a name="l10187"></a><span class="lineno">10187</span>&#160;</div><div class="line"><a name="l10188"></a><span class="lineno">10188</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10189"></a><span class="lineno">10189</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</div><div class="line"><a name="l10190"></a><span class="lineno">10190</span>&#160;    {</div><div class="line"><a name="l10191"></a><span class="lineno">10191</span>&#160;        m_MapCount -= count;</div><div class="line"><a name="l10192"></a><span class="lineno">10192</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l10193"></a><span class="lineno">10193</span>&#160;        {</div><div class="line"><a name="l10194"></a><span class="lineno">10194</span>&#160;            m_pMappedData = VMA_NULL;</div><div class="line"><a name="l10195"></a><span class="lineno">10195</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</div><div class="line"><a name="l10196"></a><span class="lineno">10196</span>&#160;        }</div><div class="line"><a name="l10197"></a><span class="lineno">10197</span>&#160;    }</div><div class="line"><a name="l10198"></a><span class="lineno">10198</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l10199"></a><span class="lineno">10199</span>&#160;    {</div><div class="line"><a name="l10200"></a><span class="lineno">10200</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="l10201"></a><span class="lineno">10201</span>&#160;    }</div><div class="line"><a name="l10202"></a><span class="lineno">10202</span>&#160;}</div><div class="line"><a name="l10203"></a><span class="lineno">10203</span>&#160;</div><div class="line"><a name="l10204"></a><span class="lineno">10204</span>&#160;VkResult VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div><div class="line"><a name="l10205"></a><span class="lineno">10205</span>&#160;{</div><div class="line"><a name="l10206"></a><span class="lineno">10206</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div><div class="line"><a name="l10207"></a><span class="lineno">10207</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l10208"></a><span class="lineno">10208</span>&#160;</div><div class="line"><a name="l10209"></a><span class="lineno">10209</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l10210"></a><span class="lineno">10210</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l10211"></a><span class="lineno">10211</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10212"></a><span class="lineno">10212</span>&#160;    {</div><div class="line"><a name="l10213"></a><span class="lineno">10213</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10214"></a><span class="lineno">10214</span>&#160;    }</div><div class="line"><a name="l10215"></a><span class="lineno">10215</span>&#160;</div><div class="line"><a name="l10216"></a><span class="lineno">10216</span>&#160;    VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l10217"></a><span class="lineno">10217</span>&#160;    VmaWriteMagicValue(pData, allocOffset + allocSize);</div><div class="line"><a name="l10218"></a><span class="lineno">10218</span>&#160;</div><div class="line"><a name="l10219"></a><span class="lineno">10219</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l10220"></a><span class="lineno">10220</span>&#160;</div><div class="line"><a name="l10221"></a><span class="lineno">10221</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10222"></a><span class="lineno">10222</span>&#160;}</div><div class="line"><a name="l10223"></a><span class="lineno">10223</span>&#160;</div><div class="line"><a name="l10224"></a><span class="lineno">10224</span>&#160;VkResult VmaDeviceMemoryBlock::ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div><div class="line"><a name="l10225"></a><span class="lineno">10225</span>&#160;{</div><div class="line"><a name="l10226"></a><span class="lineno">10226</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div><div class="line"><a name="l10227"></a><span class="lineno">10227</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l10228"></a><span class="lineno">10228</span>&#160;</div><div class="line"><a name="l10229"></a><span class="lineno">10229</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l10230"></a><span class="lineno">10230</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l10231"></a><span class="lineno">10231</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10232"></a><span class="lineno">10232</span>&#160;    {</div><div class="line"><a name="l10233"></a><span class="lineno">10233</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10234"></a><span class="lineno">10234</span>&#160;    }</div><div class="line"><a name="l10235"></a><span class="lineno">10235</span>&#160;</div><div class="line"><a name="l10236"></a><span class="lineno">10236</span>&#160;    <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l10237"></a><span class="lineno">10237</span>&#160;    {</div><div class="line"><a name="l10238"></a><span class="lineno">10238</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l10239"></a><span class="lineno">10239</span>&#160;    }</div><div class="line"><a name="l10240"></a><span class="lineno">10240</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</div><div class="line"><a name="l10241"></a><span class="lineno">10241</span>&#160;    {</div><div class="line"><a name="l10242"></a><span class="lineno">10242</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l10243"></a><span class="lineno">10243</span>&#160;    }</div><div class="line"><a name="l10244"></a><span class="lineno">10244</span>&#160;</div><div class="line"><a name="l10245"></a><span class="lineno">10245</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l10246"></a><span class="lineno">10246</span>&#160;</div><div class="line"><a name="l10247"></a><span class="lineno">10247</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10248"></a><span class="lineno">10248</span>&#160;}</div><div class="line"><a name="l10249"></a><span class="lineno">10249</span>&#160;</div><div class="line"><a name="l10250"></a><span class="lineno">10250</span>&#160;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div><div class="line"><a name="l10251"></a><span class="lineno">10251</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10252"></a><span class="lineno">10252</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l10253"></a><span class="lineno">10253</span>&#160;    VkBuffer hBuffer)</div><div class="line"><a name="l10254"></a><span class="lineno">10254</span>&#160;{</div><div class="line"><a name="l10255"></a><span class="lineno">10255</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l10256"></a><span class="lineno">10256</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l10257"></a><span class="lineno">10257</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="l10258"></a><span class="lineno">10258</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10259"></a><span class="lineno">10259</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l10260"></a><span class="lineno">10260</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l10261"></a><span class="lineno">10261</span>&#160;        hBuffer,</div><div class="line"><a name="l10262"></a><span class="lineno">10262</span>&#160;        m_hMemory,</div><div class="line"><a name="l10263"></a><span class="lineno">10263</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l10264"></a><span class="lineno">10264</span>&#160;}</div><div class="line"><a name="l10265"></a><span class="lineno">10265</span>&#160;</div><div class="line"><a name="l10266"></a><span class="lineno">10266</span>&#160;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div><div class="line"><a name="l10267"></a><span class="lineno">10267</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10268"></a><span class="lineno">10268</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l10269"></a><span class="lineno">10269</span>&#160;    VkImage hImage)</div><div class="line"><a name="l10270"></a><span class="lineno">10270</span>&#160;{</div><div class="line"><a name="l10271"></a><span class="lineno">10271</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l10272"></a><span class="lineno">10272</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l10273"></a><span class="lineno">10273</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="l10274"></a><span class="lineno">10274</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10275"></a><span class="lineno">10275</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l10276"></a><span class="lineno">10276</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l10277"></a><span class="lineno">10277</span>&#160;        hImage,</div><div class="line"><a name="l10278"></a><span class="lineno">10278</span>&#160;        m_hMemory,</div><div class="line"><a name="l10279"></a><span class="lineno">10279</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l10280"></a><span class="lineno">10280</span>&#160;}</div><div class="line"><a name="l10281"></a><span class="lineno">10281</span>&#160;</div><div class="line"><a name="l10282"></a><span class="lineno">10282</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="l10283"></a><span class="lineno">10283</span>&#160;{</div><div class="line"><a name="l10284"></a><span class="lineno">10284</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div><div class="line"><a name="l10285"></a><span class="lineno">10285</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l10286"></a><span class="lineno">10286</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l10287"></a><span class="lineno">10287</span>&#160;}</div><div class="line"><a name="l10288"></a><span class="lineno">10288</span>&#160;</div><div class="line"><a name="l10289"></a><span class="lineno">10289</span>&#160;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div><div class="line"><a name="l10290"></a><span class="lineno">10290</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="l10291"></a><span class="lineno">10291</span>&#160;{</div><div class="line"><a name="l10292"></a><span class="lineno">10292</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="l10293"></a><span class="lineno">10293</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="l10294"></a><span class="lineno">10294</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="l10295"></a><span class="lineno">10295</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="l10296"></a><span class="lineno">10296</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="l10297"></a><span class="lineno">10297</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="l10298"></a><span class="lineno">10298</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="l10299"></a><span class="lineno">10299</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="l10300"></a><span class="lineno">10300</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="l10301"></a><span class="lineno">10301</span>&#160;}</div><div class="line"><a name="l10302"></a><span class="lineno">10302</span>&#160;</div><div class="line"><a name="l10303"></a><span class="lineno">10303</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="l10304"></a><span class="lineno">10304</span>&#160;{</div><div class="line"><a name="l10305"></a><span class="lineno">10305</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="l10306"></a><span class="lineno">10306</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="l10307"></a><span class="lineno">10307</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="l10308"></a><span class="lineno">10308</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="l10309"></a><span class="lineno">10309</span>&#160;}</div><div class="line"><a name="l10310"></a><span class="lineno">10310</span>&#160;</div><div class="line"><a name="l10311"></a><span class="lineno">10311</span>&#160;VmaPool_T::VmaPool_T(</div><div class="line"><a name="l10312"></a><span class="lineno">10312</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10313"></a><span class="lineno">10313</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="l10314"></a><span class="lineno">10314</span>&#160;    VkDeviceSize preferredBlockSize) :</div><div class="line"><a name="l10315"></a><span class="lineno">10315</span>&#160;    m_BlockVector(</div><div class="line"><a name="l10316"></a><span class="lineno">10316</span>&#160;        hAllocator,</div><div class="line"><a name="l10317"></a><span class="lineno">10317</span>&#160;        createInfo.memoryTypeIndex,</div><div class="line"><a name="l10318"></a><span class="lineno">10318</span>&#160;        createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,</div><div class="line"><a name="l10319"></a><span class="lineno">10319</span>&#160;        createInfo.minBlockCount,</div><div class="line"><a name="l10320"></a><span class="lineno">10320</span>&#160;        createInfo.maxBlockCount,</div><div class="line"><a name="l10321"></a><span class="lineno">10321</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="l10322"></a><span class="lineno">10322</span>&#160;        createInfo.frameInUseCount,</div><div class="line"><a name="l10323"></a><span class="lineno">10323</span>&#160;        true, <span class="comment">// isCustomPool</span></div><div class="line"><a name="l10324"></a><span class="lineno">10324</span>&#160;        createInfo.blockSize != 0, <span class="comment">// explicitBlockSize</span></div><div class="line"><a name="l10325"></a><span class="lineno">10325</span>&#160;        createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>), <span class="comment">// algorithm</span></div><div class="line"><a name="l10326"></a><span class="lineno">10326</span>&#160;    m_Id(0)</div><div class="line"><a name="l10327"></a><span class="lineno">10327</span>&#160;{</div><div class="line"><a name="l10328"></a><span class="lineno">10328</span>&#160;}</div><div class="line"><a name="l10329"></a><span class="lineno">10329</span>&#160;</div><div class="line"><a name="l10330"></a><span class="lineno">10330</span>&#160;VmaPool_T::~VmaPool_T()</div><div class="line"><a name="l10331"></a><span class="lineno">10331</span>&#160;{</div><div class="line"><a name="l10332"></a><span class="lineno">10332</span>&#160;}</div><div class="line"><a name="l10333"></a><span class="lineno">10333</span>&#160;</div><div class="line"><a name="l10334"></a><span class="lineno">10334</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10335"></a><span class="lineno">10335</span>&#160;</div><div class="line"><a name="l10336"></a><span class="lineno">10336</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10337"></a><span class="lineno">10337</span>&#160;</div><div class="line"><a name="l10338"></a><span class="lineno">10338</span>&#160;VmaBlockVector::VmaBlockVector(</div><div class="line"><a name="l10339"></a><span class="lineno">10339</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10340"></a><span class="lineno">10340</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l10341"></a><span class="lineno">10341</span>&#160;    VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l10342"></a><span class="lineno">10342</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l10343"></a><span class="lineno">10343</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l10344"></a><span class="lineno">10344</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l10345"></a><span class="lineno">10345</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l10346"></a><span class="lineno">10346</span>&#160;    <span class="keywordtype">bool</span> isCustomPool,</div><div class="line"><a name="l10347"></a><span class="lineno">10347</span>&#160;    <span class="keywordtype">bool</span> explicitBlockSize,</div><div class="line"><a name="l10348"></a><span class="lineno">10348</span>&#160;    uint32_t algorithm) :</div><div class="line"><a name="l10349"></a><span class="lineno">10349</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l10350"></a><span class="lineno">10350</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div><div class="line"><a name="l10351"></a><span class="lineno">10351</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div><div class="line"><a name="l10352"></a><span class="lineno">10352</span>&#160;    m_MinBlockCount(minBlockCount),</div><div class="line"><a name="l10353"></a><span class="lineno">10353</span>&#160;    m_MaxBlockCount(maxBlockCount),</div><div class="line"><a name="l10354"></a><span class="lineno">10354</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div><div class="line"><a name="l10355"></a><span class="lineno">10355</span>&#160;    m_FrameInUseCount(frameInUseCount),</div><div class="line"><a name="l10356"></a><span class="lineno">10356</span>&#160;    m_IsCustomPool(isCustomPool),</div><div class="line"><a name="l10357"></a><span class="lineno">10357</span>&#160;    m_ExplicitBlockSize(explicitBlockSize),</div><div class="line"><a name="l10358"></a><span class="lineno">10358</span>&#160;    m_Algorithm(algorithm),</div><div class="line"><a name="l10359"></a><span class="lineno">10359</span>&#160;    m_HasEmptyBlock(false),</div><div class="line"><a name="l10360"></a><span class="lineno">10360</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l10361"></a><span class="lineno">10361</span>&#160;    m_pDefragmentator(VMA_NULL),</div><div class="line"><a name="l10362"></a><span class="lineno">10362</span>&#160;    m_NextBlockId(0)</div><div class="line"><a name="l10363"></a><span class="lineno">10363</span>&#160;{</div><div class="line"><a name="l10364"></a><span class="lineno">10364</span>&#160;}</div><div class="line"><a name="l10365"></a><span class="lineno">10365</span>&#160;</div><div class="line"><a name="l10366"></a><span class="lineno">10366</span>&#160;VmaBlockVector::~VmaBlockVector()</div><div class="line"><a name="l10367"></a><span class="lineno">10367</span>&#160;{</div><div class="line"><a name="l10368"></a><span class="lineno">10368</span>&#160;    VMA_ASSERT(m_pDefragmentator == VMA_NULL);</div><div class="line"><a name="l10369"></a><span class="lineno">10369</span>&#160;</div><div class="line"><a name="l10370"></a><span class="lineno">10370</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l10371"></a><span class="lineno">10371</span>&#160;    {</div><div class="line"><a name="l10372"></a><span class="lineno">10372</span>&#160;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l10373"></a><span class="lineno">10373</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l10374"></a><span class="lineno">10374</span>&#160;    }</div><div class="line"><a name="l10375"></a><span class="lineno">10375</span>&#160;}</div><div class="line"><a name="l10376"></a><span class="lineno">10376</span>&#160;</div><div class="line"><a name="l10377"></a><span class="lineno">10377</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div><div class="line"><a name="l10378"></a><span class="lineno">10378</span>&#160;{</div><div class="line"><a name="l10379"></a><span class="lineno">10379</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="l10380"></a><span class="lineno">10380</span>&#160;    {</div><div class="line"><a name="l10381"></a><span class="lineno">10381</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div><div class="line"><a name="l10382"></a><span class="lineno">10382</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10383"></a><span class="lineno">10383</span>&#160;        {</div><div class="line"><a name="l10384"></a><span class="lineno">10384</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10385"></a><span class="lineno">10385</span>&#160;        }</div><div class="line"><a name="l10386"></a><span class="lineno">10386</span>&#160;    }</div><div class="line"><a name="l10387"></a><span class="lineno">10387</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10388"></a><span class="lineno">10388</span>&#160;}</div><div class="line"><a name="l10389"></a><span class="lineno">10389</span>&#160;</div><div class="line"><a name="l10390"></a><span class="lineno">10390</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="l10391"></a><span class="lineno">10391</span>&#160;{</div><div class="line"><a name="l10392"></a><span class="lineno">10392</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10393"></a><span class="lineno">10393</span>&#160;</div><div class="line"><a name="l10394"></a><span class="lineno">10394</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div><div class="line"><a name="l10395"></a><span class="lineno">10395</span>&#160;</div><div class="line"><a name="l10396"></a><span class="lineno">10396</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div><div class="line"><a name="l10397"></a><span class="lineno">10397</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div><div class="line"><a name="l10398"></a><span class="lineno">10398</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div><div class="line"><a name="l10399"></a><span class="lineno">10399</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div><div class="line"><a name="l10400"></a><span class="lineno">10400</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l10401"></a><span class="lineno">10401</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a> = blockCount;</div><div class="line"><a name="l10402"></a><span class="lineno">10402</span>&#160;</div><div class="line"><a name="l10403"></a><span class="lineno">10403</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l10404"></a><span class="lineno">10404</span>&#160;    {</div><div class="line"><a name="l10405"></a><span class="lineno">10405</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10406"></a><span class="lineno">10406</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l10407"></a><span class="lineno">10407</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l10408"></a><span class="lineno">10408</span>&#160;        pBlock-&gt;m_pMetadata-&gt;AddPoolStats(*pStats);</div><div class="line"><a name="l10409"></a><span class="lineno">10409</span>&#160;    }</div><div class="line"><a name="l10410"></a><span class="lineno">10410</span>&#160;}</div><div class="line"><a name="l10411"></a><span class="lineno">10411</span>&#160;</div><div class="line"><a name="l10412"></a><span class="lineno">10412</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div><div class="line"><a name="l10413"></a><span class="lineno">10413</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10414"></a><span class="lineno">10414</span>&#160;    <span class="keyword">const</span> uint32_t requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l10415"></a><span class="lineno">10415</span>&#160;    <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &amp;&amp;</div><div class="line"><a name="l10416"></a><span class="lineno">10416</span>&#160;        (VMA_DEBUG_MARGIN &gt; 0) &amp;&amp;</div><div class="line"><a name="l10417"></a><span class="lineno">10417</span>&#160;        (m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags;</div><div class="line"><a name="l10418"></a><span class="lineno">10418</span>&#160;}</div><div class="line"><a name="l10419"></a><span class="lineno">10419</span>&#160;</div><div class="line"><a name="l10420"></a><span class="lineno">10420</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="l10421"></a><span class="lineno">10421</span>&#160;</div><div class="line"><a name="l10422"></a><span class="lineno">10422</span>&#160;VkResult VmaBlockVector::Allocate(</div><div class="line"><a name="l10423"></a><span class="lineno">10423</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l10424"></a><span class="lineno">10424</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l10425"></a><span class="lineno">10425</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l10426"></a><span class="lineno">10426</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l10427"></a><span class="lineno">10427</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="l10428"></a><span class="lineno">10428</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l10429"></a><span class="lineno">10429</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l10430"></a><span class="lineno">10430</span>&#160;{</div><div class="line"><a name="l10431"></a><span class="lineno">10431</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div><div class="line"><a name="l10432"></a><span class="lineno">10432</span>&#160;    <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="l10433"></a><span class="lineno">10433</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="l10434"></a><span class="lineno">10434</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="l10435"></a><span class="lineno">10435</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div><div class="line"><a name="l10436"></a><span class="lineno">10436</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="l10437"></a><span class="lineno">10437</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount);</div><div class="line"><a name="l10438"></a><span class="lineno">10438</span>&#160;    uint32_t strategy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>;</div><div class="line"><a name="l10439"></a><span class="lineno">10439</span>&#160;</div><div class="line"><a name="l10440"></a><span class="lineno">10440</span>&#160;    <span class="comment">// If linearAlgorithm is used, canMakeOtherLost is available only when used as ring buffer.</span></div><div class="line"><a name="l10441"></a><span class="lineno">10441</span>&#160;    <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div><div class="line"><a name="l10442"></a><span class="lineno">10442</span>&#160;    <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> &amp;&amp; m_MaxBlockCount &gt; 1)</div><div class="line"><a name="l10443"></a><span class="lineno">10443</span>&#160;    {</div><div class="line"><a name="l10444"></a><span class="lineno">10444</span>&#160;        canMakeOtherLost = <span class="keyword">false</span>;</div><div class="line"><a name="l10445"></a><span class="lineno">10445</span>&#160;    }</div><div class="line"><a name="l10446"></a><span class="lineno">10446</span>&#160;</div><div class="line"><a name="l10447"></a><span class="lineno">10447</span>&#160;    <span class="comment">// Upper address can only be used with linear allocator and within single memory block.</span></div><div class="line"><a name="l10448"></a><span class="lineno">10448</span>&#160;    <span class="keywordflow">if</span>(isUpperAddress &amp;&amp;</div><div class="line"><a name="l10449"></a><span class="lineno">10449</span>&#160;        (m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> || m_MaxBlockCount &gt; 1))</div><div class="line"><a name="l10450"></a><span class="lineno">10450</span>&#160;    {</div><div class="line"><a name="l10451"></a><span class="lineno">10451</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l10452"></a><span class="lineno">10452</span>&#160;    }</div><div class="line"><a name="l10453"></a><span class="lineno">10453</span>&#160;</div><div class="line"><a name="l10454"></a><span class="lineno">10454</span>&#160;    <span class="comment">// Validate strategy.</span></div><div class="line"><a name="l10455"></a><span class="lineno">10455</span>&#160;    <span class="keywordflow">switch</span>(strategy)</div><div class="line"><a name="l10456"></a><span class="lineno">10456</span>&#160;    {</div><div class="line"><a name="l10457"></a><span class="lineno">10457</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l10458"></a><span class="lineno">10458</span>&#160;        strategy = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>;</div><div class="line"><a name="l10459"></a><span class="lineno">10459</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10460"></a><span class="lineno">10460</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>:</div><div class="line"><a name="l10461"></a><span class="lineno">10461</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>:</div><div class="line"><a name="l10462"></a><span class="lineno">10462</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>:</div><div class="line"><a name="l10463"></a><span class="lineno">10463</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10464"></a><span class="lineno">10464</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l10465"></a><span class="lineno">10465</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l10466"></a><span class="lineno">10466</span>&#160;    }</div><div class="line"><a name="l10467"></a><span class="lineno">10467</span>&#160;</div><div class="line"><a name="l10468"></a><span class="lineno">10468</span>&#160;    <span class="comment">// Early reject: requested allocation size is larger that maximum block size for this block vector.</span></div><div class="line"><a name="l10469"></a><span class="lineno">10469</span>&#160;    <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN &gt; m_PreferredBlockSize)</div><div class="line"><a name="l10470"></a><span class="lineno">10470</span>&#160;    {</div><div class="line"><a name="l10471"></a><span class="lineno">10471</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l10472"></a><span class="lineno">10472</span>&#160;    }</div><div class="line"><a name="l10473"></a><span class="lineno">10473</span>&#160;</div><div class="line"><a name="l10474"></a><span class="lineno">10474</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10475"></a><span class="lineno">10475</span>&#160;</div><div class="line"><a name="l10476"></a><span class="lineno">10476</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l10477"></a><span class="lineno">10477</span>&#160;<span class="comment">    Under certain condition, this whole section can be skipped for optimization, so</span></div><div class="line"><a name="l10478"></a><span class="lineno">10478</span>&#160;<span class="comment">    we move on directly to trying to allocate with canMakeOtherLost. That&#39;s the case</span></div><div class="line"><a name="l10479"></a><span class="lineno">10479</span>&#160;<span class="comment">    e.g. for custom pools with linear algorithm.</span></div><div class="line"><a name="l10480"></a><span class="lineno">10480</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l10481"></a><span class="lineno">10481</span>&#160;    <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div><div class="line"><a name="l10482"></a><span class="lineno">10482</span>&#160;    {</div><div class="line"><a name="l10483"></a><span class="lineno">10483</span>&#160;        <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div><div class="line"><a name="l10484"></a><span class="lineno">10484</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlagsCopy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div><div class="line"><a name="l10485"></a><span class="lineno">10485</span>&#160;        allocFlagsCopy &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>;</div><div class="line"><a name="l10486"></a><span class="lineno">10486</span>&#160;</div><div class="line"><a name="l10487"></a><span class="lineno">10487</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>)</div><div class="line"><a name="l10488"></a><span class="lineno">10488</span>&#160;        {</div><div class="line"><a name="l10489"></a><span class="lineno">10489</span>&#160;            <span class="comment">// Use only last block.</span></div><div class="line"><a name="l10490"></a><span class="lineno">10490</span>&#160;            <span class="keywordflow">if</span>(!m_Blocks.empty())</div><div class="line"><a name="l10491"></a><span class="lineno">10491</span>&#160;            {</div><div class="line"><a name="l10492"></a><span class="lineno">10492</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div><div class="line"><a name="l10493"></a><span class="lineno">10493</span>&#160;                VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10494"></a><span class="lineno">10494</span>&#160;                VkResult res = AllocateFromBlock(</div><div class="line"><a name="l10495"></a><span class="lineno">10495</span>&#160;                    pCurrBlock,</div><div class="line"><a name="l10496"></a><span class="lineno">10496</span>&#160;                    hCurrentPool,</div><div class="line"><a name="l10497"></a><span class="lineno">10497</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l10498"></a><span class="lineno">10498</span>&#160;                    size,</div><div class="line"><a name="l10499"></a><span class="lineno">10499</span>&#160;                    alignment,</div><div class="line"><a name="l10500"></a><span class="lineno">10500</span>&#160;                    allocFlagsCopy,</div><div class="line"><a name="l10501"></a><span class="lineno">10501</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l10502"></a><span class="lineno">10502</span>&#160;                    suballocType,</div><div class="line"><a name="l10503"></a><span class="lineno">10503</span>&#160;                    strategy,</div><div class="line"><a name="l10504"></a><span class="lineno">10504</span>&#160;                    pAllocation);</div><div class="line"><a name="l10505"></a><span class="lineno">10505</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10506"></a><span class="lineno">10506</span>&#160;                {</div><div class="line"><a name="l10507"></a><span class="lineno">10507</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from last block #%u&quot;</span>, (uint32_t)(m_Blocks.size() - 1));</div><div class="line"><a name="l10508"></a><span class="lineno">10508</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10509"></a><span class="lineno">10509</span>&#160;                }</div><div class="line"><a name="l10510"></a><span class="lineno">10510</span>&#160;            }</div><div class="line"><a name="l10511"></a><span class="lineno">10511</span>&#160;        }</div><div class="line"><a name="l10512"></a><span class="lineno">10512</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l10513"></a><span class="lineno">10513</span>&#160;        {</div><div class="line"><a name="l10514"></a><span class="lineno">10514</span>&#160;            <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div><div class="line"><a name="l10515"></a><span class="lineno">10515</span>&#160;            {</div><div class="line"><a name="l10516"></a><span class="lineno">10516</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="l10517"></a><span class="lineno">10517</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="l10518"></a><span class="lineno">10518</span>&#160;                {</div><div class="line"><a name="l10519"></a><span class="lineno">10519</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10520"></a><span class="lineno">10520</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10521"></a><span class="lineno">10521</span>&#160;                    VkResult res = AllocateFromBlock(</div><div class="line"><a name="l10522"></a><span class="lineno">10522</span>&#160;                        pCurrBlock,</div><div class="line"><a name="l10523"></a><span class="lineno">10523</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l10524"></a><span class="lineno">10524</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l10525"></a><span class="lineno">10525</span>&#160;                        size,</div><div class="line"><a name="l10526"></a><span class="lineno">10526</span>&#160;                        alignment,</div><div class="line"><a name="l10527"></a><span class="lineno">10527</span>&#160;                        allocFlagsCopy,</div><div class="line"><a name="l10528"></a><span class="lineno">10528</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l10529"></a><span class="lineno">10529</span>&#160;                        suballocType,</div><div class="line"><a name="l10530"></a><span class="lineno">10530</span>&#160;                        strategy,</div><div class="line"><a name="l10531"></a><span class="lineno">10531</span>&#160;                        pAllocation);</div><div class="line"><a name="l10532"></a><span class="lineno">10532</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10533"></a><span class="lineno">10533</span>&#160;                    {</div><div class="line"><a name="l10534"></a><span class="lineno">10534</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l10535"></a><span class="lineno">10535</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10536"></a><span class="lineno">10536</span>&#160;                    }</div><div class="line"><a name="l10537"></a><span class="lineno">10537</span>&#160;                }</div><div class="line"><a name="l10538"></a><span class="lineno">10538</span>&#160;            }</div><div class="line"><a name="l10539"></a><span class="lineno">10539</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div><div class="line"><a name="l10540"></a><span class="lineno">10540</span>&#160;            {</div><div class="line"><a name="l10541"></a><span class="lineno">10541</span>&#160;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div><div class="line"><a name="l10542"></a><span class="lineno">10542</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l10543"></a><span class="lineno">10543</span>&#160;                {</div><div class="line"><a name="l10544"></a><span class="lineno">10544</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10545"></a><span class="lineno">10545</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10546"></a><span class="lineno">10546</span>&#160;                    VkResult res = AllocateFromBlock(</div><div class="line"><a name="l10547"></a><span class="lineno">10547</span>&#160;                        pCurrBlock,</div><div class="line"><a name="l10548"></a><span class="lineno">10548</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l10549"></a><span class="lineno">10549</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l10550"></a><span class="lineno">10550</span>&#160;                        size,</div><div class="line"><a name="l10551"></a><span class="lineno">10551</span>&#160;                        alignment,</div><div class="line"><a name="l10552"></a><span class="lineno">10552</span>&#160;                        allocFlagsCopy,</div><div class="line"><a name="l10553"></a><span class="lineno">10553</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l10554"></a><span class="lineno">10554</span>&#160;                        suballocType,</div><div class="line"><a name="l10555"></a><span class="lineno">10555</span>&#160;                        strategy,</div><div class="line"><a name="l10556"></a><span class="lineno">10556</span>&#160;                        pAllocation);</div><div class="line"><a name="l10557"></a><span class="lineno">10557</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10558"></a><span class="lineno">10558</span>&#160;                    {</div><div class="line"><a name="l10559"></a><span class="lineno">10559</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l10560"></a><span class="lineno">10560</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10561"></a><span class="lineno">10561</span>&#160;                    }</div><div class="line"><a name="l10562"></a><span class="lineno">10562</span>&#160;                }</div><div class="line"><a name="l10563"></a><span class="lineno">10563</span>&#160;            }</div><div class="line"><a name="l10564"></a><span class="lineno">10564</span>&#160;        }</div><div class="line"><a name="l10565"></a><span class="lineno">10565</span>&#160;</div><div class="line"><a name="l10566"></a><span class="lineno">10566</span>&#160;        <span class="comment">// 2. Try to create new block.</span></div><div class="line"><a name="l10567"></a><span class="lineno">10567</span>&#160;        <span class="keywordflow">if</span>(canCreateNewBlock)</div><div class="line"><a name="l10568"></a><span class="lineno">10568</span>&#160;        {</div><div class="line"><a name="l10569"></a><span class="lineno">10569</span>&#160;            <span class="comment">// Calculate optimal size for new block.</span></div><div class="line"><a name="l10570"></a><span class="lineno">10570</span>&#160;            VkDeviceSize newBlockSize = m_PreferredBlockSize;</div><div class="line"><a name="l10571"></a><span class="lineno">10571</span>&#160;            uint32_t newBlockSizeShift = 0;</div><div class="line"><a name="l10572"></a><span class="lineno">10572</span>&#160;            <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div><div class="line"><a name="l10573"></a><span class="lineno">10573</span>&#160;</div><div class="line"><a name="l10574"></a><span class="lineno">10574</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div><div class="line"><a name="l10575"></a><span class="lineno">10575</span>&#160;            {</div><div class="line"><a name="l10576"></a><span class="lineno">10576</span>&#160;                <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div><div class="line"><a name="l10577"></a><span class="lineno">10577</span>&#160;                <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div><div class="line"><a name="l10578"></a><span class="lineno">10578</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="l10579"></a><span class="lineno">10579</span>&#160;                {</div><div class="line"><a name="l10580"></a><span class="lineno">10580</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l10581"></a><span class="lineno">10581</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= size * 2)</div><div class="line"><a name="l10582"></a><span class="lineno">10582</span>&#160;                    {</div><div class="line"><a name="l10583"></a><span class="lineno">10583</span>&#160;                        newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l10584"></a><span class="lineno">10584</span>&#160;                        ++newBlockSizeShift;</div><div class="line"><a name="l10585"></a><span class="lineno">10585</span>&#160;                    }</div><div class="line"><a name="l10586"></a><span class="lineno">10586</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l10587"></a><span class="lineno">10587</span>&#160;                    {</div><div class="line"><a name="l10588"></a><span class="lineno">10588</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10589"></a><span class="lineno">10589</span>&#160;                    }</div><div class="line"><a name="l10590"></a><span class="lineno">10590</span>&#160;                }</div><div class="line"><a name="l10591"></a><span class="lineno">10591</span>&#160;            }</div><div class="line"><a name="l10592"></a><span class="lineno">10592</span>&#160;</div><div class="line"><a name="l10593"></a><span class="lineno">10593</span>&#160;            <span class="keywordtype">size_t</span> newBlockIndex = 0;</div><div class="line"><a name="l10594"></a><span class="lineno">10594</span>&#160;            VkResult res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l10595"></a><span class="lineno">10595</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="l10596"></a><span class="lineno">10596</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div><div class="line"><a name="l10597"></a><span class="lineno">10597</span>&#160;            {</div><div class="line"><a name="l10598"></a><span class="lineno">10598</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="l10599"></a><span class="lineno">10599</span>&#160;                {</div><div class="line"><a name="l10600"></a><span class="lineno">10600</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l10601"></a><span class="lineno">10601</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= size)</div><div class="line"><a name="l10602"></a><span class="lineno">10602</span>&#160;                    {</div><div class="line"><a name="l10603"></a><span class="lineno">10603</span>&#160;                        newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l10604"></a><span class="lineno">10604</span>&#160;                        ++newBlockSizeShift;</div><div class="line"><a name="l10605"></a><span class="lineno">10605</span>&#160;                        res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l10606"></a><span class="lineno">10606</span>&#160;                    }</div><div class="line"><a name="l10607"></a><span class="lineno">10607</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l10608"></a><span class="lineno">10608</span>&#160;                    {</div><div class="line"><a name="l10609"></a><span class="lineno">10609</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10610"></a><span class="lineno">10610</span>&#160;                    }</div><div class="line"><a name="l10611"></a><span class="lineno">10611</span>&#160;                }</div><div class="line"><a name="l10612"></a><span class="lineno">10612</span>&#160;            }</div><div class="line"><a name="l10613"></a><span class="lineno">10613</span>&#160;</div><div class="line"><a name="l10614"></a><span class="lineno">10614</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10615"></a><span class="lineno">10615</span>&#160;            {</div><div class="line"><a name="l10616"></a><span class="lineno">10616</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div><div class="line"><a name="l10617"></a><span class="lineno">10617</span>&#160;                VMA_ASSERT(pBlock-&gt;m_pMetadata-&gt;GetSize() &gt;= size);</div><div class="line"><a name="l10618"></a><span class="lineno">10618</span>&#160;</div><div class="line"><a name="l10619"></a><span class="lineno">10619</span>&#160;                res = AllocateFromBlock(</div><div class="line"><a name="l10620"></a><span class="lineno">10620</span>&#160;                    pBlock,</div><div class="line"><a name="l10621"></a><span class="lineno">10621</span>&#160;                    hCurrentPool,</div><div class="line"><a name="l10622"></a><span class="lineno">10622</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l10623"></a><span class="lineno">10623</span>&#160;                    size,</div><div class="line"><a name="l10624"></a><span class="lineno">10624</span>&#160;                    alignment,</div><div class="line"><a name="l10625"></a><span class="lineno">10625</span>&#160;                    allocFlagsCopy,</div><div class="line"><a name="l10626"></a><span class="lineno">10626</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l10627"></a><span class="lineno">10627</span>&#160;                    suballocType,</div><div class="line"><a name="l10628"></a><span class="lineno">10628</span>&#160;                    strategy,</div><div class="line"><a name="l10629"></a><span class="lineno">10629</span>&#160;                    pAllocation);</div><div class="line"><a name="l10630"></a><span class="lineno">10630</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10631"></a><span class="lineno">10631</span>&#160;                {</div><div class="line"><a name="l10632"></a><span class="lineno">10632</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new block Size=%llu&quot;</span>, newBlockSize);</div><div class="line"><a name="l10633"></a><span class="lineno">10633</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10634"></a><span class="lineno">10634</span>&#160;                }</div><div class="line"><a name="l10635"></a><span class="lineno">10635</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l10636"></a><span class="lineno">10636</span>&#160;                {</div><div class="line"><a name="l10637"></a><span class="lineno">10637</span>&#160;                    <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div><div class="line"><a name="l10638"></a><span class="lineno">10638</span>&#160;                    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l10639"></a><span class="lineno">10639</span>&#160;                }</div><div class="line"><a name="l10640"></a><span class="lineno">10640</span>&#160;            }</div><div class="line"><a name="l10641"></a><span class="lineno">10641</span>&#160;        }</div><div class="line"><a name="l10642"></a><span class="lineno">10642</span>&#160;    }</div><div class="line"><a name="l10643"></a><span class="lineno">10643</span>&#160;</div><div class="line"><a name="l10644"></a><span class="lineno">10644</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div><div class="line"><a name="l10645"></a><span class="lineno">10645</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l10646"></a><span class="lineno">10646</span>&#160;    {</div><div class="line"><a name="l10647"></a><span class="lineno">10647</span>&#160;        uint32_t tryIndex = 0;</div><div class="line"><a name="l10648"></a><span class="lineno">10648</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div><div class="line"><a name="l10649"></a><span class="lineno">10649</span>&#160;        {</div><div class="line"><a name="l10650"></a><span class="lineno">10650</span>&#160;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div><div class="line"><a name="l10651"></a><span class="lineno">10651</span>&#160;            VmaAllocationRequest bestRequest = {};</div><div class="line"><a name="l10652"></a><span class="lineno">10652</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div><div class="line"><a name="l10653"></a><span class="lineno">10653</span>&#160;</div><div class="line"><a name="l10654"></a><span class="lineno">10654</span>&#160;            <span class="comment">// 1. Search existing allocations.</span></div><div class="line"><a name="l10655"></a><span class="lineno">10655</span>&#160;            <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div><div class="line"><a name="l10656"></a><span class="lineno">10656</span>&#160;            {</div><div class="line"><a name="l10657"></a><span class="lineno">10657</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="l10658"></a><span class="lineno">10658</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="l10659"></a><span class="lineno">10659</span>&#160;                {</div><div class="line"><a name="l10660"></a><span class="lineno">10660</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10661"></a><span class="lineno">10661</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10662"></a><span class="lineno">10662</span>&#160;                    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l10663"></a><span class="lineno">10663</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l10664"></a><span class="lineno">10664</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l10665"></a><span class="lineno">10665</span>&#160;                        m_FrameInUseCount,</div><div class="line"><a name="l10666"></a><span class="lineno">10666</span>&#160;                        m_BufferImageGranularity,</div><div class="line"><a name="l10667"></a><span class="lineno">10667</span>&#160;                        size,</div><div class="line"><a name="l10668"></a><span class="lineno">10668</span>&#160;                        alignment,</div><div class="line"><a name="l10669"></a><span class="lineno">10669</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#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div><div class="line"><a name="l10670"></a><span class="lineno">10670</span>&#160;                        suballocType,</div><div class="line"><a name="l10671"></a><span class="lineno">10671</span>&#160;                        canMakeOtherLost,</div><div class="line"><a name="l10672"></a><span class="lineno">10672</span>&#160;                        strategy,</div><div class="line"><a name="l10673"></a><span class="lineno">10673</span>&#160;                        &amp;currRequest))</div><div class="line"><a name="l10674"></a><span class="lineno">10674</span>&#160;                    {</div><div class="line"><a name="l10675"></a><span class="lineno">10675</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l10676"></a><span class="lineno">10676</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l10677"></a><span class="lineno">10677</span>&#160;                            currRequestCost &lt; bestRequestCost)</div><div class="line"><a name="l10678"></a><span class="lineno">10678</span>&#160;                        {</div><div class="line"><a name="l10679"></a><span class="lineno">10679</span>&#160;                            pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l10680"></a><span class="lineno">10680</span>&#160;                            bestRequest = currRequest;</div><div class="line"><a name="l10681"></a><span class="lineno">10681</span>&#160;                            bestRequestCost = currRequestCost;</div><div class="line"><a name="l10682"></a><span class="lineno">10682</span>&#160;</div><div class="line"><a name="l10683"></a><span class="lineno">10683</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0)</div><div class="line"><a name="l10684"></a><span class="lineno">10684</span>&#160;                            {</div><div class="line"><a name="l10685"></a><span class="lineno">10685</span>&#160;                                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10686"></a><span class="lineno">10686</span>&#160;                            }</div><div class="line"><a name="l10687"></a><span class="lineno">10687</span>&#160;                        }</div><div class="line"><a name="l10688"></a><span class="lineno">10688</span>&#160;                    }</div><div class="line"><a name="l10689"></a><span class="lineno">10689</span>&#160;                }</div><div class="line"><a name="l10690"></a><span class="lineno">10690</span>&#160;            }</div><div class="line"><a name="l10691"></a><span class="lineno">10691</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div><div class="line"><a name="l10692"></a><span class="lineno">10692</span>&#160;            {</div><div class="line"><a name="l10693"></a><span class="lineno">10693</span>&#160;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div><div class="line"><a name="l10694"></a><span class="lineno">10694</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l10695"></a><span class="lineno">10695</span>&#160;                {</div><div class="line"><a name="l10696"></a><span class="lineno">10696</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10697"></a><span class="lineno">10697</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10698"></a><span class="lineno">10698</span>&#160;                    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l10699"></a><span class="lineno">10699</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l10700"></a><span class="lineno">10700</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l10701"></a><span class="lineno">10701</span>&#160;                        m_FrameInUseCount,</div><div class="line"><a name="l10702"></a><span class="lineno">10702</span>&#160;                        m_BufferImageGranularity,</div><div class="line"><a name="l10703"></a><span class="lineno">10703</span>&#160;                        size,</div><div class="line"><a name="l10704"></a><span class="lineno">10704</span>&#160;                        alignment,</div><div class="line"><a name="l10705"></a><span class="lineno">10705</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#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div><div class="line"><a name="l10706"></a><span class="lineno">10706</span>&#160;                        suballocType,</div><div class="line"><a name="l10707"></a><span class="lineno">10707</span>&#160;                        canMakeOtherLost,</div><div class="line"><a name="l10708"></a><span class="lineno">10708</span>&#160;                        strategy,</div><div class="line"><a name="l10709"></a><span class="lineno">10709</span>&#160;                        &amp;currRequest))</div><div class="line"><a name="l10710"></a><span class="lineno">10710</span>&#160;                    {</div><div class="line"><a name="l10711"></a><span class="lineno">10711</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l10712"></a><span class="lineno">10712</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l10713"></a><span class="lineno">10713</span>&#160;                            currRequestCost &lt; bestRequestCost ||</div><div class="line"><a name="l10714"></a><span class="lineno">10714</span>&#160;                            strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div><div class="line"><a name="l10715"></a><span class="lineno">10715</span>&#160;                        {</div><div class="line"><a name="l10716"></a><span class="lineno">10716</span>&#160;                            pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l10717"></a><span class="lineno">10717</span>&#160;                            bestRequest = currRequest;</div><div class="line"><a name="l10718"></a><span class="lineno">10718</span>&#160;                            bestRequestCost = currRequestCost;</div><div class="line"><a name="l10719"></a><span class="lineno">10719</span>&#160;</div><div class="line"><a name="l10720"></a><span class="lineno">10720</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div><div class="line"><a name="l10721"></a><span class="lineno">10721</span>&#160;                                strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div><div class="line"><a name="l10722"></a><span class="lineno">10722</span>&#160;                            {</div><div class="line"><a name="l10723"></a><span class="lineno">10723</span>&#160;                                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10724"></a><span class="lineno">10724</span>&#160;                            }</div><div class="line"><a name="l10725"></a><span class="lineno">10725</span>&#160;                        }</div><div class="line"><a name="l10726"></a><span class="lineno">10726</span>&#160;                    }</div><div class="line"><a name="l10727"></a><span class="lineno">10727</span>&#160;                }</div><div class="line"><a name="l10728"></a><span class="lineno">10728</span>&#160;            }</div><div class="line"><a name="l10729"></a><span class="lineno">10729</span>&#160;</div><div class="line"><a name="l10730"></a><span class="lineno">10730</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div><div class="line"><a name="l10731"></a><span class="lineno">10731</span>&#160;            {</div><div class="line"><a name="l10732"></a><span class="lineno">10732</span>&#160;                <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l10733"></a><span class="lineno">10733</span>&#160;                {</div><div class="line"><a name="l10734"></a><span class="lineno">10734</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l10735"></a><span class="lineno">10735</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10736"></a><span class="lineno">10736</span>&#160;                    {</div><div class="line"><a name="l10737"></a><span class="lineno">10737</span>&#160;                        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10738"></a><span class="lineno">10738</span>&#160;                    }</div><div class="line"><a name="l10739"></a><span class="lineno">10739</span>&#160;                }</div><div class="line"><a name="l10740"></a><span class="lineno">10740</span>&#160;</div><div class="line"><a name="l10741"></a><span class="lineno">10741</span>&#160;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;MakeRequestedAllocationsLost(</div><div class="line"><a name="l10742"></a><span class="lineno">10742</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l10743"></a><span class="lineno">10743</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l10744"></a><span class="lineno">10744</span>&#160;                    &amp;bestRequest))</div><div class="line"><a name="l10745"></a><span class="lineno">10745</span>&#160;                {</div><div class="line"><a name="l10746"></a><span class="lineno">10746</span>&#160;                    <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l10747"></a><span class="lineno">10747</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l10748"></a><span class="lineno">10748</span>&#160;                    {</div><div class="line"><a name="l10749"></a><span class="lineno">10749</span>&#160;                        m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l10750"></a><span class="lineno">10750</span>&#160;                    }</div><div class="line"><a name="l10751"></a><span class="lineno">10751</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div><div class="line"><a name="l10752"></a><span class="lineno">10752</span>&#160;                    *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l10753"></a><span class="lineno">10753</span>&#160;                    pBestRequestBlock-&gt;m_pMetadata-&gt;Alloc(bestRequest, suballocType, size, isUpperAddress, *pAllocation);</div><div class="line"><a name="l10754"></a><span class="lineno">10754</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l10755"></a><span class="lineno">10755</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l10756"></a><span class="lineno">10756</span>&#160;                        pBestRequestBlock,</div><div class="line"><a name="l10757"></a><span class="lineno">10757</span>&#160;                        bestRequest.offset,</div><div class="line"><a name="l10758"></a><span class="lineno">10758</span>&#160;                        alignment,</div><div class="line"><a name="l10759"></a><span class="lineno">10759</span>&#160;                        size,</div><div class="line"><a name="l10760"></a><span class="lineno">10760</span>&#160;                        suballocType,</div><div class="line"><a name="l10761"></a><span class="lineno">10761</span>&#160;                        mapped,</div><div class="line"><a name="l10762"></a><span class="lineno">10762</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="l10763"></a><span class="lineno">10763</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div><div class="line"><a name="l10764"></a><span class="lineno">10764</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="l10765"></a><span class="lineno">10765</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="l10766"></a><span class="lineno">10766</span>&#160;                    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l10767"></a><span class="lineno">10767</span>&#160;                    {</div><div class="line"><a name="l10768"></a><span class="lineno">10768</span>&#160;                        m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l10769"></a><span class="lineno">10769</span>&#160;                    }</div><div class="line"><a name="l10770"></a><span class="lineno">10770</span>&#160;                    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l10771"></a><span class="lineno">10771</span>&#160;                    {</div><div class="line"><a name="l10772"></a><span class="lineno">10772</span>&#160;                        VkResult res = pBestRequestBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div><div class="line"><a name="l10773"></a><span class="lineno">10773</span>&#160;                        VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l10774"></a><span class="lineno">10774</span>&#160;                    }</div><div class="line"><a name="l10775"></a><span class="lineno">10775</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10776"></a><span class="lineno">10776</span>&#160;                }</div><div class="line"><a name="l10777"></a><span class="lineno">10777</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="l10778"></a><span class="lineno">10778</span>&#160;            }</div><div class="line"><a name="l10779"></a><span class="lineno">10779</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l10780"></a><span class="lineno">10780</span>&#160;            {</div><div class="line"><a name="l10781"></a><span class="lineno">10781</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div><div class="line"><a name="l10782"></a><span class="lineno">10782</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10783"></a><span class="lineno">10783</span>&#160;            }</div><div class="line"><a name="l10784"></a><span class="lineno">10784</span>&#160;        }</div><div class="line"><a name="l10785"></a><span class="lineno">10785</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div><div class="line"><a name="l10786"></a><span class="lineno">10786</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div><div class="line"><a name="l10787"></a><span class="lineno">10787</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div><div class="line"><a name="l10788"></a><span class="lineno">10788</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div><div class="line"><a name="l10789"></a><span class="lineno">10789</span>&#160;        {</div><div class="line"><a name="l10790"></a><span class="lineno">10790</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div><div class="line"><a name="l10791"></a><span class="lineno">10791</span>&#160;        }</div><div class="line"><a name="l10792"></a><span class="lineno">10792</span>&#160;    }</div><div class="line"><a name="l10793"></a><span class="lineno">10793</span>&#160;</div><div class="line"><a name="l10794"></a><span class="lineno">10794</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l10795"></a><span class="lineno">10795</span>&#160;}</div><div class="line"><a name="l10796"></a><span class="lineno">10796</span>&#160;</div><div class="line"><a name="l10797"></a><span class="lineno">10797</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Free(</div><div class="line"><a name="l10798"></a><span class="lineno">10798</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l10799"></a><span class="lineno">10799</span>&#160;{</div><div class="line"><a name="l10800"></a><span class="lineno">10800</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div><div class="line"><a name="l10801"></a><span class="lineno">10801</span>&#160;</div><div class="line"><a name="l10802"></a><span class="lineno">10802</span>&#160;    <span class="comment">// Scope for lock.</span></div><div class="line"><a name="l10803"></a><span class="lineno">10803</span>&#160;    {</div><div class="line"><a name="l10804"></a><span class="lineno">10804</span>&#160;        VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10805"></a><span class="lineno">10805</span>&#160;</div><div class="line"><a name="l10806"></a><span class="lineno">10806</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l10807"></a><span class="lineno">10807</span>&#160;</div><div class="line"><a name="l10808"></a><span class="lineno">10808</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l10809"></a><span class="lineno">10809</span>&#160;        {</div><div class="line"><a name="l10810"></a><span class="lineno">10810</span>&#160;            VkResult res = pBlock-&gt;ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation-&gt;GetOffset(), hAllocation-&gt;GetSize());</div><div class="line"><a name="l10811"></a><span class="lineno">10811</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to validate magic value.&quot;</span>);</div><div class="line"><a name="l10812"></a><span class="lineno">10812</span>&#160;        }</div><div class="line"><a name="l10813"></a><span class="lineno">10813</span>&#160;</div><div class="line"><a name="l10814"></a><span class="lineno">10814</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</div><div class="line"><a name="l10815"></a><span class="lineno">10815</span>&#160;        {</div><div class="line"><a name="l10816"></a><span class="lineno">10816</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div><div class="line"><a name="l10817"></a><span class="lineno">10817</span>&#160;        }</div><div class="line"><a name="l10818"></a><span class="lineno">10818</span>&#160;</div><div class="line"><a name="l10819"></a><span class="lineno">10819</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Free(hAllocation);</div><div class="line"><a name="l10820"></a><span class="lineno">10820</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l10821"></a><span class="lineno">10821</span>&#160;</div><div class="line"><a name="l10822"></a><span class="lineno">10822</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l10823"></a><span class="lineno">10823</span>&#160;</div><div class="line"><a name="l10824"></a><span class="lineno">10824</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div><div class="line"><a name="l10825"></a><span class="lineno">10825</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l10826"></a><span class="lineno">10826</span>&#160;        {</div><div class="line"><a name="l10827"></a><span class="lineno">10827</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="l10828"></a><span class="lineno">10828</span>&#160;            <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l10829"></a><span class="lineno">10829</span>&#160;            {</div><div class="line"><a name="l10830"></a><span class="lineno">10830</span>&#160;                pBlockToDelete = pBlock;</div><div class="line"><a name="l10831"></a><span class="lineno">10831</span>&#160;                Remove(pBlock);</div><div class="line"><a name="l10832"></a><span class="lineno">10832</span>&#160;            }</div><div class="line"><a name="l10833"></a><span class="lineno">10833</span>&#160;            <span class="comment">// We now have first empty block.</span></div><div class="line"><a name="l10834"></a><span class="lineno">10834</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l10835"></a><span class="lineno">10835</span>&#160;            {</div><div class="line"><a name="l10836"></a><span class="lineno">10836</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l10837"></a><span class="lineno">10837</span>&#160;            }</div><div class="line"><a name="l10838"></a><span class="lineno">10838</span>&#160;        }</div><div class="line"><a name="l10839"></a><span class="lineno">10839</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="l10840"></a><span class="lineno">10840</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div><div class="line"><a name="l10841"></a><span class="lineno">10841</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock)</div><div class="line"><a name="l10842"></a><span class="lineno">10842</span>&#160;        {</div><div class="line"><a name="l10843"></a><span class="lineno">10843</span>&#160;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div><div class="line"><a name="l10844"></a><span class="lineno">10844</span>&#160;            <span class="keywordflow">if</span>(pLastBlock-&gt;m_pMetadata-&gt;IsEmpty() &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l10845"></a><span class="lineno">10845</span>&#160;            {</div><div class="line"><a name="l10846"></a><span class="lineno">10846</span>&#160;                pBlockToDelete = pLastBlock;</div><div class="line"><a name="l10847"></a><span class="lineno">10847</span>&#160;                m_Blocks.pop_back();</div><div class="line"><a name="l10848"></a><span class="lineno">10848</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l10849"></a><span class="lineno">10849</span>&#160;            }</div><div class="line"><a name="l10850"></a><span class="lineno">10850</span>&#160;        }</div><div class="line"><a name="l10851"></a><span class="lineno">10851</span>&#160;</div><div class="line"><a name="l10852"></a><span class="lineno">10852</span>&#160;        IncrementallySortBlocks();</div><div class="line"><a name="l10853"></a><span class="lineno">10853</span>&#160;    }</div><div class="line"><a name="l10854"></a><span class="lineno">10854</span>&#160;</div><div class="line"><a name="l10855"></a><span class="lineno">10855</span>&#160;    <span class="comment">// Destruction of a free Allocation. Deferred until this point, outside of mutex</span></div><div class="line"><a name="l10856"></a><span class="lineno">10856</span>&#160;    <span class="comment">// lock, for performance reason.</span></div><div class="line"><a name="l10857"></a><span class="lineno">10857</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div><div class="line"><a name="l10858"></a><span class="lineno">10858</span>&#160;    {</div><div class="line"><a name="l10859"></a><span class="lineno">10859</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty allocation&quot;</span>);</div><div class="line"><a name="l10860"></a><span class="lineno">10860</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l10861"></a><span class="lineno">10861</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div><div class="line"><a name="l10862"></a><span class="lineno">10862</span>&#160;    }</div><div class="line"><a name="l10863"></a><span class="lineno">10863</span>&#160;}</div><div class="line"><a name="l10864"></a><span class="lineno">10864</span>&#160;</div><div class="line"><a name="l10865"></a><span class="lineno">10865</span>&#160;VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div><div class="line"><a name="l10866"></a><span class="lineno">10866</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10867"></a><span class="lineno">10867</span>&#160;    VkDeviceSize result = 0;</div><div class="line"><a name="l10868"></a><span class="lineno">10868</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l10869"></a><span class="lineno">10869</span>&#160;    {</div><div class="line"><a name="l10870"></a><span class="lineno">10870</span>&#160;        result = VMA_MAX(result, m_Blocks[i]-&gt;m_pMetadata-&gt;GetSize());</div><div class="line"><a name="l10871"></a><span class="lineno">10871</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</div><div class="line"><a name="l10872"></a><span class="lineno">10872</span>&#160;        {</div><div class="line"><a name="l10873"></a><span class="lineno">10873</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l10874"></a><span class="lineno">10874</span>&#160;        }</div><div class="line"><a name="l10875"></a><span class="lineno">10875</span>&#160;    }</div><div class="line"><a name="l10876"></a><span class="lineno">10876</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l10877"></a><span class="lineno">10877</span>&#160;}</div><div class="line"><a name="l10878"></a><span class="lineno">10878</span>&#160;</div><div class="line"><a name="l10879"></a><span class="lineno">10879</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div><div class="line"><a name="l10880"></a><span class="lineno">10880</span>&#160;{</div><div class="line"><a name="l10881"></a><span class="lineno">10881</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l10882"></a><span class="lineno">10882</span>&#160;    {</div><div class="line"><a name="l10883"></a><span class="lineno">10883</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div><div class="line"><a name="l10884"></a><span class="lineno">10884</span>&#160;        {</div><div class="line"><a name="l10885"></a><span class="lineno">10885</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l10886"></a><span class="lineno">10886</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l10887"></a><span class="lineno">10887</span>&#160;        }</div><div class="line"><a name="l10888"></a><span class="lineno">10888</span>&#160;    }</div><div class="line"><a name="l10889"></a><span class="lineno">10889</span>&#160;    VMA_ASSERT(0);</div><div class="line"><a name="l10890"></a><span class="lineno">10890</span>&#160;}</div><div class="line"><a name="l10891"></a><span class="lineno">10891</span>&#160;</div><div class="line"><a name="l10892"></a><span class="lineno">10892</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div><div class="line"><a name="l10893"></a><span class="lineno">10893</span>&#160;{</div><div class="line"><a name="l10894"></a><span class="lineno">10894</span>&#160;    <span class="keywordflow">if</span>(m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>)</div><div class="line"><a name="l10895"></a><span class="lineno">10895</span>&#160;    {</div><div class="line"><a name="l10896"></a><span class="lineno">10896</span>&#160;        <span class="comment">// Bubble sort only until first swap.</span></div><div class="line"><a name="l10897"></a><span class="lineno">10897</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="l10898"></a><span class="lineno">10898</span>&#160;        {</div><div class="line"><a name="l10899"></a><span class="lineno">10899</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[i - 1]-&gt;m_pMetadata-&gt;GetSumFreeSize() &gt; m_Blocks[i]-&gt;m_pMetadata-&gt;GetSumFreeSize())</div><div class="line"><a name="l10900"></a><span class="lineno">10900</span>&#160;            {</div><div class="line"><a name="l10901"></a><span class="lineno">10901</span>&#160;                VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div><div class="line"><a name="l10902"></a><span class="lineno">10902</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l10903"></a><span class="lineno">10903</span>&#160;            }</div><div class="line"><a name="l10904"></a><span class="lineno">10904</span>&#160;        }</div><div class="line"><a name="l10905"></a><span class="lineno">10905</span>&#160;    }</div><div class="line"><a name="l10906"></a><span class="lineno">10906</span>&#160;}</div><div class="line"><a name="l10907"></a><span class="lineno">10907</span>&#160;</div><div class="line"><a name="l10908"></a><span class="lineno">10908</span>&#160;VkResult VmaBlockVector::AllocateFromBlock(</div><div class="line"><a name="l10909"></a><span class="lineno">10909</span>&#160;    VmaDeviceMemoryBlock* pBlock,</div><div class="line"><a name="l10910"></a><span class="lineno">10910</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l10911"></a><span class="lineno">10911</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l10912"></a><span class="lineno">10912</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l10913"></a><span class="lineno">10913</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l10914"></a><span class="lineno">10914</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div><div class="line"><a name="l10915"></a><span class="lineno">10915</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l10916"></a><span class="lineno">10916</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l10917"></a><span class="lineno">10917</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l10918"></a><span class="lineno">10918</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l10919"></a><span class="lineno">10919</span>&#160;{</div><div class="line"><a name="l10920"></a><span class="lineno">10920</span>&#160;    VMA_ASSERT((allocFlags &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="l10921"></a><span class="lineno">10921</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div><div class="line"><a name="l10922"></a><span class="lineno">10922</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div><div class="line"><a name="l10923"></a><span class="lineno">10923</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (allocFlags &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="l10924"></a><span class="lineno">10924</span>&#160;</div><div class="line"><a name="l10925"></a><span class="lineno">10925</span>&#160;    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l10926"></a><span class="lineno">10926</span>&#160;    <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l10927"></a><span class="lineno">10927</span>&#160;        currentFrameIndex,</div><div class="line"><a name="l10928"></a><span class="lineno">10928</span>&#160;        m_FrameInUseCount,</div><div class="line"><a name="l10929"></a><span class="lineno">10929</span>&#160;        m_BufferImageGranularity,</div><div class="line"><a name="l10930"></a><span class="lineno">10930</span>&#160;        size,</div><div class="line"><a name="l10931"></a><span class="lineno">10931</span>&#160;        alignment,</div><div class="line"><a name="l10932"></a><span class="lineno">10932</span>&#160;        isUpperAddress,</div><div class="line"><a name="l10933"></a><span class="lineno">10933</span>&#160;        suballocType,</div><div class="line"><a name="l10934"></a><span class="lineno">10934</span>&#160;        <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l10935"></a><span class="lineno">10935</span>&#160;        strategy,</div><div class="line"><a name="l10936"></a><span class="lineno">10936</span>&#160;        &amp;currRequest))</div><div class="line"><a name="l10937"></a><span class="lineno">10937</span>&#160;    {</div><div class="line"><a name="l10938"></a><span class="lineno">10938</span>&#160;        <span class="comment">// Allocate from pCurrBlock.</span></div><div class="line"><a name="l10939"></a><span class="lineno">10939</span>&#160;        VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l10940"></a><span class="lineno">10940</span>&#160;</div><div class="line"><a name="l10941"></a><span class="lineno">10941</span>&#160;        <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l10942"></a><span class="lineno">10942</span>&#160;        {</div><div class="line"><a name="l10943"></a><span class="lineno">10943</span>&#160;            VkResult res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l10944"></a><span class="lineno">10944</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10945"></a><span class="lineno">10945</span>&#160;            {</div><div class="line"><a name="l10946"></a><span class="lineno">10946</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10947"></a><span class="lineno">10947</span>&#160;            }</div><div class="line"><a name="l10948"></a><span class="lineno">10948</span>&#160;        }</div><div class="line"><a name="l10949"></a><span class="lineno">10949</span>&#160;            </div><div class="line"><a name="l10950"></a><span class="lineno">10950</span>&#160;        <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l10951"></a><span class="lineno">10951</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l10952"></a><span class="lineno">10952</span>&#160;        {</div><div class="line"><a name="l10953"></a><span class="lineno">10953</span>&#160;            m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l10954"></a><span class="lineno">10954</span>&#160;        }</div><div class="line"><a name="l10955"></a><span class="lineno">10955</span>&#160;            </div><div class="line"><a name="l10956"></a><span class="lineno">10956</span>&#160;        *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l10957"></a><span class="lineno">10957</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Alloc(currRequest, suballocType, size, isUpperAddress, *pAllocation);</div><div class="line"><a name="l10958"></a><span class="lineno">10958</span>&#160;        (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l10959"></a><span class="lineno">10959</span>&#160;            hCurrentPool,</div><div class="line"><a name="l10960"></a><span class="lineno">10960</span>&#160;            pBlock,</div><div class="line"><a name="l10961"></a><span class="lineno">10961</span>&#160;            currRequest.offset,</div><div class="line"><a name="l10962"></a><span class="lineno">10962</span>&#160;            alignment,</div><div class="line"><a name="l10963"></a><span class="lineno">10963</span>&#160;            size,</div><div class="line"><a name="l10964"></a><span class="lineno">10964</span>&#160;            suballocType,</div><div class="line"><a name="l10965"></a><span class="lineno">10965</span>&#160;            mapped,</div><div class="line"><a name="l10966"></a><span class="lineno">10966</span>&#160;            (allocFlags &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="l10967"></a><span class="lineno">10967</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l10968"></a><span class="lineno">10968</span>&#160;        (*pAllocation)-&gt;SetUserData(m_hAllocator, pUserData);</div><div class="line"><a name="l10969"></a><span class="lineno">10969</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l10970"></a><span class="lineno">10970</span>&#160;        {</div><div class="line"><a name="l10971"></a><span class="lineno">10971</span>&#160;            m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l10972"></a><span class="lineno">10972</span>&#160;        }</div><div class="line"><a name="l10973"></a><span class="lineno">10973</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l10974"></a><span class="lineno">10974</span>&#160;        {</div><div class="line"><a name="l10975"></a><span class="lineno">10975</span>&#160;            VkResult res = pBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div><div class="line"><a name="l10976"></a><span class="lineno">10976</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l10977"></a><span class="lineno">10977</span>&#160;        }</div><div class="line"><a name="l10978"></a><span class="lineno">10978</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10979"></a><span class="lineno">10979</span>&#160;    }</div><div class="line"><a name="l10980"></a><span class="lineno">10980</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l10981"></a><span class="lineno">10981</span>&#160;}</div><div class="line"><a name="l10982"></a><span class="lineno">10982</span>&#160;</div><div class="line"><a name="l10983"></a><span class="lineno">10983</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div><div class="line"><a name="l10984"></a><span class="lineno">10984</span>&#160;{</div><div class="line"><a name="l10985"></a><span class="lineno">10985</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l10986"></a><span class="lineno">10986</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l10987"></a><span class="lineno">10987</span>&#160;    allocInfo.allocationSize = blockSize;</div><div class="line"><a name="l10988"></a><span class="lineno">10988</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div><div class="line"><a name="l10989"></a><span class="lineno">10989</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div><div class="line"><a name="l10990"></a><span class="lineno">10990</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l10991"></a><span class="lineno">10991</span>&#160;    {</div><div class="line"><a name="l10992"></a><span class="lineno">10992</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10993"></a><span class="lineno">10993</span>&#160;    }</div><div class="line"><a name="l10994"></a><span class="lineno">10994</span>&#160;</div><div class="line"><a name="l10995"></a><span class="lineno">10995</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div><div class="line"><a name="l10996"></a><span class="lineno">10996</span>&#160;</div><div class="line"><a name="l10997"></a><span class="lineno">10997</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div><div class="line"><a name="l10998"></a><span class="lineno">10998</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div><div class="line"><a name="l10999"></a><span class="lineno">10999</span>&#160;    pBlock-&gt;Init(</div><div class="line"><a name="l11000"></a><span class="lineno">11000</span>&#160;        m_hAllocator,</div><div class="line"><a name="l11001"></a><span class="lineno">11001</span>&#160;        m_MemoryTypeIndex,</div><div class="line"><a name="l11002"></a><span class="lineno">11002</span>&#160;        mem,</div><div class="line"><a name="l11003"></a><span class="lineno">11003</span>&#160;        allocInfo.allocationSize,</div><div class="line"><a name="l11004"></a><span class="lineno">11004</span>&#160;        m_NextBlockId++,</div><div class="line"><a name="l11005"></a><span class="lineno">11005</span>&#160;        m_Algorithm);</div><div class="line"><a name="l11006"></a><span class="lineno">11006</span>&#160;</div><div class="line"><a name="l11007"></a><span class="lineno">11007</span>&#160;    m_Blocks.push_back(pBlock);</div><div class="line"><a name="l11008"></a><span class="lineno">11008</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div><div class="line"><a name="l11009"></a><span class="lineno">11009</span>&#160;    {</div><div class="line"><a name="l11010"></a><span class="lineno">11010</span>&#160;        *pNewBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l11011"></a><span class="lineno">11011</span>&#160;    }</div><div class="line"><a name="l11012"></a><span class="lineno">11012</span>&#160;</div><div class="line"><a name="l11013"></a><span class="lineno">11013</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11014"></a><span class="lineno">11014</span>&#160;}</div><div class="line"><a name="l11015"></a><span class="lineno">11015</span>&#160;</div><div class="line"><a name="l11016"></a><span class="lineno">11016</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l11017"></a><span class="lineno">11017</span>&#160;</div><div class="line"><a name="l11018"></a><span class="lineno">11018</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div><div class="line"><a name="l11019"></a><span class="lineno">11019</span>&#160;{</div><div class="line"><a name="l11020"></a><span class="lineno">11020</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11021"></a><span class="lineno">11021</span>&#160;</div><div class="line"><a name="l11022"></a><span class="lineno">11022</span>&#160;    json.BeginObject();</div><div class="line"><a name="l11023"></a><span class="lineno">11023</span>&#160;</div><div class="line"><a name="l11024"></a><span class="lineno">11024</span>&#160;    <span class="keywordflow">if</span>(m_IsCustomPool)</div><div class="line"><a name="l11025"></a><span class="lineno">11025</span>&#160;    {</div><div class="line"><a name="l11026"></a><span class="lineno">11026</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div><div class="line"><a name="l11027"></a><span class="lineno">11027</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</div><div class="line"><a name="l11028"></a><span class="lineno">11028</span>&#160;</div><div class="line"><a name="l11029"></a><span class="lineno">11029</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div><div class="line"><a name="l11030"></a><span class="lineno">11030</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l11031"></a><span class="lineno">11031</span>&#160;</div><div class="line"><a name="l11032"></a><span class="lineno">11032</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div><div class="line"><a name="l11033"></a><span class="lineno">11033</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l11034"></a><span class="lineno">11034</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div><div class="line"><a name="l11035"></a><span class="lineno">11035</span>&#160;        {</div><div class="line"><a name="l11036"></a><span class="lineno">11036</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l11037"></a><span class="lineno">11037</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div><div class="line"><a name="l11038"></a><span class="lineno">11038</span>&#160;        }</div><div class="line"><a name="l11039"></a><span class="lineno">11039</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div><div class="line"><a name="l11040"></a><span class="lineno">11040</span>&#160;        {</div><div class="line"><a name="l11041"></a><span class="lineno">11041</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l11042"></a><span class="lineno">11042</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div><div class="line"><a name="l11043"></a><span class="lineno">11043</span>&#160;        }</div><div class="line"><a name="l11044"></a><span class="lineno">11044</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div><div class="line"><a name="l11045"></a><span class="lineno">11045</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div><div class="line"><a name="l11046"></a><span class="lineno">11046</span>&#160;        json.EndObject();</div><div class="line"><a name="l11047"></a><span class="lineno">11047</span>&#160;</div><div class="line"><a name="l11048"></a><span class="lineno">11048</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</div><div class="line"><a name="l11049"></a><span class="lineno">11049</span>&#160;        {</div><div class="line"><a name="l11050"></a><span class="lineno">11050</span>&#160;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div><div class="line"><a name="l11051"></a><span class="lineno">11051</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div><div class="line"><a name="l11052"></a><span class="lineno">11052</span>&#160;        }</div><div class="line"><a name="l11053"></a><span class="lineno">11053</span>&#160;</div><div class="line"><a name="l11054"></a><span class="lineno">11054</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm != 0)</div><div class="line"><a name="l11055"></a><span class="lineno">11055</span>&#160;        {</div><div class="line"><a name="l11056"></a><span class="lineno">11056</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Algorithm&quot;</span>);</div><div class="line"><a name="l11057"></a><span class="lineno">11057</span>&#160;            json.WriteString(VmaAlgorithmToStr(m_Algorithm));</div><div class="line"><a name="l11058"></a><span class="lineno">11058</span>&#160;        }</div><div class="line"><a name="l11059"></a><span class="lineno">11059</span>&#160;    }</div><div class="line"><a name="l11060"></a><span class="lineno">11060</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l11061"></a><span class="lineno">11061</span>&#160;    {</div><div class="line"><a name="l11062"></a><span class="lineno">11062</span>&#160;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div><div class="line"><a name="l11063"></a><span class="lineno">11063</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l11064"></a><span class="lineno">11064</span>&#160;    }</div><div class="line"><a name="l11065"></a><span class="lineno">11065</span>&#160;</div><div class="line"><a name="l11066"></a><span class="lineno">11066</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l11067"></a><span class="lineno">11067</span>&#160;    json.BeginObject();</div><div class="line"><a name="l11068"></a><span class="lineno">11068</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="l11069"></a><span class="lineno">11069</span>&#160;    {</div><div class="line"><a name="l11070"></a><span class="lineno">11070</span>&#160;        json.BeginString();</div><div class="line"><a name="l11071"></a><span class="lineno">11071</span>&#160;        json.ContinueString(m_Blocks[i]-&gt;GetId());</div><div class="line"><a name="l11072"></a><span class="lineno">11072</span>&#160;        json.EndString();</div><div class="line"><a name="l11073"></a><span class="lineno">11073</span>&#160;</div><div class="line"><a name="l11074"></a><span class="lineno">11074</span>&#160;        m_Blocks[i]-&gt;m_pMetadata-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l11075"></a><span class="lineno">11075</span>&#160;    }</div><div class="line"><a name="l11076"></a><span class="lineno">11076</span>&#160;    json.EndObject();</div><div class="line"><a name="l11077"></a><span class="lineno">11077</span>&#160;</div><div class="line"><a name="l11078"></a><span class="lineno">11078</span>&#160;    json.EndObject();</div><div class="line"><a name="l11079"></a><span class="lineno">11079</span>&#160;}</div><div class="line"><a name="l11080"></a><span class="lineno">11080</span>&#160;</div><div class="line"><a name="l11081"></a><span class="lineno">11081</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l11082"></a><span class="lineno">11082</span>&#160;</div><div class="line"><a name="l11083"></a><span class="lineno">11083</span>&#160;VmaDefragmentator* VmaBlockVector::EnsureDefragmentator(</div><div class="line"><a name="l11084"></a><span class="lineno">11084</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11085"></a><span class="lineno">11085</span>&#160;    uint32_t currentFrameIndex)</div><div class="line"><a name="l11086"></a><span class="lineno">11086</span>&#160;{</div><div class="line"><a name="l11087"></a><span class="lineno">11087</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l11088"></a><span class="lineno">11088</span>&#160;    {</div><div class="line"><a name="l11089"></a><span class="lineno">11089</span>&#160;        m_pDefragmentator = vma_new(m_hAllocator, VmaDefragmentator)(</div><div class="line"><a name="l11090"></a><span class="lineno">11090</span>&#160;            hAllocator,</div><div class="line"><a name="l11091"></a><span class="lineno">11091</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l11092"></a><span class="lineno">11092</span>&#160;            currentFrameIndex);</div><div class="line"><a name="l11093"></a><span class="lineno">11093</span>&#160;    }</div><div class="line"><a name="l11094"></a><span class="lineno">11094</span>&#160;</div><div class="line"><a name="l11095"></a><span class="lineno">11095</span>&#160;    <span class="keywordflow">return</span> m_pDefragmentator;</div><div class="line"><a name="l11096"></a><span class="lineno">11096</span>&#160;}</div><div class="line"><a name="l11097"></a><span class="lineno">11097</span>&#160;</div><div class="line"><a name="l11098"></a><span class="lineno">11098</span>&#160;VkResult VmaBlockVector::Defragment(</div><div class="line"><a name="l11099"></a><span class="lineno">11099</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l11100"></a><span class="lineno">11100</span>&#160;    VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l11101"></a><span class="lineno">11101</span>&#160;    uint32_t&amp; maxAllocationsToMove)</div><div class="line"><a name="l11102"></a><span class="lineno">11102</span>&#160;{</div><div class="line"><a name="l11103"></a><span class="lineno">11103</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l11104"></a><span class="lineno">11104</span>&#160;    {</div><div class="line"><a name="l11105"></a><span class="lineno">11105</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11106"></a><span class="lineno">11106</span>&#160;    }</div><div class="line"><a name="l11107"></a><span class="lineno">11107</span>&#160;</div><div class="line"><a name="l11108"></a><span class="lineno">11108</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11109"></a><span class="lineno">11109</span>&#160;</div><div class="line"><a name="l11110"></a><span class="lineno">11110</span>&#160;    <span class="comment">// Defragment.</span></div><div class="line"><a name="l11111"></a><span class="lineno">11111</span>&#160;    VkResult result = m_pDefragmentator-&gt;Defragment(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l11112"></a><span class="lineno">11112</span>&#160;</div><div class="line"><a name="l11113"></a><span class="lineno">11113</span>&#160;    <span class="comment">// Accumulate statistics.</span></div><div class="line"><a name="l11114"></a><span class="lineno">11114</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l11115"></a><span class="lineno">11115</span>&#160;    {</div><div class="line"><a name="l11116"></a><span class="lineno">11116</span>&#160;        <span class="keyword">const</span> VkDeviceSize bytesMoved = m_pDefragmentator-&gt;GetBytesMoved();</div><div class="line"><a name="l11117"></a><span class="lineno">11117</span>&#160;        <span class="keyword">const</span> uint32_t allocationsMoved = m_pDefragmentator-&gt;GetAllocationsMoved();</div><div class="line"><a name="l11118"></a><span class="lineno">11118</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += bytesMoved;</div><div class="line"><a name="l11119"></a><span class="lineno">11119</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += allocationsMoved;</div><div class="line"><a name="l11120"></a><span class="lineno">11120</span>&#160;        VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div><div class="line"><a name="l11121"></a><span class="lineno">11121</span>&#160;        VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div><div class="line"><a name="l11122"></a><span class="lineno">11122</span>&#160;        maxBytesToMove -= bytesMoved;</div><div class="line"><a name="l11123"></a><span class="lineno">11123</span>&#160;        maxAllocationsToMove -= allocationsMoved;</div><div class="line"><a name="l11124"></a><span class="lineno">11124</span>&#160;    }</div><div class="line"><a name="l11125"></a><span class="lineno">11125</span>&#160;    </div><div class="line"><a name="l11126"></a><span class="lineno">11126</span>&#160;    <span class="comment">// Free empty blocks.</span></div><div class="line"><a name="l11127"></a><span class="lineno">11127</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l11128"></a><span class="lineno">11128</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l11129"></a><span class="lineno">11129</span>&#160;    {</div><div class="line"><a name="l11130"></a><span class="lineno">11130</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11131"></a><span class="lineno">11131</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l11132"></a><span class="lineno">11132</span>&#160;        {</div><div class="line"><a name="l11133"></a><span class="lineno">11133</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l11134"></a><span class="lineno">11134</span>&#160;            {</div><div class="line"><a name="l11135"></a><span class="lineno">11135</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l11136"></a><span class="lineno">11136</span>&#160;                {</div><div class="line"><a name="l11137"></a><span class="lineno">11137</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l11138"></a><span class="lineno">11138</span>&#160;                    pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock-&gt;m_pMetadata-&gt;GetSize();</div><div class="line"><a name="l11139"></a><span class="lineno">11139</span>&#160;                }</div><div class="line"><a name="l11140"></a><span class="lineno">11140</span>&#160;</div><div class="line"><a name="l11141"></a><span class="lineno">11141</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l11142"></a><span class="lineno">11142</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l11143"></a><span class="lineno">11143</span>&#160;                vma_delete(m_hAllocator, pBlock);</div><div class="line"><a name="l11144"></a><span class="lineno">11144</span>&#160;            }</div><div class="line"><a name="l11145"></a><span class="lineno">11145</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l11146"></a><span class="lineno">11146</span>&#160;            {</div><div class="line"><a name="l11147"></a><span class="lineno">11147</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l11148"></a><span class="lineno">11148</span>&#160;            }</div><div class="line"><a name="l11149"></a><span class="lineno">11149</span>&#160;        }</div><div class="line"><a name="l11150"></a><span class="lineno">11150</span>&#160;    }</div><div class="line"><a name="l11151"></a><span class="lineno">11151</span>&#160;</div><div class="line"><a name="l11152"></a><span class="lineno">11152</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l11153"></a><span class="lineno">11153</span>&#160;}</div><div class="line"><a name="l11154"></a><span class="lineno">11154</span>&#160;</div><div class="line"><a name="l11155"></a><span class="lineno">11155</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DestroyDefragmentator()</div><div class="line"><a name="l11156"></a><span class="lineno">11156</span>&#160;{</div><div class="line"><a name="l11157"></a><span class="lineno">11157</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator != VMA_NULL)</div><div class="line"><a name="l11158"></a><span class="lineno">11158</span>&#160;    {</div><div class="line"><a name="l11159"></a><span class="lineno">11159</span>&#160;        vma_delete(m_hAllocator, m_pDefragmentator);</div><div class="line"><a name="l11160"></a><span class="lineno">11160</span>&#160;        m_pDefragmentator = VMA_NULL;</div><div class="line"><a name="l11161"></a><span class="lineno">11161</span>&#160;    }</div><div class="line"><a name="l11162"></a><span class="lineno">11162</span>&#160;}</div><div class="line"><a name="l11163"></a><span class="lineno">11163</span>&#160;</div><div class="line"><a name="l11164"></a><span class="lineno">11164</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div><div class="line"><a name="l11165"></a><span class="lineno">11165</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l11166"></a><span class="lineno">11166</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l11167"></a><span class="lineno">11167</span>&#160;{</div><div class="line"><a name="l11168"></a><span class="lineno">11168</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11169"></a><span class="lineno">11169</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div><div class="line"><a name="l11170"></a><span class="lineno">11170</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l11171"></a><span class="lineno">11171</span>&#160;    {</div><div class="line"><a name="l11172"></a><span class="lineno">11172</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11173"></a><span class="lineno">11173</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l11174"></a><span class="lineno">11174</span>&#160;        lostAllocationCount += pBlock-&gt;m_pMetadata-&gt;MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div><div class="line"><a name="l11175"></a><span class="lineno">11175</span>&#160;    }</div><div class="line"><a name="l11176"></a><span class="lineno">11176</span>&#160;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div><div class="line"><a name="l11177"></a><span class="lineno">11177</span>&#160;    {</div><div class="line"><a name="l11178"></a><span class="lineno">11178</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div><div class="line"><a name="l11179"></a><span class="lineno">11179</span>&#160;    }</div><div class="line"><a name="l11180"></a><span class="lineno">11180</span>&#160;}</div><div class="line"><a name="l11181"></a><span class="lineno">11181</span>&#160;</div><div class="line"><a name="l11182"></a><span class="lineno">11182</span>&#160;VkResult VmaBlockVector::CheckCorruption()</div><div class="line"><a name="l11183"></a><span class="lineno">11183</span>&#160;{</div><div class="line"><a name="l11184"></a><span class="lineno">11184</span>&#160;    <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div><div class="line"><a name="l11185"></a><span class="lineno">11185</span>&#160;    {</div><div class="line"><a name="l11186"></a><span class="lineno">11186</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l11187"></a><span class="lineno">11187</span>&#160;    }</div><div class="line"><a name="l11188"></a><span class="lineno">11188</span>&#160;</div><div class="line"><a name="l11189"></a><span class="lineno">11189</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11190"></a><span class="lineno">11190</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l11191"></a><span class="lineno">11191</span>&#160;    {</div><div class="line"><a name="l11192"></a><span class="lineno">11192</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11193"></a><span class="lineno">11193</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l11194"></a><span class="lineno">11194</span>&#160;        VkResult res = pBlock-&gt;CheckCorruption(m_hAllocator);</div><div class="line"><a name="l11195"></a><span class="lineno">11195</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l11196"></a><span class="lineno">11196</span>&#160;        {</div><div class="line"><a name="l11197"></a><span class="lineno">11197</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11198"></a><span class="lineno">11198</span>&#160;        }</div><div class="line"><a name="l11199"></a><span class="lineno">11199</span>&#160;    }</div><div class="line"><a name="l11200"></a><span class="lineno">11200</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11201"></a><span class="lineno">11201</span>&#160;}</div><div class="line"><a name="l11202"></a><span class="lineno">11202</span>&#160;</div><div class="line"><a name="l11203"></a><span class="lineno">11203</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="l11204"></a><span class="lineno">11204</span>&#160;{</div><div class="line"><a name="l11205"></a><span class="lineno">11205</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l11206"></a><span class="lineno">11206</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l11207"></a><span class="lineno">11207</span>&#160;</div><div class="line"><a name="l11208"></a><span class="lineno">11208</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11209"></a><span class="lineno">11209</span>&#160;</div><div class="line"><a name="l11210"></a><span class="lineno">11210</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l11211"></a><span class="lineno">11211</span>&#160;    {</div><div class="line"><a name="l11212"></a><span class="lineno">11212</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11213"></a><span class="lineno">11213</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l11214"></a><span class="lineno">11214</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l11215"></a><span class="lineno">11215</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l11216"></a><span class="lineno">11216</span>&#160;        pBlock-&gt;m_pMetadata-&gt;CalcAllocationStatInfo(allocationStatInfo);</div><div class="line"><a name="l11217"></a><span class="lineno">11217</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l11218"></a><span class="lineno">11218</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l11219"></a><span class="lineno">11219</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l11220"></a><span class="lineno">11220</span>&#160;    }</div><div class="line"><a name="l11221"></a><span class="lineno">11221</span>&#160;}</div><div class="line"><a name="l11222"></a><span class="lineno">11222</span>&#160;</div><div class="line"><a name="l11224"></a><span class="lineno">11224</span>&#160;<span class="comment">// VmaDefragmentator members definition</span></div><div class="line"><a name="l11225"></a><span class="lineno">11225</span>&#160;</div><div class="line"><a name="l11226"></a><span class="lineno">11226</span>&#160;VmaDefragmentator::VmaDefragmentator(</div><div class="line"><a name="l11227"></a><span class="lineno">11227</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11228"></a><span class="lineno">11228</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l11229"></a><span class="lineno">11229</span>&#160;    uint32_t currentFrameIndex) :</div><div class="line"><a name="l11230"></a><span class="lineno">11230</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l11231"></a><span class="lineno">11231</span>&#160;    m_pBlockVector(pBlockVector),</div><div class="line"><a name="l11232"></a><span class="lineno">11232</span>&#160;    m_CurrentFrameIndex(currentFrameIndex),</div><div class="line"><a name="l11233"></a><span class="lineno">11233</span>&#160;    m_BytesMoved(0),</div><div class="line"><a name="l11234"></a><span class="lineno">11234</span>&#160;    m_AllocationsMoved(0),</div><div class="line"><a name="l11235"></a><span class="lineno">11235</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocationInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l11236"></a><span class="lineno">11236</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l11237"></a><span class="lineno">11237</span>&#160;{</div><div class="line"><a name="l11238"></a><span class="lineno">11238</span>&#160;    VMA_ASSERT(pBlockVector-&gt;GetAlgorithm() == 0);</div><div class="line"><a name="l11239"></a><span class="lineno">11239</span>&#160;}</div><div class="line"><a name="l11240"></a><span class="lineno">11240</span>&#160;</div><div class="line"><a name="l11241"></a><span class="lineno">11241</span>&#160;VmaDefragmentator::~VmaDefragmentator()</div><div class="line"><a name="l11242"></a><span class="lineno">11242</span>&#160;{</div><div class="line"><a name="l11243"></a><span class="lineno">11243</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l11244"></a><span class="lineno">11244</span>&#160;    {</div><div class="line"><a name="l11245"></a><span class="lineno">11245</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l11246"></a><span class="lineno">11246</span>&#160;    }</div><div class="line"><a name="l11247"></a><span class="lineno">11247</span>&#160;}</div><div class="line"><a name="l11248"></a><span class="lineno">11248</span>&#160;</div><div class="line"><a name="l11249"></a><span class="lineno">11249</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="l11250"></a><span class="lineno">11250</span>&#160;{</div><div class="line"><a name="l11251"></a><span class="lineno">11251</span>&#160;    AllocationInfo allocInfo;</div><div class="line"><a name="l11252"></a><span class="lineno">11252</span>&#160;    allocInfo.m_hAllocation = hAlloc;</div><div class="line"><a name="l11253"></a><span class="lineno">11253</span>&#160;    allocInfo.m_pChanged = pChanged;</div><div class="line"><a name="l11254"></a><span class="lineno">11254</span>&#160;    m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l11255"></a><span class="lineno">11255</span>&#160;}</div><div class="line"><a name="l11256"></a><span class="lineno">11256</span>&#160;</div><div class="line"><a name="l11257"></a><span class="lineno">11257</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="l11258"></a><span class="lineno">11258</span>&#160;{</div><div class="line"><a name="l11259"></a><span class="lineno">11259</span>&#160;    <span class="comment">// It has already been mapped for defragmentation.</span></div><div class="line"><a name="l11260"></a><span class="lineno">11260</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation)</div><div class="line"><a name="l11261"></a><span class="lineno">11261</span>&#160;    {</div><div class="line"><a name="l11262"></a><span class="lineno">11262</span>&#160;        *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l11263"></a><span class="lineno">11263</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11264"></a><span class="lineno">11264</span>&#160;    }</div><div class="line"><a name="l11265"></a><span class="lineno">11265</span>&#160;            </div><div class="line"><a name="l11266"></a><span class="lineno">11266</span>&#160;    <span class="comment">// It is originally mapped.</span></div><div class="line"><a name="l11267"></a><span class="lineno">11267</span>&#160;    <span class="keywordflow">if</span>(m_pBlock-&gt;GetMappedData())</div><div class="line"><a name="l11268"></a><span class="lineno">11268</span>&#160;    {</div><div class="line"><a name="l11269"></a><span class="lineno">11269</span>&#160;        *ppMappedData = m_pBlock-&gt;GetMappedData();</div><div class="line"><a name="l11270"></a><span class="lineno">11270</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11271"></a><span class="lineno">11271</span>&#160;    }</div><div class="line"><a name="l11272"></a><span class="lineno">11272</span>&#160;            </div><div class="line"><a name="l11273"></a><span class="lineno">11273</span>&#160;    <span class="comment">// Map on first usage.</span></div><div class="line"><a name="l11274"></a><span class="lineno">11274</span>&#160;    VkResult res = m_pBlock-&gt;Map(hAllocator, 1, &amp;m_pMappedDataForDefragmentation);</div><div class="line"><a name="l11275"></a><span class="lineno">11275</span>&#160;    *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l11276"></a><span class="lineno">11276</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11277"></a><span class="lineno">11277</span>&#160;}</div><div class="line"><a name="l11278"></a><span class="lineno">11278</span>&#160;</div><div class="line"><a name="l11279"></a><span class="lineno">11279</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="l11280"></a><span class="lineno">11280</span>&#160;{</div><div class="line"><a name="l11281"></a><span class="lineno">11281</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation != VMA_NULL)</div><div class="line"><a name="l11282"></a><span class="lineno">11282</span>&#160;    {</div><div class="line"><a name="l11283"></a><span class="lineno">11283</span>&#160;        m_pBlock-&gt;Unmap(hAllocator, 1);</div><div class="line"><a name="l11284"></a><span class="lineno">11284</span>&#160;    }</div><div class="line"><a name="l11285"></a><span class="lineno">11285</span>&#160;}</div><div class="line"><a name="l11286"></a><span class="lineno">11286</span>&#160;</div><div class="line"><a name="l11287"></a><span class="lineno">11287</span>&#160;VkResult VmaDefragmentator::DefragmentRound(</div><div class="line"><a name="l11288"></a><span class="lineno">11288</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l11289"></a><span class="lineno">11289</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l11290"></a><span class="lineno">11290</span>&#160;{</div><div class="line"><a name="l11291"></a><span class="lineno">11291</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div><div class="line"><a name="l11292"></a><span class="lineno">11292</span>&#160;    {</div><div class="line"><a name="l11293"></a><span class="lineno">11293</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11294"></a><span class="lineno">11294</span>&#160;    }</div><div class="line"><a name="l11295"></a><span class="lineno">11295</span>&#160;</div><div class="line"><a name="l11296"></a><span class="lineno">11296</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l11297"></a><span class="lineno">11297</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l11298"></a><span class="lineno">11298</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l11299"></a><span class="lineno">11299</span>&#160;    {</div><div class="line"><a name="l11300"></a><span class="lineno">11300</span>&#160;        <span class="comment">// 1. Find next allocation to move.</span></div><div class="line"><a name="l11301"></a><span class="lineno">11301</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="l11302"></a><span class="lineno">11302</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="l11303"></a><span class="lineno">11303</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</div><div class="line"><a name="l11304"></a><span class="lineno">11304</span>&#160;        {</div><div class="line"><a name="l11305"></a><span class="lineno">11305</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div><div class="line"><a name="l11306"></a><span class="lineno">11306</span>&#160;            {</div><div class="line"><a name="l11307"></a><span class="lineno">11307</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div><div class="line"><a name="l11308"></a><span class="lineno">11308</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == 0)</div><div class="line"><a name="l11309"></a><span class="lineno">11309</span>&#160;                {</div><div class="line"><a name="l11310"></a><span class="lineno">11310</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11311"></a><span class="lineno">11311</span>&#160;                }</div><div class="line"><a name="l11312"></a><span class="lineno">11312</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l11313"></a><span class="lineno">11313</span>&#160;                {</div><div class="line"><a name="l11314"></a><span class="lineno">11314</span>&#160;                    --srcBlockIndex;</div><div class="line"><a name="l11315"></a><span class="lineno">11315</span>&#160;                    srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l11316"></a><span class="lineno">11316</span>&#160;                }</div><div class="line"><a name="l11317"></a><span class="lineno">11317</span>&#160;            }</div><div class="line"><a name="l11318"></a><span class="lineno">11318</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l11319"></a><span class="lineno">11319</span>&#160;            {</div><div class="line"><a name="l11320"></a><span class="lineno">11320</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</div><div class="line"><a name="l11321"></a><span class="lineno">11321</span>&#160;            }</div><div class="line"><a name="l11322"></a><span class="lineno">11322</span>&#160;        }</div><div class="line"><a name="l11323"></a><span class="lineno">11323</span>&#160;        </div><div class="line"><a name="l11324"></a><span class="lineno">11324</span>&#160;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div><div class="line"><a name="l11325"></a><span class="lineno">11325</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div><div class="line"><a name="l11326"></a><span class="lineno">11326</span>&#160;</div><div class="line"><a name="l11327"></a><span class="lineno">11327</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l11328"></a><span class="lineno">11328</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div><div class="line"><a name="l11329"></a><span class="lineno">11329</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div><div class="line"><a name="l11330"></a><span class="lineno">11330</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div><div class="line"><a name="l11331"></a><span class="lineno">11331</span>&#160;</div><div class="line"><a name="l11332"></a><span class="lineno">11332</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="l11333"></a><span class="lineno">11333</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="l11334"></a><span class="lineno">11334</span>&#160;        {</div><div class="line"><a name="l11335"></a><span class="lineno">11335</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div><div class="line"><a name="l11336"></a><span class="lineno">11336</span>&#160;            VmaAllocationRequest dstAllocRequest;</div><div class="line"><a name="l11337"></a><span class="lineno">11337</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l11338"></a><span class="lineno">11338</span>&#160;                m_CurrentFrameIndex,</div><div class="line"><a name="l11339"></a><span class="lineno">11339</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div><div class="line"><a name="l11340"></a><span class="lineno">11340</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l11341"></a><span class="lineno">11341</span>&#160;                size,</div><div class="line"><a name="l11342"></a><span class="lineno">11342</span>&#160;                alignment,</div><div class="line"><a name="l11343"></a><span class="lineno">11343</span>&#160;                <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div><div class="line"><a name="l11344"></a><span class="lineno">11344</span>&#160;                suballocType,</div><div class="line"><a name="l11345"></a><span class="lineno">11345</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l11346"></a><span class="lineno">11346</span>&#160;                <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>,</div><div class="line"><a name="l11347"></a><span class="lineno">11347</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div><div class="line"><a name="l11348"></a><span class="lineno">11348</span>&#160;            MoveMakesSense(</div><div class="line"><a name="l11349"></a><span class="lineno">11349</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div><div class="line"><a name="l11350"></a><span class="lineno">11350</span>&#160;            {</div><div class="line"><a name="l11351"></a><span class="lineno">11351</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l11352"></a><span class="lineno">11352</span>&#160;</div><div class="line"><a name="l11353"></a><span class="lineno">11353</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div><div class="line"><a name="l11354"></a><span class="lineno">11354</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div><div class="line"><a name="l11355"></a><span class="lineno">11355</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</div><div class="line"><a name="l11356"></a><span class="lineno">11356</span>&#160;                {</div><div class="line"><a name="l11357"></a><span class="lineno">11357</span>&#160;                    <span class="keywordflow">return</span> VK_INCOMPLETE;</div><div class="line"><a name="l11358"></a><span class="lineno">11358</span>&#160;                }</div><div class="line"><a name="l11359"></a><span class="lineno">11359</span>&#160;</div><div class="line"><a name="l11360"></a><span class="lineno">11360</span>&#160;                <span class="keywordtype">void</span>* pDstMappedData = VMA_NULL;</div><div class="line"><a name="l11361"></a><span class="lineno">11361</span>&#160;                VkResult res = pDstBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pDstMappedData);</div><div class="line"><a name="l11362"></a><span class="lineno">11362</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l11363"></a><span class="lineno">11363</span>&#160;                {</div><div class="line"><a name="l11364"></a><span class="lineno">11364</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11365"></a><span class="lineno">11365</span>&#160;                }</div><div class="line"><a name="l11366"></a><span class="lineno">11366</span>&#160;</div><div class="line"><a name="l11367"></a><span class="lineno">11367</span>&#160;                <span class="keywordtype">void</span>* pSrcMappedData = VMA_NULL;</div><div class="line"><a name="l11368"></a><span class="lineno">11368</span>&#160;                res = pSrcBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pSrcMappedData);</div><div class="line"><a name="l11369"></a><span class="lineno">11369</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l11370"></a><span class="lineno">11370</span>&#160;                {</div><div class="line"><a name="l11371"></a><span class="lineno">11371</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11372"></a><span class="lineno">11372</span>&#160;                }</div><div class="line"><a name="l11373"></a><span class="lineno">11373</span>&#160;                </div><div class="line"><a name="l11374"></a><span class="lineno">11374</span>&#160;                <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div><div class="line"><a name="l11375"></a><span class="lineno">11375</span>&#160;                memcpy(</div><div class="line"><a name="l11376"></a><span class="lineno">11376</span>&#160;                    reinterpret_cast&lt;char*&gt;(pDstMappedData) + dstAllocRequest.offset,</div><div class="line"><a name="l11377"></a><span class="lineno">11377</span>&#160;                    reinterpret_cast&lt;char*&gt;(pSrcMappedData) + srcOffset,</div><div class="line"><a name="l11378"></a><span class="lineno">11378</span>&#160;                    static_cast&lt;size_t&gt;(size));</div><div class="line"><a name="l11379"></a><span class="lineno">11379</span>&#160;</div><div class="line"><a name="l11380"></a><span class="lineno">11380</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l11381"></a><span class="lineno">11381</span>&#160;                {</div><div class="line"><a name="l11382"></a><span class="lineno">11382</span>&#160;                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l11383"></a><span class="lineno">11383</span>&#160;                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset + size);</div><div class="line"><a name="l11384"></a><span class="lineno">11384</span>&#160;                }</div><div class="line"><a name="l11385"></a><span class="lineno">11385</span>&#160;                </div><div class="line"><a name="l11386"></a><span class="lineno">11386</span>&#160;                pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;Alloc(</div><div class="line"><a name="l11387"></a><span class="lineno">11387</span>&#160;                    dstAllocRequest,</div><div class="line"><a name="l11388"></a><span class="lineno">11388</span>&#160;                    suballocType,</div><div class="line"><a name="l11389"></a><span class="lineno">11389</span>&#160;                    size,</div><div class="line"><a name="l11390"></a><span class="lineno">11390</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div><div class="line"><a name="l11391"></a><span class="lineno">11391</span>&#160;                    allocInfo.m_hAllocation);</div><div class="line"><a name="l11392"></a><span class="lineno">11392</span>&#160;                pSrcBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;FreeAtOffset(srcOffset);</div><div class="line"><a name="l11393"></a><span class="lineno">11393</span>&#160;                </div><div class="line"><a name="l11394"></a><span class="lineno">11394</span>&#160;                allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div><div class="line"><a name="l11395"></a><span class="lineno">11395</span>&#160;</div><div class="line"><a name="l11396"></a><span class="lineno">11396</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div><div class="line"><a name="l11397"></a><span class="lineno">11397</span>&#160;                {</div><div class="line"><a name="l11398"></a><span class="lineno">11398</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</div><div class="line"><a name="l11399"></a><span class="lineno">11399</span>&#160;                }</div><div class="line"><a name="l11400"></a><span class="lineno">11400</span>&#160;</div><div class="line"><a name="l11401"></a><span class="lineno">11401</span>&#160;                ++m_AllocationsMoved;</div><div class="line"><a name="l11402"></a><span class="lineno">11402</span>&#160;                m_BytesMoved += size;</div><div class="line"><a name="l11403"></a><span class="lineno">11403</span>&#160;</div><div class="line"><a name="l11404"></a><span class="lineno">11404</span>&#160;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div><div class="line"><a name="l11405"></a><span class="lineno">11405</span>&#160;</div><div class="line"><a name="l11406"></a><span class="lineno">11406</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l11407"></a><span class="lineno">11407</span>&#160;            }</div><div class="line"><a name="l11408"></a><span class="lineno">11408</span>&#160;        }</div><div class="line"><a name="l11409"></a><span class="lineno">11409</span>&#160;</div><div class="line"><a name="l11410"></a><span class="lineno">11410</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="l11411"></a><span class="lineno">11411</span>&#160;</div><div class="line"><a name="l11412"></a><span class="lineno">11412</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div><div class="line"><a name="l11413"></a><span class="lineno">11413</span>&#160;        {</div><div class="line"><a name="l11414"></a><span class="lineno">11414</span>&#160;            --srcAllocIndex;</div><div class="line"><a name="l11415"></a><span class="lineno">11415</span>&#160;        }</div><div class="line"><a name="l11416"></a><span class="lineno">11416</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l11417"></a><span class="lineno">11417</span>&#160;        {</div><div class="line"><a name="l11418"></a><span class="lineno">11418</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div><div class="line"><a name="l11419"></a><span class="lineno">11419</span>&#160;            {</div><div class="line"><a name="l11420"></a><span class="lineno">11420</span>&#160;                --srcBlockIndex;</div><div class="line"><a name="l11421"></a><span class="lineno">11421</span>&#160;                srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l11422"></a><span class="lineno">11422</span>&#160;            }</div><div class="line"><a name="l11423"></a><span class="lineno">11423</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l11424"></a><span class="lineno">11424</span>&#160;            {</div><div class="line"><a name="l11425"></a><span class="lineno">11425</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11426"></a><span class="lineno">11426</span>&#160;            }</div><div class="line"><a name="l11427"></a><span class="lineno">11427</span>&#160;        }</div><div class="line"><a name="l11428"></a><span class="lineno">11428</span>&#160;    }</div><div class="line"><a name="l11429"></a><span class="lineno">11429</span>&#160;}</div><div class="line"><a name="l11430"></a><span class="lineno">11430</span>&#160;</div><div class="line"><a name="l11431"></a><span class="lineno">11431</span>&#160;VkResult VmaDefragmentator::Defragment(</div><div class="line"><a name="l11432"></a><span class="lineno">11432</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l11433"></a><span class="lineno">11433</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l11434"></a><span class="lineno">11434</span>&#160;{</div><div class="line"><a name="l11435"></a><span class="lineno">11435</span>&#160;    <span class="keywordflow">if</span>(m_Allocations.empty())</div><div class="line"><a name="l11436"></a><span class="lineno">11436</span>&#160;    {</div><div class="line"><a name="l11437"></a><span class="lineno">11437</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11438"></a><span class="lineno">11438</span>&#160;    }</div><div class="line"><a name="l11439"></a><span class="lineno">11439</span>&#160;</div><div class="line"><a name="l11440"></a><span class="lineno">11440</span>&#160;    <span class="comment">// Create block info for each block.</span></div><div class="line"><a name="l11441"></a><span class="lineno">11441</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="l11442"></a><span class="lineno">11442</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="l11443"></a><span class="lineno">11443</span>&#160;    {</div><div class="line"><a name="l11444"></a><span class="lineno">11444</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l11445"></a><span class="lineno">11445</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div><div class="line"><a name="l11446"></a><span class="lineno">11446</span>&#160;        m_Blocks.push_back(pBlockInfo);</div><div class="line"><a name="l11447"></a><span class="lineno">11447</span>&#160;    }</div><div class="line"><a name="l11448"></a><span class="lineno">11448</span>&#160;</div><div class="line"><a name="l11449"></a><span class="lineno">11449</span>&#160;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div><div class="line"><a name="l11450"></a><span class="lineno">11450</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div><div class="line"><a name="l11451"></a><span class="lineno">11451</span>&#160;</div><div class="line"><a name="l11452"></a><span class="lineno">11452</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="l11453"></a><span class="lineno">11453</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="l11454"></a><span class="lineno">11454</span>&#160;    {</div><div class="line"><a name="l11455"></a><span class="lineno">11455</span>&#160;        AllocationInfo&amp; allocInfo = m_Allocations[blockIndex];</div><div class="line"><a name="l11456"></a><span class="lineno">11456</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="l11457"></a><span class="lineno">11457</span>&#160;        <span class="keywordflow">if</span>(allocInfo.m_hAllocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l11458"></a><span class="lineno">11458</span>&#160;        {</div><div class="line"><a name="l11459"></a><span class="lineno">11459</span>&#160;            VmaDeviceMemoryBlock* pBlock = allocInfo.m_hAllocation-&gt;GetBlock();</div><div class="line"><a name="l11460"></a><span class="lineno">11460</span>&#160;            BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div><div class="line"><a name="l11461"></a><span class="lineno">11461</span>&#160;            <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div><div class="line"><a name="l11462"></a><span class="lineno">11462</span>&#160;            {</div><div class="line"><a name="l11463"></a><span class="lineno">11463</span>&#160;                (*it)-&gt;m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l11464"></a><span class="lineno">11464</span>&#160;            }</div><div class="line"><a name="l11465"></a><span class="lineno">11465</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l11466"></a><span class="lineno">11466</span>&#160;            {</div><div class="line"><a name="l11467"></a><span class="lineno">11467</span>&#160;                VMA_ASSERT(0);</div><div class="line"><a name="l11468"></a><span class="lineno">11468</span>&#160;            }</div><div class="line"><a name="l11469"></a><span class="lineno">11469</span>&#160;        }</div><div class="line"><a name="l11470"></a><span class="lineno">11470</span>&#160;    }</div><div class="line"><a name="l11471"></a><span class="lineno">11471</span>&#160;    m_Allocations.clear();</div><div class="line"><a name="l11472"></a><span class="lineno">11472</span>&#160;</div><div class="line"><a name="l11473"></a><span class="lineno">11473</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="l11474"></a><span class="lineno">11474</span>&#160;    {</div><div class="line"><a name="l11475"></a><span class="lineno">11475</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div><div class="line"><a name="l11476"></a><span class="lineno">11476</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div><div class="line"><a name="l11477"></a><span class="lineno">11477</span>&#160;        pBlockInfo-&gt;SortAllocationsBySizeDescecnding();</div><div class="line"><a name="l11478"></a><span class="lineno">11478</span>&#160;    }</div><div class="line"><a name="l11479"></a><span class="lineno">11479</span>&#160;</div><div class="line"><a name="l11480"></a><span class="lineno">11480</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="l11481"></a><span class="lineno">11481</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div><div class="line"><a name="l11482"></a><span class="lineno">11482</span>&#160;</div><div class="line"><a name="l11483"></a><span class="lineno">11483</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div><div class="line"><a name="l11484"></a><span class="lineno">11484</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l11485"></a><span class="lineno">11485</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="l11486"></a><span class="lineno">11486</span>&#160;    {</div><div class="line"><a name="l11487"></a><span class="lineno">11487</span>&#160;        result = DefragmentRound(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l11488"></a><span class="lineno">11488</span>&#160;    }</div><div class="line"><a name="l11489"></a><span class="lineno">11489</span>&#160;</div><div class="line"><a name="l11490"></a><span class="lineno">11490</span>&#160;    <span class="comment">// Unmap blocks that were mapped for defragmentation.</span></div><div class="line"><a name="l11491"></a><span class="lineno">11491</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="l11492"></a><span class="lineno">11492</span>&#160;    {</div><div class="line"><a name="l11493"></a><span class="lineno">11493</span>&#160;        m_Blocks[blockIndex]-&gt;Unmap(m_hAllocator);</div><div class="line"><a name="l11494"></a><span class="lineno">11494</span>&#160;    }</div><div class="line"><a name="l11495"></a><span class="lineno">11495</span>&#160;</div><div class="line"><a name="l11496"></a><span class="lineno">11496</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l11497"></a><span class="lineno">11497</span>&#160;}</div><div class="line"><a name="l11498"></a><span class="lineno">11498</span>&#160;</div><div class="line"><a name="l11499"></a><span class="lineno">11499</span>&#160;<span class="keywordtype">bool</span> VmaDefragmentator::MoveMakesSense(</div><div class="line"><a name="l11500"></a><span class="lineno">11500</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l11501"></a><span class="lineno">11501</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div><div class="line"><a name="l11502"></a><span class="lineno">11502</span>&#160;{</div><div class="line"><a name="l11503"></a><span class="lineno">11503</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</div><div class="line"><a name="l11504"></a><span class="lineno">11504</span>&#160;    {</div><div class="line"><a name="l11505"></a><span class="lineno">11505</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l11506"></a><span class="lineno">11506</span>&#160;    }</div><div class="line"><a name="l11507"></a><span class="lineno">11507</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div><div class="line"><a name="l11508"></a><span class="lineno">11508</span>&#160;    {</div><div class="line"><a name="l11509"></a><span class="lineno">11509</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l11510"></a><span class="lineno">11510</span>&#160;    }</div><div class="line"><a name="l11511"></a><span class="lineno">11511</span>&#160;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</div><div class="line"><a name="l11512"></a><span class="lineno">11512</span>&#160;    {</div><div class="line"><a name="l11513"></a><span class="lineno">11513</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l11514"></a><span class="lineno">11514</span>&#160;    }</div><div class="line"><a name="l11515"></a><span class="lineno">11515</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l11516"></a><span class="lineno">11516</span>&#160;}</div><div class="line"><a name="l11517"></a><span class="lineno">11517</span>&#160;</div><div class="line"><a name="l11519"></a><span class="lineno">11519</span>&#160;<span class="comment">// VmaRecorder</span></div><div class="line"><a name="l11520"></a><span class="lineno">11520</span>&#160;</div><div class="line"><a name="l11521"></a><span class="lineno">11521</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l11522"></a><span class="lineno">11522</span>&#160;</div><div class="line"><a name="l11523"></a><span class="lineno">11523</span>&#160;VmaRecorder::VmaRecorder() :</div><div class="line"><a name="l11524"></a><span class="lineno">11524</span>&#160;    m_UseMutex(true),</div><div class="line"><a name="l11525"></a><span class="lineno">11525</span>&#160;    m_Flags(0),</div><div class="line"><a name="l11526"></a><span class="lineno">11526</span>&#160;    m_File(VMA_NULL),</div><div class="line"><a name="l11527"></a><span class="lineno">11527</span>&#160;    m_Freq(INT64_MAX),</div><div class="line"><a name="l11528"></a><span class="lineno">11528</span>&#160;    m_StartCounter(INT64_MAX)</div><div class="line"><a name="l11529"></a><span class="lineno">11529</span>&#160;{</div><div class="line"><a name="l11530"></a><span class="lineno">11530</span>&#160;}</div><div class="line"><a name="l11531"></a><span class="lineno">11531</span>&#160;</div><div class="line"><a name="l11532"></a><span class="lineno">11532</span>&#160;VkResult VmaRecorder::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex)</div><div class="line"><a name="l11533"></a><span class="lineno">11533</span>&#160;{</div><div class="line"><a name="l11534"></a><span class="lineno">11534</span>&#160;    m_UseMutex = useMutex;</div><div class="line"><a name="l11535"></a><span class="lineno">11535</span>&#160;    m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div><div class="line"><a name="l11536"></a><span class="lineno">11536</span>&#160;</div><div class="line"><a name="l11537"></a><span class="lineno">11537</span>&#160;    QueryPerformanceFrequency((LARGE_INTEGER*)&amp;m_Freq);</div><div class="line"><a name="l11538"></a><span class="lineno">11538</span>&#160;    QueryPerformanceCounter((LARGE_INTEGER*)&amp;m_StartCounter);</div><div class="line"><a name="l11539"></a><span class="lineno">11539</span>&#160;</div><div class="line"><a name="l11540"></a><span class="lineno">11540</span>&#160;    <span class="comment">// Open file for writing.</span></div><div class="line"><a name="l11541"></a><span class="lineno">11541</span>&#160;    errno_t err = fopen_s(&amp;m_File, settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">&quot;wb&quot;</span>);</div><div class="line"><a name="l11542"></a><span class="lineno">11542</span>&#160;    <span class="keywordflow">if</span>(err != 0)</div><div class="line"><a name="l11543"></a><span class="lineno">11543</span>&#160;    {</div><div class="line"><a name="l11544"></a><span class="lineno">11544</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div><div class="line"><a name="l11545"></a><span class="lineno">11545</span>&#160;    }</div><div class="line"><a name="l11546"></a><span class="lineno">11546</span>&#160;</div><div class="line"><a name="l11547"></a><span class="lineno">11547</span>&#160;    <span class="comment">// Write header.</span></div><div class="line"><a name="l11548"></a><span class="lineno">11548</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;Vulkan Memory Allocator,Calls recording&quot;</span>);</div><div class="line"><a name="l11549"></a><span class="lineno">11549</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;1,4&quot;</span>);</div><div class="line"><a name="l11550"></a><span class="lineno">11550</span>&#160;</div><div class="line"><a name="l11551"></a><span class="lineno">11551</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11552"></a><span class="lineno">11552</span>&#160;}</div><div class="line"><a name="l11553"></a><span class="lineno">11553</span>&#160;</div><div class="line"><a name="l11554"></a><span class="lineno">11554</span>&#160;VmaRecorder::~VmaRecorder()</div><div class="line"><a name="l11555"></a><span class="lineno">11555</span>&#160;{</div><div class="line"><a name="l11556"></a><span class="lineno">11556</span>&#160;    <span class="keywordflow">if</span>(m_File != VMA_NULL)</div><div class="line"><a name="l11557"></a><span class="lineno">11557</span>&#160;    {</div><div class="line"><a name="l11558"></a><span class="lineno">11558</span>&#160;        fclose(m_File);</div><div class="line"><a name="l11559"></a><span class="lineno">11559</span>&#160;    }</div><div class="line"><a name="l11560"></a><span class="lineno">11560</span>&#160;}</div><div class="line"><a name="l11561"></a><span class="lineno">11561</span>&#160;</div><div class="line"><a name="l11562"></a><span class="lineno">11562</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</div><div class="line"><a name="l11563"></a><span class="lineno">11563</span>&#160;{</div><div class="line"><a name="l11564"></a><span class="lineno">11564</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11565"></a><span class="lineno">11565</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11566"></a><span class="lineno">11566</span>&#160;</div><div class="line"><a name="l11567"></a><span class="lineno">11567</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11568"></a><span class="lineno">11568</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div><div class="line"><a name="l11569"></a><span class="lineno">11569</span>&#160;    Flush();</div><div class="line"><a name="l11570"></a><span class="lineno">11570</span>&#160;}</div><div class="line"><a name="l11571"></a><span class="lineno">11571</span>&#160;</div><div class="line"><a name="l11572"></a><span class="lineno">11572</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</div><div class="line"><a name="l11573"></a><span class="lineno">11573</span>&#160;{</div><div class="line"><a name="l11574"></a><span class="lineno">11574</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11575"></a><span class="lineno">11575</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11576"></a><span class="lineno">11576</span>&#160;</div><div class="line"><a name="l11577"></a><span class="lineno">11577</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11578"></a><span class="lineno">11578</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div><div class="line"><a name="l11579"></a><span class="lineno">11579</span>&#160;    Flush();</div><div class="line"><a name="l11580"></a><span class="lineno">11580</span>&#160;}</div><div class="line"><a name="l11581"></a><span class="lineno">11581</span>&#160;</div><div class="line"><a name="l11582"></a><span class="lineno">11582</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreatePool(uint32_t frameIndex, <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l11583"></a><span class="lineno">11583</span>&#160;{</div><div class="line"><a name="l11584"></a><span class="lineno">11584</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11585"></a><span class="lineno">11585</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11586"></a><span class="lineno">11586</span>&#160;</div><div class="line"><a name="l11587"></a><span class="lineno">11587</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11588"></a><span class="lineno">11588</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreatePool,%u,%u,%llu,%llu,%llu,%u,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11589"></a><span class="lineno">11589</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div><div class="line"><a name="l11590"></a><span class="lineno">11590</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div><div class="line"><a name="l11591"></a><span class="lineno">11591</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div><div class="line"><a name="l11592"></a><span class="lineno">11592</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div><div class="line"><a name="l11593"></a><span class="lineno">11593</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div><div class="line"><a name="l11594"></a><span class="lineno">11594</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div><div class="line"><a name="l11595"></a><span class="lineno">11595</span>&#160;        pool);</div><div class="line"><a name="l11596"></a><span class="lineno">11596</span>&#160;    Flush();</div><div class="line"><a name="l11597"></a><span class="lineno">11597</span>&#160;}</div><div class="line"><a name="l11598"></a><span class="lineno">11598</span>&#160;</div><div class="line"><a name="l11599"></a><span class="lineno">11599</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l11600"></a><span class="lineno">11600</span>&#160;{</div><div class="line"><a name="l11601"></a><span class="lineno">11601</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11602"></a><span class="lineno">11602</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11603"></a><span class="lineno">11603</span>&#160;</div><div class="line"><a name="l11604"></a><span class="lineno">11604</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11605"></a><span class="lineno">11605</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyPool,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11606"></a><span class="lineno">11606</span>&#160;        pool);</div><div class="line"><a name="l11607"></a><span class="lineno">11607</span>&#160;    Flush();</div><div class="line"><a name="l11608"></a><span class="lineno">11608</span>&#160;}</div><div class="line"><a name="l11609"></a><span class="lineno">11609</span>&#160;</div><div class="line"><a name="l11610"></a><span class="lineno">11610</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div><div class="line"><a name="l11611"></a><span class="lineno">11611</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l11612"></a><span class="lineno">11612</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="l11613"></a><span class="lineno">11613</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11614"></a><span class="lineno">11614</span>&#160;{</div><div class="line"><a name="l11615"></a><span class="lineno">11615</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11616"></a><span class="lineno">11616</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11617"></a><span class="lineno">11617</span>&#160;</div><div class="line"><a name="l11618"></a><span class="lineno">11618</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11619"></a><span class="lineno">11619</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11620"></a><span class="lineno">11620</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemory,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11621"></a><span class="lineno">11621</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l11622"></a><span class="lineno">11622</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l11623"></a><span class="lineno">11623</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l11624"></a><span class="lineno">11624</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11625"></a><span class="lineno">11625</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11626"></a><span class="lineno">11626</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11627"></a><span class="lineno">11627</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11628"></a><span class="lineno">11628</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11629"></a><span class="lineno">11629</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11630"></a><span class="lineno">11630</span>&#160;        allocation,</div><div class="line"><a name="l11631"></a><span class="lineno">11631</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11632"></a><span class="lineno">11632</span>&#160;    Flush();</div><div class="line"><a name="l11633"></a><span class="lineno">11633</span>&#160;}</div><div class="line"><a name="l11634"></a><span class="lineno">11634</span>&#160;</div><div class="line"><a name="l11635"></a><span class="lineno">11635</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div><div class="line"><a name="l11636"></a><span class="lineno">11636</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l11637"></a><span class="lineno">11637</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l11638"></a><span class="lineno">11638</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l11639"></a><span class="lineno">11639</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="l11640"></a><span class="lineno">11640</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11641"></a><span class="lineno">11641</span>&#160;{</div><div class="line"><a name="l11642"></a><span class="lineno">11642</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11643"></a><span class="lineno">11643</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11644"></a><span class="lineno">11644</span>&#160;</div><div class="line"><a name="l11645"></a><span class="lineno">11645</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11646"></a><span class="lineno">11646</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11647"></a><span class="lineno">11647</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForBuffer,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11648"></a><span class="lineno">11648</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l11649"></a><span class="lineno">11649</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l11650"></a><span class="lineno">11650</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l11651"></a><span class="lineno">11651</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l11652"></a><span class="lineno">11652</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l11653"></a><span class="lineno">11653</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11654"></a><span class="lineno">11654</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11655"></a><span class="lineno">11655</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11656"></a><span class="lineno">11656</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11657"></a><span class="lineno">11657</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11658"></a><span class="lineno">11658</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11659"></a><span class="lineno">11659</span>&#160;        allocation,</div><div class="line"><a name="l11660"></a><span class="lineno">11660</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11661"></a><span class="lineno">11661</span>&#160;    Flush();</div><div class="line"><a name="l11662"></a><span class="lineno">11662</span>&#160;}</div><div class="line"><a name="l11663"></a><span class="lineno">11663</span>&#160;</div><div class="line"><a name="l11664"></a><span class="lineno">11664</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div><div class="line"><a name="l11665"></a><span class="lineno">11665</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l11666"></a><span class="lineno">11666</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l11667"></a><span class="lineno">11667</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l11668"></a><span class="lineno">11668</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="l11669"></a><span class="lineno">11669</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11670"></a><span class="lineno">11670</span>&#160;{</div><div class="line"><a name="l11671"></a><span class="lineno">11671</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11672"></a><span class="lineno">11672</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11673"></a><span class="lineno">11673</span>&#160;</div><div class="line"><a name="l11674"></a><span class="lineno">11674</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11675"></a><span class="lineno">11675</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11676"></a><span class="lineno">11676</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForImage,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11677"></a><span class="lineno">11677</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l11678"></a><span class="lineno">11678</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l11679"></a><span class="lineno">11679</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l11680"></a><span class="lineno">11680</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l11681"></a><span class="lineno">11681</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l11682"></a><span class="lineno">11682</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11683"></a><span class="lineno">11683</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11684"></a><span class="lineno">11684</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11685"></a><span class="lineno">11685</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11686"></a><span class="lineno">11686</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11687"></a><span class="lineno">11687</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11688"></a><span class="lineno">11688</span>&#160;        allocation,</div><div class="line"><a name="l11689"></a><span class="lineno">11689</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11690"></a><span class="lineno">11690</span>&#160;    Flush();</div><div class="line"><a name="l11691"></a><span class="lineno">11691</span>&#160;}</div><div class="line"><a name="l11692"></a><span class="lineno">11692</span>&#160;</div><div class="line"><a name="l11693"></a><span class="lineno">11693</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div><div class="line"><a name="l11694"></a><span class="lineno">11694</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11695"></a><span class="lineno">11695</span>&#160;{</div><div class="line"><a name="l11696"></a><span class="lineno">11696</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11697"></a><span class="lineno">11697</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11698"></a><span class="lineno">11698</span>&#160;</div><div class="line"><a name="l11699"></a><span class="lineno">11699</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11700"></a><span class="lineno">11700</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11701"></a><span class="lineno">11701</span>&#160;        allocation);</div><div class="line"><a name="l11702"></a><span class="lineno">11702</span>&#160;    Flush();</div><div class="line"><a name="l11703"></a><span class="lineno">11703</span>&#160;}</div><div class="line"><a name="l11704"></a><span class="lineno">11704</span>&#160;</div><div class="line"><a name="l11705"></a><span class="lineno">11705</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordResizeAllocation(</div><div class="line"><a name="l11706"></a><span class="lineno">11706</span>&#160;    uint32_t frameIndex,</div><div class="line"><a name="l11707"></a><span class="lineno">11707</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l11708"></a><span class="lineno">11708</span>&#160;    VkDeviceSize newSize)</div><div class="line"><a name="l11709"></a><span class="lineno">11709</span>&#160;{</div><div class="line"><a name="l11710"></a><span class="lineno">11710</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11711"></a><span class="lineno">11711</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11712"></a><span class="lineno">11712</span>&#160;</div><div class="line"><a name="l11713"></a><span class="lineno">11713</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11714"></a><span class="lineno">11714</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaResizeAllocation,%p,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11715"></a><span class="lineno">11715</span>&#160;        allocation, newSize);</div><div class="line"><a name="l11716"></a><span class="lineno">11716</span>&#160;    Flush();</div><div class="line"><a name="l11717"></a><span class="lineno">11717</span>&#160;}</div><div class="line"><a name="l11718"></a><span class="lineno">11718</span>&#160;</div><div class="line"><a name="l11719"></a><span class="lineno">11719</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div><div class="line"><a name="l11720"></a><span class="lineno">11720</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l11721"></a><span class="lineno">11721</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l11722"></a><span class="lineno">11722</span>&#160;{</div><div class="line"><a name="l11723"></a><span class="lineno">11723</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11724"></a><span class="lineno">11724</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11725"></a><span class="lineno">11725</span>&#160;</div><div class="line"><a name="l11726"></a><span class="lineno">11726</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11727"></a><span class="lineno">11727</span>&#160;    UserDataString userDataStr(</div><div class="line"><a name="l11728"></a><span class="lineno">11728</span>&#160;        allocation-&gt;IsUserDataString() ? <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="l11729"></a><span class="lineno">11729</span>&#160;        pUserData);</div><div class="line"><a name="l11730"></a><span class="lineno">11730</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaSetAllocationUserData,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11731"></a><span class="lineno">11731</span>&#160;        allocation,</div><div class="line"><a name="l11732"></a><span class="lineno">11732</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11733"></a><span class="lineno">11733</span>&#160;    Flush();</div><div class="line"><a name="l11734"></a><span class="lineno">11734</span>&#160;}</div><div class="line"><a name="l11735"></a><span class="lineno">11735</span>&#160;</div><div class="line"><a name="l11736"></a><span class="lineno">11736</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div><div class="line"><a name="l11737"></a><span class="lineno">11737</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11738"></a><span class="lineno">11738</span>&#160;{</div><div class="line"><a name="l11739"></a><span class="lineno">11739</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11740"></a><span class="lineno">11740</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11741"></a><span class="lineno">11741</span>&#160;</div><div class="line"><a name="l11742"></a><span class="lineno">11742</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11743"></a><span class="lineno">11743</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateLostAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11744"></a><span class="lineno">11744</span>&#160;        allocation);</div><div class="line"><a name="l11745"></a><span class="lineno">11745</span>&#160;    Flush();</div><div class="line"><a name="l11746"></a><span class="lineno">11746</span>&#160;}</div><div class="line"><a name="l11747"></a><span class="lineno">11747</span>&#160;</div><div class="line"><a name="l11748"></a><span class="lineno">11748</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</div><div class="line"><a name="l11749"></a><span class="lineno">11749</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11750"></a><span class="lineno">11750</span>&#160;{</div><div class="line"><a name="l11751"></a><span class="lineno">11751</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11752"></a><span class="lineno">11752</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11753"></a><span class="lineno">11753</span>&#160;</div><div class="line"><a name="l11754"></a><span class="lineno">11754</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11755"></a><span class="lineno">11755</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11756"></a><span class="lineno">11756</span>&#160;        allocation);</div><div class="line"><a name="l11757"></a><span class="lineno">11757</span>&#160;    Flush();</div><div class="line"><a name="l11758"></a><span class="lineno">11758</span>&#160;}</div><div class="line"><a name="l11759"></a><span class="lineno">11759</span>&#160;</div><div class="line"><a name="l11760"></a><span class="lineno">11760</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div><div class="line"><a name="l11761"></a><span class="lineno">11761</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11762"></a><span class="lineno">11762</span>&#160;{</div><div class="line"><a name="l11763"></a><span class="lineno">11763</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11764"></a><span class="lineno">11764</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11765"></a><span class="lineno">11765</span>&#160;</div><div class="line"><a name="l11766"></a><span class="lineno">11766</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11767"></a><span class="lineno">11767</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaUnmapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11768"></a><span class="lineno">11768</span>&#160;        allocation);</div><div class="line"><a name="l11769"></a><span class="lineno">11769</span>&#160;    Flush();</div><div class="line"><a name="l11770"></a><span class="lineno">11770</span>&#160;}</div><div class="line"><a name="l11771"></a><span class="lineno">11771</span>&#160;</div><div class="line"><a name="l11772"></a><span class="lineno">11772</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div><div class="line"><a name="l11773"></a><span class="lineno">11773</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l11774"></a><span class="lineno">11774</span>&#160;{</div><div class="line"><a name="l11775"></a><span class="lineno">11775</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11776"></a><span class="lineno">11776</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11777"></a><span class="lineno">11777</span>&#160;</div><div class="line"><a name="l11778"></a><span class="lineno">11778</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11779"></a><span class="lineno">11779</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFlushAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11780"></a><span class="lineno">11780</span>&#160;        allocation,</div><div class="line"><a name="l11781"></a><span class="lineno">11781</span>&#160;        offset,</div><div class="line"><a name="l11782"></a><span class="lineno">11782</span>&#160;        size);</div><div class="line"><a name="l11783"></a><span class="lineno">11783</span>&#160;    Flush();</div><div class="line"><a name="l11784"></a><span class="lineno">11784</span>&#160;}</div><div class="line"><a name="l11785"></a><span class="lineno">11785</span>&#160;</div><div class="line"><a name="l11786"></a><span class="lineno">11786</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div><div class="line"><a name="l11787"></a><span class="lineno">11787</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l11788"></a><span class="lineno">11788</span>&#160;{</div><div class="line"><a name="l11789"></a><span class="lineno">11789</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11790"></a><span class="lineno">11790</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11791"></a><span class="lineno">11791</span>&#160;</div><div class="line"><a name="l11792"></a><span class="lineno">11792</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11793"></a><span class="lineno">11793</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaInvalidateAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11794"></a><span class="lineno">11794</span>&#160;        allocation,</div><div class="line"><a name="l11795"></a><span class="lineno">11795</span>&#160;        offset,</div><div class="line"><a name="l11796"></a><span class="lineno">11796</span>&#160;        size);</div><div class="line"><a name="l11797"></a><span class="lineno">11797</span>&#160;    Flush();</div><div class="line"><a name="l11798"></a><span class="lineno">11798</span>&#160;}</div><div class="line"><a name="l11799"></a><span class="lineno">11799</span>&#160;</div><div class="line"><a name="l11800"></a><span class="lineno">11800</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div><div class="line"><a name="l11801"></a><span class="lineno">11801</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div><div class="line"><a name="l11802"></a><span class="lineno">11802</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l11803"></a><span class="lineno">11803</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11804"></a><span class="lineno">11804</span>&#160;{</div><div class="line"><a name="l11805"></a><span class="lineno">11805</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11806"></a><span class="lineno">11806</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11807"></a><span class="lineno">11807</span>&#160;</div><div class="line"><a name="l11808"></a><span class="lineno">11808</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11809"></a><span class="lineno">11809</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11810"></a><span class="lineno">11810</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateBuffer,%u,%llu,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11811"></a><span class="lineno">11811</span>&#160;        bufCreateInfo.flags,</div><div class="line"><a name="l11812"></a><span class="lineno">11812</span>&#160;        bufCreateInfo.size,</div><div class="line"><a name="l11813"></a><span class="lineno">11813</span>&#160;        bufCreateInfo.usage,</div><div class="line"><a name="l11814"></a><span class="lineno">11814</span>&#160;        bufCreateInfo.sharingMode,</div><div class="line"><a name="l11815"></a><span class="lineno">11815</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11816"></a><span class="lineno">11816</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11817"></a><span class="lineno">11817</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11818"></a><span class="lineno">11818</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11819"></a><span class="lineno">11819</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11820"></a><span class="lineno">11820</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11821"></a><span class="lineno">11821</span>&#160;        allocation,</div><div class="line"><a name="l11822"></a><span class="lineno">11822</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11823"></a><span class="lineno">11823</span>&#160;    Flush();</div><div class="line"><a name="l11824"></a><span class="lineno">11824</span>&#160;}</div><div class="line"><a name="l11825"></a><span class="lineno">11825</span>&#160;</div><div class="line"><a name="l11826"></a><span class="lineno">11826</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div><div class="line"><a name="l11827"></a><span class="lineno">11827</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div><div class="line"><a name="l11828"></a><span class="lineno">11828</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l11829"></a><span class="lineno">11829</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11830"></a><span class="lineno">11830</span>&#160;{</div><div class="line"><a name="l11831"></a><span class="lineno">11831</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11832"></a><span class="lineno">11832</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11833"></a><span class="lineno">11833</span>&#160;</div><div class="line"><a name="l11834"></a><span class="lineno">11834</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11835"></a><span class="lineno">11835</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11836"></a><span class="lineno">11836</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateImage,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11837"></a><span class="lineno">11837</span>&#160;        imageCreateInfo.flags,</div><div class="line"><a name="l11838"></a><span class="lineno">11838</span>&#160;        imageCreateInfo.imageType,</div><div class="line"><a name="l11839"></a><span class="lineno">11839</span>&#160;        imageCreateInfo.format,</div><div class="line"><a name="l11840"></a><span class="lineno">11840</span>&#160;        imageCreateInfo.extent.width,</div><div class="line"><a name="l11841"></a><span class="lineno">11841</span>&#160;        imageCreateInfo.extent.height,</div><div class="line"><a name="l11842"></a><span class="lineno">11842</span>&#160;        imageCreateInfo.extent.depth,</div><div class="line"><a name="l11843"></a><span class="lineno">11843</span>&#160;        imageCreateInfo.mipLevels,</div><div class="line"><a name="l11844"></a><span class="lineno">11844</span>&#160;        imageCreateInfo.arrayLayers,</div><div class="line"><a name="l11845"></a><span class="lineno">11845</span>&#160;        imageCreateInfo.samples,</div><div class="line"><a name="l11846"></a><span class="lineno">11846</span>&#160;        imageCreateInfo.tiling,</div><div class="line"><a name="l11847"></a><span class="lineno">11847</span>&#160;        imageCreateInfo.usage,</div><div class="line"><a name="l11848"></a><span class="lineno">11848</span>&#160;        imageCreateInfo.sharingMode,</div><div class="line"><a name="l11849"></a><span class="lineno">11849</span>&#160;        imageCreateInfo.initialLayout,</div><div class="line"><a name="l11850"></a><span class="lineno">11850</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11851"></a><span class="lineno">11851</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11852"></a><span class="lineno">11852</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11853"></a><span class="lineno">11853</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11854"></a><span class="lineno">11854</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11855"></a><span class="lineno">11855</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11856"></a><span class="lineno">11856</span>&#160;        allocation,</div><div class="line"><a name="l11857"></a><span class="lineno">11857</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11858"></a><span class="lineno">11858</span>&#160;    Flush();</div><div class="line"><a name="l11859"></a><span class="lineno">11859</span>&#160;}</div><div class="line"><a name="l11860"></a><span class="lineno">11860</span>&#160;</div><div class="line"><a name="l11861"></a><span class="lineno">11861</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div><div class="line"><a name="l11862"></a><span class="lineno">11862</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11863"></a><span class="lineno">11863</span>&#160;{</div><div class="line"><a name="l11864"></a><span class="lineno">11864</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11865"></a><span class="lineno">11865</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11866"></a><span class="lineno">11866</span>&#160;</div><div class="line"><a name="l11867"></a><span class="lineno">11867</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11868"></a><span class="lineno">11868</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyBuffer,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11869"></a><span class="lineno">11869</span>&#160;        allocation);</div><div class="line"><a name="l11870"></a><span class="lineno">11870</span>&#160;    Flush();</div><div class="line"><a name="l11871"></a><span class="lineno">11871</span>&#160;}</div><div class="line"><a name="l11872"></a><span class="lineno">11872</span>&#160;</div><div class="line"><a name="l11873"></a><span class="lineno">11873</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div><div class="line"><a name="l11874"></a><span class="lineno">11874</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11875"></a><span class="lineno">11875</span>&#160;{</div><div class="line"><a name="l11876"></a><span class="lineno">11876</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11877"></a><span class="lineno">11877</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11878"></a><span class="lineno">11878</span>&#160;</div><div class="line"><a name="l11879"></a><span class="lineno">11879</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11880"></a><span class="lineno">11880</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyImage,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11881"></a><span class="lineno">11881</span>&#160;        allocation);</div><div class="line"><a name="l11882"></a><span class="lineno">11882</span>&#160;    Flush();</div><div class="line"><a name="l11883"></a><span class="lineno">11883</span>&#160;}</div><div class="line"><a name="l11884"></a><span class="lineno">11884</span>&#160;</div><div class="line"><a name="l11885"></a><span class="lineno">11885</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div><div class="line"><a name="l11886"></a><span class="lineno">11886</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11887"></a><span class="lineno">11887</span>&#160;{</div><div class="line"><a name="l11888"></a><span class="lineno">11888</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11889"></a><span class="lineno">11889</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11890"></a><span class="lineno">11890</span>&#160;</div><div class="line"><a name="l11891"></a><span class="lineno">11891</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11892"></a><span class="lineno">11892</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaTouchAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11893"></a><span class="lineno">11893</span>&#160;        allocation);</div><div class="line"><a name="l11894"></a><span class="lineno">11894</span>&#160;    Flush();</div><div class="line"><a name="l11895"></a><span class="lineno">11895</span>&#160;}</div><div class="line"><a name="l11896"></a><span class="lineno">11896</span>&#160;</div><div class="line"><a name="l11897"></a><span class="lineno">11897</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div><div class="line"><a name="l11898"></a><span class="lineno">11898</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11899"></a><span class="lineno">11899</span>&#160;{</div><div class="line"><a name="l11900"></a><span class="lineno">11900</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11901"></a><span class="lineno">11901</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11902"></a><span class="lineno">11902</span>&#160;</div><div class="line"><a name="l11903"></a><span class="lineno">11903</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11904"></a><span class="lineno">11904</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaGetAllocationInfo,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11905"></a><span class="lineno">11905</span>&#160;        allocation);</div><div class="line"><a name="l11906"></a><span class="lineno">11906</span>&#160;    Flush();</div><div class="line"><a name="l11907"></a><span class="lineno">11907</span>&#160;}</div><div class="line"><a name="l11908"></a><span class="lineno">11908</span>&#160;</div><div class="line"><a name="l11909"></a><span class="lineno">11909</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div><div class="line"><a name="l11910"></a><span class="lineno">11910</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l11911"></a><span class="lineno">11911</span>&#160;{</div><div class="line"><a name="l11912"></a><span class="lineno">11912</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11913"></a><span class="lineno">11913</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11914"></a><span class="lineno">11914</span>&#160;</div><div class="line"><a name="l11915"></a><span class="lineno">11915</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11916"></a><span class="lineno">11916</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMakePoolAllocationsLost,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11917"></a><span class="lineno">11917</span>&#160;        pool);</div><div class="line"><a name="l11918"></a><span class="lineno">11918</span>&#160;    Flush();</div><div class="line"><a name="l11919"></a><span class="lineno">11919</span>&#160;}</div><div class="line"><a name="l11920"></a><span class="lineno">11920</span>&#160;</div><div class="line"><a name="l11921"></a><span class="lineno">11921</span>&#160;VmaRecorder::UserDataString::UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l11922"></a><span class="lineno">11922</span>&#160;{</div><div class="line"><a name="l11923"></a><span class="lineno">11923</span>&#160;    <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l11924"></a><span class="lineno">11924</span>&#160;    {</div><div class="line"><a name="l11925"></a><span class="lineno">11925</span>&#160;        <span class="keywordflow">if</span>((allocFlags &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="l11926"></a><span class="lineno">11926</span>&#160;        {</div><div class="line"><a name="l11927"></a><span class="lineno">11927</span>&#160;            m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</div><div class="line"><a name="l11928"></a><span class="lineno">11928</span>&#160;        }</div><div class="line"><a name="l11929"></a><span class="lineno">11929</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l11930"></a><span class="lineno">11930</span>&#160;        {</div><div class="line"><a name="l11931"></a><span class="lineno">11931</span>&#160;            sprintf_s(m_PtrStr, <span class="stringliteral">&quot;%p&quot;</span>, pUserData);</div><div class="line"><a name="l11932"></a><span class="lineno">11932</span>&#160;            m_Str = m_PtrStr;</div><div class="line"><a name="l11933"></a><span class="lineno">11933</span>&#160;        }</div><div class="line"><a name="l11934"></a><span class="lineno">11934</span>&#160;    }</div><div class="line"><a name="l11935"></a><span class="lineno">11935</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l11936"></a><span class="lineno">11936</span>&#160;    {</div><div class="line"><a name="l11937"></a><span class="lineno">11937</span>&#160;        m_Str = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l11938"></a><span class="lineno">11938</span>&#160;    }</div><div class="line"><a name="l11939"></a><span class="lineno">11939</span>&#160;}</div><div class="line"><a name="l11940"></a><span class="lineno">11940</span>&#160;</div><div class="line"><a name="l11941"></a><span class="lineno">11941</span>&#160;<span class="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div><div class="line"><a name="l11942"></a><span class="lineno">11942</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div><div class="line"><a name="l11943"></a><span class="lineno">11943</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div><div class="line"><a name="l11944"></a><span class="lineno">11944</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled)</div><div class="line"><a name="l11945"></a><span class="lineno">11945</span>&#160;{</div><div class="line"><a name="l11946"></a><span class="lineno">11946</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,Begin\n&quot;</span>);</div><div class="line"><a name="l11947"></a><span class="lineno">11947</span>&#160;</div><div class="line"><a name="l11948"></a><span class="lineno">11948</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,apiVersion,%u\n&quot;</span>, devProps.apiVersion);</div><div class="line"><a name="l11949"></a><span class="lineno">11949</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,driverVersion,%u\n&quot;</span>, devProps.driverVersion);</div><div class="line"><a name="l11950"></a><span class="lineno">11950</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,vendorID,%u\n&quot;</span>, devProps.vendorID);</div><div class="line"><a name="l11951"></a><span class="lineno">11951</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceID,%u\n&quot;</span>, devProps.deviceID);</div><div class="line"><a name="l11952"></a><span class="lineno">11952</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceType,%u\n&quot;</span>, devProps.deviceType);</div><div class="line"><a name="l11953"></a><span class="lineno">11953</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceName,%s\n&quot;</span>, devProps.deviceName);</div><div class="line"><a name="l11954"></a><span class="lineno">11954</span>&#160;</div><div class="line"><a name="l11955"></a><span class="lineno">11955</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n&quot;</span>, devProps.limits.maxMemoryAllocationCount);</div><div class="line"><a name="l11956"></a><span class="lineno">11956</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,bufferImageGranularity,%llu\n&quot;</span>, devProps.limits.bufferImageGranularity);</div><div class="line"><a name="l11957"></a><span class="lineno">11957</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n&quot;</span>, devProps.limits.nonCoherentAtomSize);</div><div class="line"><a name="l11958"></a><span class="lineno">11958</span>&#160;</div><div class="line"><a name="l11959"></a><span class="lineno">11959</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,HeapCount,%u\n&quot;</span>, memProps.memoryHeapCount);</div><div class="line"><a name="l11960"></a><span class="lineno">11960</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryHeapCount; ++i)</div><div class="line"><a name="l11961"></a><span class="lineno">11961</span>&#160;    {</div><div class="line"><a name="l11962"></a><span class="lineno">11962</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,size,%llu\n&quot;</span>, i, memProps.memoryHeaps[i].size);</div><div class="line"><a name="l11963"></a><span class="lineno">11963</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,flags,%u\n&quot;</span>, i, memProps.memoryHeaps[i].flags);</div><div class="line"><a name="l11964"></a><span class="lineno">11964</span>&#160;    }</div><div class="line"><a name="l11965"></a><span class="lineno">11965</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,TypeCount,%u\n&quot;</span>, memProps.memoryTypeCount);</div><div class="line"><a name="l11966"></a><span class="lineno">11966</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryTypeCount; ++i)</div><div class="line"><a name="l11967"></a><span class="lineno">11967</span>&#160;    {</div><div class="line"><a name="l11968"></a><span class="lineno">11968</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,heapIndex,%u\n&quot;</span>, i, memProps.memoryTypes[i].heapIndex);</div><div class="line"><a name="l11969"></a><span class="lineno">11969</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,propertyFlags,%u\n&quot;</span>, i, memProps.memoryTypes[i].propertyFlags);</div><div class="line"><a name="l11970"></a><span class="lineno">11970</span>&#160;    }</div><div class="line"><a name="l11971"></a><span class="lineno">11971</span>&#160;</div><div class="line"><a name="l11972"></a><span class="lineno">11972</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_dedicated_allocation,%u\n&quot;</span>, dedicatedAllocationExtensionEnabled ? 1 : 0);</div><div class="line"><a name="l11973"></a><span class="lineno">11973</span>&#160;</div><div class="line"><a name="l11974"></a><span class="lineno">11974</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,%u\n&quot;</span>, VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ? 1 : 0);</div><div class="line"><a name="l11975"></a><span class="lineno">11975</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALIGNMENT,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_ALIGNMENT);</div><div class="line"><a name="l11976"></a><span class="lineno">11976</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MARGIN,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MARGIN);</div><div class="line"><a name="l11977"></a><span class="lineno">11977</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,%u\n&quot;</span>, VMA_DEBUG_INITIALIZE_ALLOCATIONS ? 1 : 0);</div><div class="line"><a name="l11978"></a><span class="lineno">11978</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_DETECT_CORRUPTION,%u\n&quot;</span>, VMA_DEBUG_DETECT_CORRUPTION ? 1 : 0);</div><div class="line"><a name="l11979"></a><span class="lineno">11979</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_GLOBAL_MUTEX,%u\n&quot;</span>, VMA_DEBUG_GLOBAL_MUTEX ? 1 : 0);</div><div class="line"><a name="l11980"></a><span class="lineno">11980</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY);</div><div class="line"><a name="l11981"></a><span class="lineno">11981</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_SMALL_HEAP_MAX_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_SMALL_HEAP_MAX_SIZE);</div><div class="line"><a name="l11982"></a><span class="lineno">11982</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div><div class="line"><a name="l11983"></a><span class="lineno">11983</span>&#160;</div><div class="line"><a name="l11984"></a><span class="lineno">11984</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,End\n&quot;</span>);</div><div class="line"><a name="l11985"></a><span class="lineno">11985</span>&#160;}</div><div class="line"><a name="l11986"></a><span class="lineno">11986</span>&#160;</div><div class="line"><a name="l11987"></a><span class="lineno">11987</span>&#160;<span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams&amp; outParams)</div><div class="line"><a name="l11988"></a><span class="lineno">11988</span>&#160;{</div><div class="line"><a name="l11989"></a><span class="lineno">11989</span>&#160;    outParams.threadId = GetCurrentThreadId();</div><div class="line"><a name="l11990"></a><span class="lineno">11990</span>&#160;</div><div class="line"><a name="l11991"></a><span class="lineno">11991</span>&#160;    LARGE_INTEGER counter;</div><div class="line"><a name="l11992"></a><span class="lineno">11992</span>&#160;    QueryPerformanceCounter(&amp;counter);</div><div class="line"><a name="l11993"></a><span class="lineno">11993</span>&#160;    outParams.time = (double)(counter.QuadPart - m_StartCounter) / (double)m_Freq;</div><div class="line"><a name="l11994"></a><span class="lineno">11994</span>&#160;}</div><div class="line"><a name="l11995"></a><span class="lineno">11995</span>&#160;</div><div class="line"><a name="l11996"></a><span class="lineno">11996</span>&#160;<span class="keywordtype">void</span> VmaRecorder::Flush()</div><div class="line"><a name="l11997"></a><span class="lineno">11997</span>&#160;{</div><div class="line"><a name="l11998"></a><span class="lineno">11998</span>&#160;    <span class="keywordflow">if</span>((m_Flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a>) != 0)</div><div class="line"><a name="l11999"></a><span class="lineno">11999</span>&#160;    {</div><div class="line"><a name="l12000"></a><span class="lineno">12000</span>&#160;        fflush(m_File);</div><div class="line"><a name="l12001"></a><span class="lineno">12001</span>&#160;    }</div><div class="line"><a name="l12002"></a><span class="lineno">12002</span>&#160;}</div><div class="line"><a name="l12003"></a><span class="lineno">12003</span>&#160;</div><div class="line"><a name="l12004"></a><span class="lineno">12004</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l12005"></a><span class="lineno">12005</span>&#160;</div><div class="line"><a name="l12007"></a><span class="lineno">12007</span>&#160;<span class="comment">// VmaAllocator_T</span></div><div class="line"><a name="l12008"></a><span class="lineno">12008</span>&#160;</div><div class="line"><a name="l12009"></a><span class="lineno">12009</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="l12010"></a><span class="lineno">12010</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="l12011"></a><span class="lineno">12011</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="l12012"></a><span class="lineno">12012</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div><div class="line"><a name="l12013"></a><span class="lineno">12013</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div><div class="line"><a name="l12014"></a><span class="lineno">12014</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div><div class="line"><a name="l12015"></a><span class="lineno">12015</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div><div class="line"><a name="l12016"></a><span class="lineno">12016</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div><div class="line"><a name="l12017"></a><span class="lineno">12017</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div><div class="line"><a name="l12018"></a><span class="lineno">12018</span>&#160;    m_CurrentFrameIndex(0),</div><div class="line"><a name="l12019"></a><span class="lineno">12019</span>&#160;    m_Pools(VmaStlAllocator&lt;<a class="code" href="struct_vma_pool.html">VmaPool</a>&gt;(GetAllocationCallbacks())),</div><div class="line"><a name="l12020"></a><span class="lineno">12020</span>&#160;    m_NextPoolId(0)</div><div class="line"><a name="l12021"></a><span class="lineno">12021</span>&#160;#if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="line"><a name="l12022"></a><span class="lineno">12022</span>&#160;    ,m_pRecorder(VMA_NULL)</div><div class="line"><a name="l12023"></a><span class="lineno">12023</span>&#160;#endif</div><div class="line"><a name="l12024"></a><span class="lineno">12024</span>&#160;{</div><div class="line"><a name="l12025"></a><span class="lineno">12025</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</div><div class="line"><a name="l12026"></a><span class="lineno">12026</span>&#160;    {</div><div class="line"><a name="l12027"></a><span class="lineno">12027</span>&#160;        <span class="comment">// Needs to be multiply of uint32_t size because we are going to write VMA_CORRUPTION_DETECTION_MAGIC_VALUE to it.</span></div><div class="line"><a name="l12028"></a><span class="lineno">12028</span>&#160;        VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div><div class="line"><a name="l12029"></a><span class="lineno">12029</span>&#160;    }</div><div class="line"><a name="l12030"></a><span class="lineno">12030</span>&#160;</div><div class="line"><a name="l12031"></a><span class="lineno">12031</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="l12032"></a><span class="lineno">12032</span>&#160;</div><div class="line"><a name="l12033"></a><span class="lineno">12033</span>&#160;<span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l12034"></a><span class="lineno">12034</span>&#160;    <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &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="l12035"></a><span class="lineno">12035</span>&#160;    {</div><div class="line"><a name="l12036"></a><span class="lineno">12036</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.&quot;</span>);</div><div class="line"><a name="l12037"></a><span class="lineno">12037</span>&#160;    }</div><div class="line"><a name="l12038"></a><span class="lineno">12038</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12039"></a><span class="lineno">12039</span>&#160;</div><div class="line"><a name="l12040"></a><span class="lineno">12040</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div><div class="line"><a name="l12041"></a><span class="lineno">12041</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div><div class="line"><a name="l12042"></a><span class="lineno">12042</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div><div class="line"><a name="l12043"></a><span class="lineno">12043</span>&#160;        </div><div class="line"><a name="l12044"></a><span class="lineno">12044</span>&#160;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div><div class="line"><a name="l12045"></a><span class="lineno">12045</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div><div class="line"><a name="l12046"></a><span class="lineno">12046</span>&#160;</div><div class="line"><a name="l12047"></a><span class="lineno">12047</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l12048"></a><span class="lineno">12048</span>&#160;    {</div><div class="line"><a name="l12049"></a><span class="lineno">12049</span>&#160;        m_HeapSizeLimit[i] = VK_WHOLE_SIZE;</div><div class="line"><a name="l12050"></a><span class="lineno">12050</span>&#160;    }</div><div class="line"><a name="l12051"></a><span class="lineno">12051</span>&#160;</div><div class="line"><a name="l12052"></a><span class="lineno">12052</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="l12053"></a><span class="lineno">12053</span>&#160;    {</div><div class="line"><a name="l12054"></a><span class="lineno">12054</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="l12055"></a><span class="lineno">12055</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="l12056"></a><span class="lineno">12056</span>&#160;    }</div><div class="line"><a name="l12057"></a><span class="lineno">12057</span>&#160;</div><div class="line"><a name="l12058"></a><span class="lineno">12058</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div><div class="line"><a name="l12059"></a><span class="lineno">12059</span>&#160;</div><div class="line"><a name="l12060"></a><span class="lineno">12060</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div><div class="line"><a name="l12061"></a><span class="lineno">12061</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</div><div class="line"><a name="l12062"></a><span class="lineno">12062</span>&#160;</div><div class="line"><a name="l12063"></a><span class="lineno">12063</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_ALIGNMENT));</div><div class="line"><a name="l12064"></a><span class="lineno">12064</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));</div><div class="line"><a name="l12065"></a><span class="lineno">12065</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));</div><div class="line"><a name="l12066"></a><span class="lineno">12066</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));</div><div class="line"><a name="l12067"></a><span class="lineno">12067</span>&#160;</div><div class="line"><a name="l12068"></a><span class="lineno">12068</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="l12069"></a><span class="lineno">12069</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="l12070"></a><span class="lineno">12070</span>&#160;</div><div class="line"><a name="l12071"></a><span class="lineno">12071</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="l12072"></a><span class="lineno">12072</span>&#160;    {</div><div class="line"><a name="l12073"></a><span class="lineno">12073</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l12074"></a><span class="lineno">12074</span>&#160;        {</div><div class="line"><a name="l12075"></a><span class="lineno">12075</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="l12076"></a><span class="lineno">12076</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div><div class="line"><a name="l12077"></a><span class="lineno">12077</span>&#160;            {</div><div class="line"><a name="l12078"></a><span class="lineno">12078</span>&#160;                m_HeapSizeLimit[heapIndex] = limit;</div><div class="line"><a name="l12079"></a><span class="lineno">12079</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div><div class="line"><a name="l12080"></a><span class="lineno">12080</span>&#160;                {</div><div class="line"><a name="l12081"></a><span class="lineno">12081</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div><div class="line"><a name="l12082"></a><span class="lineno">12082</span>&#160;                }</div><div class="line"><a name="l12083"></a><span class="lineno">12083</span>&#160;            }</div><div class="line"><a name="l12084"></a><span class="lineno">12084</span>&#160;        }</div><div class="line"><a name="l12085"></a><span class="lineno">12085</span>&#160;    }</div><div class="line"><a name="l12086"></a><span class="lineno">12086</span>&#160;</div><div class="line"><a name="l12087"></a><span class="lineno">12087</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l12088"></a><span class="lineno">12088</span>&#160;    {</div><div class="line"><a name="l12089"></a><span class="lineno">12089</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div><div class="line"><a name="l12090"></a><span class="lineno">12090</span>&#160;</div><div class="line"><a name="l12091"></a><span class="lineno">12091</span>&#160;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div><div class="line"><a name="l12092"></a><span class="lineno">12092</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l12093"></a><span class="lineno">12093</span>&#160;            memTypeIndex,</div><div class="line"><a name="l12094"></a><span class="lineno">12094</span>&#160;            preferredBlockSize,</div><div class="line"><a name="l12095"></a><span class="lineno">12095</span>&#160;            0,</div><div class="line"><a name="l12096"></a><span class="lineno">12096</span>&#160;            SIZE_MAX,</div><div class="line"><a name="l12097"></a><span class="lineno">12097</span>&#160;            GetBufferImageGranularity(),</div><div class="line"><a name="l12098"></a><span class="lineno">12098</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div><div class="line"><a name="l12099"></a><span class="lineno">12099</span>&#160;            <span class="keyword">false</span>, <span class="comment">// isCustomPool</span></div><div class="line"><a name="l12100"></a><span class="lineno">12100</span>&#160;            <span class="keyword">false</span>, <span class="comment">// explicitBlockSize</span></div><div class="line"><a name="l12101"></a><span class="lineno">12101</span>&#160;            <span class="keyword">false</span>); <span class="comment">// linearAlgorithm</span></div><div class="line"><a name="l12102"></a><span class="lineno">12102</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div><div class="line"><a name="l12103"></a><span class="lineno">12103</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div><div class="line"><a name="l12104"></a><span class="lineno">12104</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</div><div class="line"><a name="l12105"></a><span class="lineno">12105</span>&#160;</div><div class="line"><a name="l12106"></a><span class="lineno">12106</span>&#160;    }</div><div class="line"><a name="l12107"></a><span class="lineno">12107</span>&#160;}</div><div class="line"><a name="l12108"></a><span class="lineno">12108</span>&#160;</div><div class="line"><a name="l12109"></a><span class="lineno">12109</span>&#160;VkResult VmaAllocator_T::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo)</div><div class="line"><a name="l12110"></a><span class="lineno">12110</span>&#160;{</div><div class="line"><a name="l12111"></a><span class="lineno">12111</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l12112"></a><span class="lineno">12112</span>&#160;</div><div class="line"><a name="l12113"></a><span class="lineno">12113</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a> != VMA_NULL &amp;&amp;</div><div class="line"><a name="l12114"></a><span class="lineno">12114</span>&#160;        !VmaStrIsEmpty(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>-&gt;<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>))</div><div class="line"><a name="l12115"></a><span class="lineno">12115</span>&#160;    {</div><div class="line"><a name="l12116"></a><span class="lineno">12116</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l12117"></a><span class="lineno">12117</span>&#160;        m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div><div class="line"><a name="l12118"></a><span class="lineno">12118</span>&#160;        res = m_pRecorder-&gt;Init(*pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>, m_UseMutex);</div><div class="line"><a name="l12119"></a><span class="lineno">12119</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l12120"></a><span class="lineno">12120</span>&#160;        {</div><div class="line"><a name="l12121"></a><span class="lineno">12121</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12122"></a><span class="lineno">12122</span>&#160;        }</div><div class="line"><a name="l12123"></a><span class="lineno">12123</span>&#160;        m_pRecorder-&gt;WriteConfiguration(</div><div class="line"><a name="l12124"></a><span class="lineno">12124</span>&#160;            m_PhysicalDeviceProperties,</div><div class="line"><a name="l12125"></a><span class="lineno">12125</span>&#160;            m_MemProps,</div><div class="line"><a name="l12126"></a><span class="lineno">12126</span>&#160;            m_UseKhrDedicatedAllocation);</div><div class="line"><a name="l12127"></a><span class="lineno">12127</span>&#160;        m_pRecorder-&gt;RecordCreateAllocator(GetCurrentFrameIndex());</div><div class="line"><a name="l12128"></a><span class="lineno">12128</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l12129"></a><span class="lineno">12129</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VmaAllocatorCreateInfo::pRecordSettings used, but not supported due to VMA_RECORDING_ENABLED not defined to 1.&quot;</span>);</div><div class="line"><a name="l12130"></a><span class="lineno">12130</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l12131"></a><span class="lineno">12131</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12132"></a><span class="lineno">12132</span>&#160;    }</div><div class="line"><a name="l12133"></a><span class="lineno">12133</span>&#160;</div><div class="line"><a name="l12134"></a><span class="lineno">12134</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12135"></a><span class="lineno">12135</span>&#160;}</div><div class="line"><a name="l12136"></a><span class="lineno">12136</span>&#160;</div><div class="line"><a name="l12137"></a><span class="lineno">12137</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div><div class="line"><a name="l12138"></a><span class="lineno">12138</span>&#160;{</div><div class="line"><a name="l12139"></a><span class="lineno">12139</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l12140"></a><span class="lineno">12140</span>&#160;    <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div><div class="line"><a name="l12141"></a><span class="lineno">12141</span>&#160;    {</div><div class="line"><a name="l12142"></a><span class="lineno">12142</span>&#160;        m_pRecorder-&gt;RecordDestroyAllocator(GetCurrentFrameIndex());</div><div class="line"><a name="l12143"></a><span class="lineno">12143</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pRecorder);</div><div class="line"><a name="l12144"></a><span class="lineno">12144</span>&#160;    }</div><div class="line"><a name="l12145"></a><span class="lineno">12145</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12146"></a><span class="lineno">12146</span>&#160;    </div><div class="line"><a name="l12147"></a><span class="lineno">12147</span>&#160;    VMA_ASSERT(m_Pools.empty());</div><div class="line"><a name="l12148"></a><span class="lineno">12148</span>&#160;</div><div class="line"><a name="l12149"></a><span class="lineno">12149</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div><div class="line"><a name="l12150"></a><span class="lineno">12150</span>&#160;    {</div><div class="line"><a name="l12151"></a><span class="lineno">12151</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div><div class="line"><a name="l12152"></a><span class="lineno">12152</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div><div class="line"><a name="l12153"></a><span class="lineno">12153</span>&#160;    }</div><div class="line"><a name="l12154"></a><span class="lineno">12154</span>&#160;}</div><div class="line"><a name="l12155"></a><span class="lineno">12155</span>&#160;</div><div class="line"><a name="l12156"></a><span class="lineno">12156</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="l12157"></a><span class="lineno">12157</span>&#160;{</div><div class="line"><a name="l12158"></a><span class="lineno">12158</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l12159"></a><span class="lineno">12159</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = &amp;vkGetPhysicalDeviceProperties;</div><div class="line"><a name="l12160"></a><span class="lineno">12160</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = &amp;vkGetPhysicalDeviceMemoryProperties;</div><div class="line"><a name="l12161"></a><span class="lineno">12161</span>&#160;    m_VulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</div><div class="line"><a name="l12162"></a><span class="lineno">12162</span>&#160;    m_VulkanFunctions.vkFreeMemory = &amp;vkFreeMemory;</div><div class="line"><a name="l12163"></a><span class="lineno">12163</span>&#160;    m_VulkanFunctions.vkMapMemory = &amp;vkMapMemory;</div><div class="line"><a name="l12164"></a><span class="lineno">12164</span>&#160;    m_VulkanFunctions.vkUnmapMemory = &amp;vkUnmapMemory;</div><div class="line"><a name="l12165"></a><span class="lineno">12165</span>&#160;    m_VulkanFunctions.vkFlushMappedMemoryRanges = &amp;vkFlushMappedMemoryRanges;</div><div class="line"><a name="l12166"></a><span class="lineno">12166</span>&#160;    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = &amp;vkInvalidateMappedMemoryRanges;</div><div class="line"><a name="l12167"></a><span class="lineno">12167</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = &amp;vkBindBufferMemory;</div><div class="line"><a name="l12168"></a><span class="lineno">12168</span>&#160;    m_VulkanFunctions.vkBindImageMemory = &amp;vkBindImageMemory;</div><div class="line"><a name="l12169"></a><span class="lineno">12169</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = &amp;vkGetBufferMemoryRequirements;</div><div class="line"><a name="l12170"></a><span class="lineno">12170</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = &amp;vkGetImageMemoryRequirements;</div><div class="line"><a name="l12171"></a><span class="lineno">12171</span>&#160;    m_VulkanFunctions.vkCreateBuffer = &amp;vkCreateBuffer;</div><div class="line"><a name="l12172"></a><span class="lineno">12172</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = &amp;vkDestroyBuffer;</div><div class="line"><a name="l12173"></a><span class="lineno">12173</span>&#160;    m_VulkanFunctions.vkCreateImage = &amp;vkCreateImage;</div><div class="line"><a name="l12174"></a><span class="lineno">12174</span>&#160;    m_VulkanFunctions.vkDestroyImage = &amp;vkDestroyImage;</div><div class="line"><a name="l12175"></a><span class="lineno">12175</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12176"></a><span class="lineno">12176</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12177"></a><span class="lineno">12177</span>&#160;    {</div><div class="line"><a name="l12178"></a><span class="lineno">12178</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div><div class="line"><a name="l12179"></a><span class="lineno">12179</span>&#160;            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l12180"></a><span class="lineno">12180</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div><div class="line"><a name="l12181"></a><span class="lineno">12181</span>&#160;            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l12182"></a><span class="lineno">12182</span>&#160;    }</div><div class="line"><a name="l12183"></a><span class="lineno">12183</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12184"></a><span class="lineno">12184</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l12185"></a><span class="lineno">12185</span>&#160;</div><div class="line"><a name="l12186"></a><span class="lineno">12186</span>&#160;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div><div class="line"><a name="l12187"></a><span class="lineno">12187</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div><div class="line"><a name="l12188"></a><span class="lineno">12188</span>&#160;</div><div class="line"><a name="l12189"></a><span class="lineno">12189</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div><div class="line"><a name="l12190"></a><span class="lineno">12190</span>&#160;    {</div><div class="line"><a name="l12191"></a><span class="lineno">12191</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div><div class="line"><a name="l12192"></a><span class="lineno">12192</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l12193"></a><span class="lineno">12193</span>&#160;        VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div><div class="line"><a name="l12194"></a><span class="lineno">12194</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div><div class="line"><a name="l12195"></a><span class="lineno">12195</span>&#160;        VMA_COPY_IF_NOT_NULL(vkMapMemory);</div><div class="line"><a name="l12196"></a><span class="lineno">12196</span>&#160;        VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div><div class="line"><a name="l12197"></a><span class="lineno">12197</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div><div class="line"><a name="l12198"></a><span class="lineno">12198</span>&#160;        VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div><div class="line"><a name="l12199"></a><span class="lineno">12199</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div><div class="line"><a name="l12200"></a><span class="lineno">12200</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div><div class="line"><a name="l12201"></a><span class="lineno">12201</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div><div class="line"><a name="l12202"></a><span class="lineno">12202</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div><div class="line"><a name="l12203"></a><span class="lineno">12203</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div><div class="line"><a name="l12204"></a><span class="lineno">12204</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div><div class="line"><a name="l12205"></a><span class="lineno">12205</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateImage);</div><div class="line"><a name="l12206"></a><span class="lineno">12206</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div><div class="line"><a name="l12207"></a><span class="lineno">12207</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12208"></a><span class="lineno">12208</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div><div class="line"><a name="l12209"></a><span class="lineno">12209</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div><div class="line"><a name="l12210"></a><span class="lineno">12210</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12211"></a><span class="lineno">12211</span>&#160;    }</div><div class="line"><a name="l12212"></a><span class="lineno">12212</span>&#160;</div><div class="line"><a name="l12213"></a><span class="lineno">12213</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div><div class="line"><a name="l12214"></a><span class="lineno">12214</span>&#160;</div><div class="line"><a name="l12215"></a><span class="lineno">12215</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="l12216"></a><span class="lineno">12216</span>&#160;    <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l12217"></a><span class="lineno">12217</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div><div class="line"><a name="l12218"></a><span class="lineno">12218</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div><div class="line"><a name="l12219"></a><span class="lineno">12219</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div><div class="line"><a name="l12220"></a><span class="lineno">12220</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div><div class="line"><a name="l12221"></a><span class="lineno">12221</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div><div class="line"><a name="l12222"></a><span class="lineno">12222</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div><div class="line"><a name="l12223"></a><span class="lineno">12223</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l12224"></a><span class="lineno">12224</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l12225"></a><span class="lineno">12225</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div><div class="line"><a name="l12226"></a><span class="lineno">12226</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div><div class="line"><a name="l12227"></a><span class="lineno">12227</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l12228"></a><span class="lineno">12228</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l12229"></a><span class="lineno">12229</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div><div class="line"><a name="l12230"></a><span class="lineno">12230</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div><div class="line"><a name="l12231"></a><span class="lineno">12231</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div><div class="line"><a name="l12232"></a><span class="lineno">12232</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div><div class="line"><a name="l12233"></a><span class="lineno">12233</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12234"></a><span class="lineno">12234</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12235"></a><span class="lineno">12235</span>&#160;    {</div><div class="line"><a name="l12236"></a><span class="lineno">12236</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l12237"></a><span class="lineno">12237</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l12238"></a><span class="lineno">12238</span>&#160;    }</div><div class="line"><a name="l12239"></a><span class="lineno">12239</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12240"></a><span class="lineno">12240</span>&#160;}</div><div class="line"><a name="l12241"></a><span class="lineno">12241</span>&#160;</div><div class="line"><a name="l12242"></a><span class="lineno">12242</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div><div class="line"><a name="l12243"></a><span class="lineno">12243</span>&#160;{</div><div class="line"><a name="l12244"></a><span class="lineno">12244</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l12245"></a><span class="lineno">12245</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div><div class="line"><a name="l12246"></a><span class="lineno">12246</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="l12247"></a><span class="lineno">12247</span>&#160;    <span class="keywordflow">return</span> isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l12248"></a><span class="lineno">12248</span>&#160;}</div><div class="line"><a name="l12249"></a><span class="lineno">12249</span>&#160;</div><div class="line"><a name="l12250"></a><span class="lineno">12250</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div><div class="line"><a name="l12251"></a><span class="lineno">12251</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l12252"></a><span class="lineno">12252</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l12253"></a><span class="lineno">12253</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l12254"></a><span class="lineno">12254</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l12255"></a><span class="lineno">12255</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l12256"></a><span class="lineno">12256</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="l12257"></a><span class="lineno">12257</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l12258"></a><span class="lineno">12258</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l12259"></a><span class="lineno">12259</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l12260"></a><span class="lineno">12260</span>&#160;{</div><div class="line"><a name="l12261"></a><span class="lineno">12261</span>&#160;    VMA_ASSERT(pAllocation != VMA_NULL);</div><div class="line"><a name="l12262"></a><span class="lineno">12262</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="l12263"></a><span class="lineno">12263</span>&#160;</div><div class="line"><a name="l12264"></a><span class="lineno">12264</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div><div class="line"><a name="l12265"></a><span class="lineno">12265</span>&#160;</div><div class="line"><a name="l12266"></a><span class="lineno">12266</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div><div class="line"><a name="l12267"></a><span class="lineno">12267</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="l12268"></a><span class="lineno">12268</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l12269"></a><span class="lineno">12269</span>&#160;    {</div><div class="line"><a name="l12270"></a><span class="lineno">12270</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="l12271"></a><span class="lineno">12271</span>&#160;    }</div><div class="line"><a name="l12272"></a><span class="lineno">12272</span>&#160;</div><div class="line"><a name="l12273"></a><span class="lineno">12273</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12274"></a><span class="lineno">12274</span>&#160;    VMA_ASSERT(blockVector);</div><div class="line"><a name="l12275"></a><span class="lineno">12275</span>&#160;</div><div class="line"><a name="l12276"></a><span class="lineno">12276</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div><div class="line"><a name="l12277"></a><span class="lineno">12277</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div><div class="line"><a name="l12278"></a><span class="lineno">12278</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div><div class="line"><a name="l12279"></a><span class="lineno">12279</span>&#160;        dedicatedAllocation ||</div><div class="line"><a name="l12280"></a><span class="lineno">12280</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="l12281"></a><span class="lineno">12281</span>&#160;        size &gt; preferredBlockSize / 2;</div><div class="line"><a name="l12282"></a><span class="lineno">12282</span>&#160;</div><div class="line"><a name="l12283"></a><span class="lineno">12283</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div><div class="line"><a name="l12284"></a><span class="lineno">12284</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="l12285"></a><span class="lineno">12285</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="l12286"></a><span class="lineno">12286</span>&#160;    {</div><div class="line"><a name="l12287"></a><span class="lineno">12287</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="l12288"></a><span class="lineno">12288</span>&#160;    }</div><div class="line"><a name="l12289"></a><span class="lineno">12289</span>&#160;</div><div class="line"><a name="l12290"></a><span class="lineno">12290</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="l12291"></a><span class="lineno">12291</span>&#160;    {</div><div class="line"><a name="l12292"></a><span class="lineno">12292</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="l12293"></a><span class="lineno">12293</span>&#160;        {</div><div class="line"><a name="l12294"></a><span class="lineno">12294</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12295"></a><span class="lineno">12295</span>&#160;        }</div><div class="line"><a name="l12296"></a><span class="lineno">12296</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l12297"></a><span class="lineno">12297</span>&#160;        {</div><div class="line"><a name="l12298"></a><span class="lineno">12298</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div><div class="line"><a name="l12299"></a><span class="lineno">12299</span>&#160;                size,</div><div class="line"><a name="l12300"></a><span class="lineno">12300</span>&#160;                suballocType,</div><div class="line"><a name="l12301"></a><span class="lineno">12301</span>&#160;                memTypeIndex,</div><div class="line"><a name="l12302"></a><span class="lineno">12302</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="l12303"></a><span class="lineno">12303</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="l12304"></a><span class="lineno">12304</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l12305"></a><span class="lineno">12305</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l12306"></a><span class="lineno">12306</span>&#160;                dedicatedImage,</div><div class="line"><a name="l12307"></a><span class="lineno">12307</span>&#160;                pAllocation);</div><div class="line"><a name="l12308"></a><span class="lineno">12308</span>&#160;        }</div><div class="line"><a name="l12309"></a><span class="lineno">12309</span>&#160;    }</div><div class="line"><a name="l12310"></a><span class="lineno">12310</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12311"></a><span class="lineno">12311</span>&#160;    {</div><div class="line"><a name="l12312"></a><span class="lineno">12312</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div><div class="line"><a name="l12313"></a><span class="lineno">12313</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hCurrentPool</span></div><div class="line"><a name="l12314"></a><span class="lineno">12314</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l12315"></a><span class="lineno">12315</span>&#160;            size,</div><div class="line"><a name="l12316"></a><span class="lineno">12316</span>&#160;            alignment,</div><div class="line"><a name="l12317"></a><span class="lineno">12317</span>&#160;            finalCreateInfo,</div><div class="line"><a name="l12318"></a><span class="lineno">12318</span>&#160;            suballocType,</div><div class="line"><a name="l12319"></a><span class="lineno">12319</span>&#160;            pAllocation);</div><div class="line"><a name="l12320"></a><span class="lineno">12320</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12321"></a><span class="lineno">12321</span>&#160;        {</div><div class="line"><a name="l12322"></a><span class="lineno">12322</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12323"></a><span class="lineno">12323</span>&#160;        }</div><div class="line"><a name="l12324"></a><span class="lineno">12324</span>&#160;</div><div class="line"><a name="l12325"></a><span class="lineno">12325</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div><div class="line"><a name="l12326"></a><span class="lineno">12326</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="l12327"></a><span class="lineno">12327</span>&#160;        {</div><div class="line"><a name="l12328"></a><span class="lineno">12328</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12329"></a><span class="lineno">12329</span>&#160;        }</div><div class="line"><a name="l12330"></a><span class="lineno">12330</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l12331"></a><span class="lineno">12331</span>&#160;        {</div><div class="line"><a name="l12332"></a><span class="lineno">12332</span>&#160;            res = AllocateDedicatedMemory(</div><div class="line"><a name="l12333"></a><span class="lineno">12333</span>&#160;                size,</div><div class="line"><a name="l12334"></a><span class="lineno">12334</span>&#160;                suballocType,</div><div class="line"><a name="l12335"></a><span class="lineno">12335</span>&#160;                memTypeIndex,</div><div class="line"><a name="l12336"></a><span class="lineno">12336</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="l12337"></a><span class="lineno">12337</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="l12338"></a><span class="lineno">12338</span>&#160;                finalCreateInfo.pUserData,</div><div class="line"><a name="l12339"></a><span class="lineno">12339</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l12340"></a><span class="lineno">12340</span>&#160;                dedicatedImage,</div><div class="line"><a name="l12341"></a><span class="lineno">12341</span>&#160;                pAllocation);</div><div class="line"><a name="l12342"></a><span class="lineno">12342</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12343"></a><span class="lineno">12343</span>&#160;            {</div><div class="line"><a name="l12344"></a><span class="lineno">12344</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div><div class="line"><a name="l12345"></a><span class="lineno">12345</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div><div class="line"><a name="l12346"></a><span class="lineno">12346</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12347"></a><span class="lineno">12347</span>&#160;            }</div><div class="line"><a name="l12348"></a><span class="lineno">12348</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l12349"></a><span class="lineno">12349</span>&#160;            {</div><div class="line"><a name="l12350"></a><span class="lineno">12350</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div><div class="line"><a name="l12351"></a><span class="lineno">12351</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l12352"></a><span class="lineno">12352</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12353"></a><span class="lineno">12353</span>&#160;            }</div><div class="line"><a name="l12354"></a><span class="lineno">12354</span>&#160;        }</div><div class="line"><a name="l12355"></a><span class="lineno">12355</span>&#160;    }</div><div class="line"><a name="l12356"></a><span class="lineno">12356</span>&#160;}</div><div class="line"><a name="l12357"></a><span class="lineno">12357</span>&#160;</div><div class="line"><a name="l12358"></a><span class="lineno">12358</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div><div class="line"><a name="l12359"></a><span class="lineno">12359</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l12360"></a><span class="lineno">12360</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l12361"></a><span class="lineno">12361</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l12362"></a><span class="lineno">12362</span>&#160;    <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l12363"></a><span class="lineno">12363</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l12364"></a><span class="lineno">12364</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l12365"></a><span class="lineno">12365</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l12366"></a><span class="lineno">12366</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l12367"></a><span class="lineno">12367</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l12368"></a><span class="lineno">12368</span>&#160;{</div><div class="line"><a name="l12369"></a><span class="lineno">12369</span>&#160;    VMA_ASSERT(pAllocation);</div><div class="line"><a name="l12370"></a><span class="lineno">12370</span>&#160;</div><div class="line"><a name="l12371"></a><span class="lineno">12371</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l12372"></a><span class="lineno">12372</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l12373"></a><span class="lineno">12373</span>&#160;    allocInfo.allocationSize = size;</div><div class="line"><a name="l12374"></a><span class="lineno">12374</span>&#160;</div><div class="line"><a name="l12375"></a><span class="lineno">12375</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12376"></a><span class="lineno">12376</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div><div class="line"><a name="l12377"></a><span class="lineno">12377</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12378"></a><span class="lineno">12378</span>&#160;    {</div><div class="line"><a name="l12379"></a><span class="lineno">12379</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div><div class="line"><a name="l12380"></a><span class="lineno">12380</span>&#160;        {</div><div class="line"><a name="l12381"></a><span class="lineno">12381</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div><div class="line"><a name="l12382"></a><span class="lineno">12382</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div><div class="line"><a name="l12383"></a><span class="lineno">12383</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l12384"></a><span class="lineno">12384</span>&#160;        }</div><div class="line"><a name="l12385"></a><span class="lineno">12385</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div><div class="line"><a name="l12386"></a><span class="lineno">12386</span>&#160;        {</div><div class="line"><a name="l12387"></a><span class="lineno">12387</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div><div class="line"><a name="l12388"></a><span class="lineno">12388</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l12389"></a><span class="lineno">12389</span>&#160;        }</div><div class="line"><a name="l12390"></a><span class="lineno">12390</span>&#160;    }</div><div class="line"><a name="l12391"></a><span class="lineno">12391</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12392"></a><span class="lineno">12392</span>&#160;</div><div class="line"><a name="l12393"></a><span class="lineno">12393</span>&#160;    <span class="comment">// Allocate VkDeviceMemory.</span></div><div class="line"><a name="l12394"></a><span class="lineno">12394</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l12395"></a><span class="lineno">12395</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div><div class="line"><a name="l12396"></a><span class="lineno">12396</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l12397"></a><span class="lineno">12397</span>&#160;    {</div><div class="line"><a name="l12398"></a><span class="lineno">12398</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l12399"></a><span class="lineno">12399</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12400"></a><span class="lineno">12400</span>&#160;    }</div><div class="line"><a name="l12401"></a><span class="lineno">12401</span>&#160;</div><div class="line"><a name="l12402"></a><span class="lineno">12402</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div><div class="line"><a name="l12403"></a><span class="lineno">12403</span>&#160;    <span class="keywordflow">if</span>(map)</div><div class="line"><a name="l12404"></a><span class="lineno">12404</span>&#160;    {</div><div class="line"><a name="l12405"></a><span class="lineno">12405</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div><div class="line"><a name="l12406"></a><span class="lineno">12406</span>&#160;            m_hDevice,</div><div class="line"><a name="l12407"></a><span class="lineno">12407</span>&#160;            hMemory,</div><div class="line"><a name="l12408"></a><span class="lineno">12408</span>&#160;            0,</div><div class="line"><a name="l12409"></a><span class="lineno">12409</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l12410"></a><span class="lineno">12410</span>&#160;            0,</div><div class="line"><a name="l12411"></a><span class="lineno">12411</span>&#160;            &amp;pMappedData);</div><div class="line"><a name="l12412"></a><span class="lineno">12412</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l12413"></a><span class="lineno">12413</span>&#160;        {</div><div class="line"><a name="l12414"></a><span class="lineno">12414</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div><div class="line"><a name="l12415"></a><span class="lineno">12415</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div><div class="line"><a name="l12416"></a><span class="lineno">12416</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12417"></a><span class="lineno">12417</span>&#160;        }</div><div class="line"><a name="l12418"></a><span class="lineno">12418</span>&#160;    }</div><div class="line"><a name="l12419"></a><span class="lineno">12419</span>&#160;</div><div class="line"><a name="l12420"></a><span class="lineno">12420</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(m_CurrentFrameIndex.load(), isUserDataString);</div><div class="line"><a name="l12421"></a><span class="lineno">12421</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div><div class="line"><a name="l12422"></a><span class="lineno">12422</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div><div class="line"><a name="l12423"></a><span class="lineno">12423</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l12424"></a><span class="lineno">12424</span>&#160;    {</div><div class="line"><a name="l12425"></a><span class="lineno">12425</span>&#160;        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l12426"></a><span class="lineno">12426</span>&#160;    }</div><div class="line"><a name="l12427"></a><span class="lineno">12427</span>&#160;</div><div class="line"><a name="l12428"></a><span class="lineno">12428</span>&#160;    <span class="comment">// Register it in m_pDedicatedAllocations.</span></div><div class="line"><a name="l12429"></a><span class="lineno">12429</span>&#160;    {</div><div class="line"><a name="l12430"></a><span class="lineno">12430</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l12431"></a><span class="lineno">12431</span>&#160;        AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l12432"></a><span class="lineno">12432</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l12433"></a><span class="lineno">12433</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, *pAllocation);</div><div class="line"><a name="l12434"></a><span class="lineno">12434</span>&#160;    }</div><div class="line"><a name="l12435"></a><span class="lineno">12435</span>&#160;</div><div class="line"><a name="l12436"></a><span class="lineno">12436</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory MemoryTypeIndex=#%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l12437"></a><span class="lineno">12437</span>&#160;</div><div class="line"><a name="l12438"></a><span class="lineno">12438</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12439"></a><span class="lineno">12439</span>&#160;}</div><div class="line"><a name="l12440"></a><span class="lineno">12440</span>&#160;</div><div class="line"><a name="l12441"></a><span class="lineno">12441</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div><div class="line"><a name="l12442"></a><span class="lineno">12442</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l12443"></a><span class="lineno">12443</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l12444"></a><span class="lineno">12444</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l12445"></a><span class="lineno">12445</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l12446"></a><span class="lineno">12446</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l12447"></a><span class="lineno">12447</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12448"></a><span class="lineno">12448</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12449"></a><span class="lineno">12449</span>&#160;    {</div><div class="line"><a name="l12450"></a><span class="lineno">12450</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l12451"></a><span class="lineno">12451</span>&#160;        memReqInfo.buffer = hBuffer;</div><div class="line"><a name="l12452"></a><span class="lineno">12452</span>&#160;</div><div class="line"><a name="l12453"></a><span class="lineno">12453</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l12454"></a><span class="lineno">12454</span>&#160;</div><div class="line"><a name="l12455"></a><span class="lineno">12455</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l12456"></a><span class="lineno">12456</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l12457"></a><span class="lineno">12457</span>&#160;</div><div class="line"><a name="l12458"></a><span class="lineno">12458</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l12459"></a><span class="lineno">12459</span>&#160;</div><div class="line"><a name="l12460"></a><span class="lineno">12460</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l12461"></a><span class="lineno">12461</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l12462"></a><span class="lineno">12462</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l12463"></a><span class="lineno">12463</span>&#160;    }</div><div class="line"><a name="l12464"></a><span class="lineno">12464</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12465"></a><span class="lineno">12465</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12466"></a><span class="lineno">12466</span>&#160;    {</div><div class="line"><a name="l12467"></a><span class="lineno">12467</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div><div class="line"><a name="l12468"></a><span class="lineno">12468</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l12469"></a><span class="lineno">12469</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l12470"></a><span class="lineno">12470</span>&#160;    }</div><div class="line"><a name="l12471"></a><span class="lineno">12471</span>&#160;}</div><div class="line"><a name="l12472"></a><span class="lineno">12472</span>&#160;</div><div class="line"><a name="l12473"></a><span class="lineno">12473</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div><div class="line"><a name="l12474"></a><span class="lineno">12474</span>&#160;    VkImage hImage,</div><div class="line"><a name="l12475"></a><span class="lineno">12475</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l12476"></a><span class="lineno">12476</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l12477"></a><span class="lineno">12477</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l12478"></a><span class="lineno">12478</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l12479"></a><span class="lineno">12479</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12480"></a><span class="lineno">12480</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12481"></a><span class="lineno">12481</span>&#160;    {</div><div class="line"><a name="l12482"></a><span class="lineno">12482</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l12483"></a><span class="lineno">12483</span>&#160;        memReqInfo.image = hImage;</div><div class="line"><a name="l12484"></a><span class="lineno">12484</span>&#160;</div><div class="line"><a name="l12485"></a><span class="lineno">12485</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l12486"></a><span class="lineno">12486</span>&#160;</div><div class="line"><a name="l12487"></a><span class="lineno">12487</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l12488"></a><span class="lineno">12488</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l12489"></a><span class="lineno">12489</span>&#160;</div><div class="line"><a name="l12490"></a><span class="lineno">12490</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l12491"></a><span class="lineno">12491</span>&#160;</div><div class="line"><a name="l12492"></a><span class="lineno">12492</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l12493"></a><span class="lineno">12493</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l12494"></a><span class="lineno">12494</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l12495"></a><span class="lineno">12495</span>&#160;    }</div><div class="line"><a name="l12496"></a><span class="lineno">12496</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12497"></a><span class="lineno">12497</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12498"></a><span class="lineno">12498</span>&#160;    {</div><div class="line"><a name="l12499"></a><span class="lineno">12499</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div><div class="line"><a name="l12500"></a><span class="lineno">12500</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l12501"></a><span class="lineno">12501</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l12502"></a><span class="lineno">12502</span>&#160;    }</div><div class="line"><a name="l12503"></a><span class="lineno">12503</span>&#160;}</div><div class="line"><a name="l12504"></a><span class="lineno">12504</span>&#160;</div><div class="line"><a name="l12505"></a><span class="lineno">12505</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div><div class="line"><a name="l12506"></a><span class="lineno">12506</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l12507"></a><span class="lineno">12507</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l12508"></a><span class="lineno">12508</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l12509"></a><span class="lineno">12509</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l12510"></a><span class="lineno">12510</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l12511"></a><span class="lineno">12511</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="l12512"></a><span class="lineno">12512</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l12513"></a><span class="lineno">12513</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l12514"></a><span class="lineno">12514</span>&#160;{</div><div class="line"><a name="l12515"></a><span class="lineno">12515</span>&#160;    VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));</div><div class="line"><a name="l12516"></a><span class="lineno">12516</span>&#160;</div><div class="line"><a name="l12517"></a><span class="lineno">12517</span>&#160;    <span class="keywordflow">if</span>(vkMemReq.size == 0)</div><div class="line"><a name="l12518"></a><span class="lineno">12518</span>&#160;    {</div><div class="line"><a name="l12519"></a><span class="lineno">12519</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l12520"></a><span class="lineno">12520</span>&#160;    }</div><div class="line"><a name="l12521"></a><span class="lineno">12521</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="l12522"></a><span class="lineno">12522</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="l12523"></a><span class="lineno">12523</span>&#160;    {</div><div class="line"><a name="l12524"></a><span class="lineno">12524</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="l12525"></a><span class="lineno">12525</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12526"></a><span class="lineno">12526</span>&#160;    }</div><div class="line"><a name="l12527"></a><span class="lineno">12527</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="l12528"></a><span class="lineno">12528</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="l12529"></a><span class="lineno">12529</span>&#160;    {</div><div class="line"><a name="l12530"></a><span class="lineno">12530</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="l12531"></a><span class="lineno">12531</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12532"></a><span class="lineno">12532</span>&#160;    }</div><div class="line"><a name="l12533"></a><span class="lineno">12533</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div><div class="line"><a name="l12534"></a><span class="lineno">12534</span>&#160;    {</div><div class="line"><a name="l12535"></a><span class="lineno">12535</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="l12536"></a><span class="lineno">12536</span>&#160;        {</div><div class="line"><a name="l12537"></a><span class="lineno">12537</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="l12538"></a><span class="lineno">12538</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12539"></a><span class="lineno">12539</span>&#160;        }</div><div class="line"><a name="l12540"></a><span class="lineno">12540</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="l12541"></a><span class="lineno">12541</span>&#160;        {</div><div class="line"><a name="l12542"></a><span class="lineno">12542</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="l12543"></a><span class="lineno">12543</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12544"></a><span class="lineno">12544</span>&#160;        }</div><div class="line"><a name="l12545"></a><span class="lineno">12545</span>&#160;    }</div><div class="line"><a name="l12546"></a><span class="lineno">12546</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="l12547"></a><span class="lineno">12547</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="l12548"></a><span class="lineno">12548</span>&#160;    {</div><div class="line"><a name="l12549"></a><span class="lineno">12549</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="l12550"></a><span class="lineno">12550</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12551"></a><span class="lineno">12551</span>&#160;    }</div><div class="line"><a name="l12552"></a><span class="lineno">12552</span>&#160;</div><div class="line"><a name="l12553"></a><span class="lineno">12553</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="l12554"></a><span class="lineno">12554</span>&#160;    {</div><div class="line"><a name="l12555"></a><span class="lineno">12555</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div><div class="line"><a name="l12556"></a><span class="lineno">12556</span>&#160;            vkMemReq.alignment,</div><div class="line"><a name="l12557"></a><span class="lineno">12557</span>&#160;            GetMemoryTypeMinAlignment(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()));</div><div class="line"><a name="l12558"></a><span class="lineno">12558</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="l12559"></a><span class="lineno">12559</span>&#160;            createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l12560"></a><span class="lineno">12560</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l12561"></a><span class="lineno">12561</span>&#160;            vkMemReq.size,</div><div class="line"><a name="l12562"></a><span class="lineno">12562</span>&#160;            alignmentForPool,</div><div class="line"><a name="l12563"></a><span class="lineno">12563</span>&#160;            createInfo,</div><div class="line"><a name="l12564"></a><span class="lineno">12564</span>&#160;            suballocType,</div><div class="line"><a name="l12565"></a><span class="lineno">12565</span>&#160;            pAllocation);</div><div class="line"><a name="l12566"></a><span class="lineno">12566</span>&#160;    }</div><div class="line"><a name="l12567"></a><span class="lineno">12567</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12568"></a><span class="lineno">12568</span>&#160;    {</div><div class="line"><a name="l12569"></a><span class="lineno">12569</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div><div class="line"><a name="l12570"></a><span class="lineno">12570</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div><div class="line"><a name="l12571"></a><span class="lineno">12571</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div><div class="line"><a name="l12572"></a><span class="lineno">12572</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="l12573"></a><span class="lineno">12573</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12574"></a><span class="lineno">12574</span>&#160;        {</div><div class="line"><a name="l12575"></a><span class="lineno">12575</span>&#160;            VkDeviceSize alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l12576"></a><span class="lineno">12576</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l12577"></a><span class="lineno">12577</span>&#160;                GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l12578"></a><span class="lineno">12578</span>&#160;</div><div class="line"><a name="l12579"></a><span class="lineno">12579</span>&#160;            res = AllocateMemoryOfType(</div><div class="line"><a name="l12580"></a><span class="lineno">12580</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l12581"></a><span class="lineno">12581</span>&#160;                alignmentForMemType,</div><div class="line"><a name="l12582"></a><span class="lineno">12582</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l12583"></a><span class="lineno">12583</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l12584"></a><span class="lineno">12584</span>&#160;                dedicatedImage,</div><div class="line"><a name="l12585"></a><span class="lineno">12585</span>&#160;                createInfo,</div><div class="line"><a name="l12586"></a><span class="lineno">12586</span>&#160;                memTypeIndex,</div><div class="line"><a name="l12587"></a><span class="lineno">12587</span>&#160;                suballocType,</div><div class="line"><a name="l12588"></a><span class="lineno">12588</span>&#160;                pAllocation);</div><div class="line"><a name="l12589"></a><span class="lineno">12589</span>&#160;            <span class="comment">// Succeeded on first try.</span></div><div class="line"><a name="l12590"></a><span class="lineno">12590</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12591"></a><span class="lineno">12591</span>&#160;            {</div><div class="line"><a name="l12592"></a><span class="lineno">12592</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12593"></a><span class="lineno">12593</span>&#160;            }</div><div class="line"><a name="l12594"></a><span class="lineno">12594</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div><div class="line"><a name="l12595"></a><span class="lineno">12595</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l12596"></a><span class="lineno">12596</span>&#160;            {</div><div class="line"><a name="l12597"></a><span class="lineno">12597</span>&#160;                <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12598"></a><span class="lineno">12598</span>&#160;                {</div><div class="line"><a name="l12599"></a><span class="lineno">12599</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div><div class="line"><a name="l12600"></a><span class="lineno">12600</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div><div class="line"><a name="l12601"></a><span class="lineno">12601</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div><div class="line"><a name="l12602"></a><span class="lineno">12602</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="l12603"></a><span class="lineno">12603</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12604"></a><span class="lineno">12604</span>&#160;                    {</div><div class="line"><a name="l12605"></a><span class="lineno">12605</span>&#160;                        alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l12606"></a><span class="lineno">12606</span>&#160;                            vkMemReq.alignment,</div><div class="line"><a name="l12607"></a><span class="lineno">12607</span>&#160;                            GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l12608"></a><span class="lineno">12608</span>&#160;                        </div><div class="line"><a name="l12609"></a><span class="lineno">12609</span>&#160;                        res = AllocateMemoryOfType(</div><div class="line"><a name="l12610"></a><span class="lineno">12610</span>&#160;                            vkMemReq.size,</div><div class="line"><a name="l12611"></a><span class="lineno">12611</span>&#160;                            alignmentForMemType,</div><div class="line"><a name="l12612"></a><span class="lineno">12612</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l12613"></a><span class="lineno">12613</span>&#160;                            dedicatedBuffer,</div><div class="line"><a name="l12614"></a><span class="lineno">12614</span>&#160;                            dedicatedImage,</div><div class="line"><a name="l12615"></a><span class="lineno">12615</span>&#160;                            createInfo,</div><div class="line"><a name="l12616"></a><span class="lineno">12616</span>&#160;                            memTypeIndex,</div><div class="line"><a name="l12617"></a><span class="lineno">12617</span>&#160;                            suballocType,</div><div class="line"><a name="l12618"></a><span class="lineno">12618</span>&#160;                            pAllocation);</div><div class="line"><a name="l12619"></a><span class="lineno">12619</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div><div class="line"><a name="l12620"></a><span class="lineno">12620</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12621"></a><span class="lineno">12621</span>&#160;                        {</div><div class="line"><a name="l12622"></a><span class="lineno">12622</span>&#160;                            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12623"></a><span class="lineno">12623</span>&#160;                        }</div><div class="line"><a name="l12624"></a><span class="lineno">12624</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="l12625"></a><span class="lineno">12625</span>&#160;                    }</div><div class="line"><a name="l12626"></a><span class="lineno">12626</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div><div class="line"><a name="l12627"></a><span class="lineno">12627</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l12628"></a><span class="lineno">12628</span>&#160;                    {</div><div class="line"><a name="l12629"></a><span class="lineno">12629</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="l12630"></a><span class="lineno">12630</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12631"></a><span class="lineno">12631</span>&#160;                    }</div><div class="line"><a name="l12632"></a><span class="lineno">12632</span>&#160;                }</div><div class="line"><a name="l12633"></a><span class="lineno">12633</span>&#160;            }</div><div class="line"><a name="l12634"></a><span class="lineno">12634</span>&#160;        }</div><div class="line"><a name="l12635"></a><span class="lineno">12635</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="l12636"></a><span class="lineno">12636</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l12637"></a><span class="lineno">12637</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12638"></a><span class="lineno">12638</span>&#160;    }</div><div class="line"><a name="l12639"></a><span class="lineno">12639</span>&#160;}</div><div class="line"><a name="l12640"></a><span class="lineno">12640</span>&#160;</div><div class="line"><a name="l12641"></a><span class="lineno">12641</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="l12642"></a><span class="lineno">12642</span>&#160;{</div><div class="line"><a name="l12643"></a><span class="lineno">12643</span>&#160;    VMA_ASSERT(allocation);</div><div class="line"><a name="l12644"></a><span class="lineno">12644</span>&#160;</div><div class="line"><a name="l12645"></a><span class="lineno">12645</span>&#160;    <span class="keywordflow">if</span>(TouchAllocation(allocation))</div><div class="line"><a name="l12646"></a><span class="lineno">12646</span>&#160;    {</div><div class="line"><a name="l12647"></a><span class="lineno">12647</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l12648"></a><span class="lineno">12648</span>&#160;        {</div><div class="line"><a name="l12649"></a><span class="lineno">12649</span>&#160;            FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div><div class="line"><a name="l12650"></a><span class="lineno">12650</span>&#160;        }</div><div class="line"><a name="l12651"></a><span class="lineno">12651</span>&#160;</div><div class="line"><a name="l12652"></a><span class="lineno">12652</span>&#160;        <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div><div class="line"><a name="l12653"></a><span class="lineno">12653</span>&#160;        {</div><div class="line"><a name="l12654"></a><span class="lineno">12654</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l12655"></a><span class="lineno">12655</span>&#160;            {</div><div class="line"><a name="l12656"></a><span class="lineno">12656</span>&#160;                VmaBlockVector* pBlockVector = VMA_NULL;</div><div class="line"><a name="l12657"></a><span class="lineno">12657</span>&#160;                <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetPool();</div><div class="line"><a name="l12658"></a><span class="lineno">12658</span>&#160;                <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div><div class="line"><a name="l12659"></a><span class="lineno">12659</span>&#160;                {</div><div class="line"><a name="l12660"></a><span class="lineno">12660</span>&#160;                    pBlockVector = &amp;hPool-&gt;m_BlockVector;</div><div class="line"><a name="l12661"></a><span class="lineno">12661</span>&#160;                }</div><div class="line"><a name="l12662"></a><span class="lineno">12662</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l12663"></a><span class="lineno">12663</span>&#160;                {</div><div class="line"><a name="l12664"></a><span class="lineno">12664</span>&#160;                    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l12665"></a><span class="lineno">12665</span>&#160;                    pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12666"></a><span class="lineno">12666</span>&#160;                }</div><div class="line"><a name="l12667"></a><span class="lineno">12667</span>&#160;                pBlockVector-&gt;Free(allocation);</div><div class="line"><a name="l12668"></a><span class="lineno">12668</span>&#160;            }</div><div class="line"><a name="l12669"></a><span class="lineno">12669</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l12670"></a><span class="lineno">12670</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l12671"></a><span class="lineno">12671</span>&#160;            FreeDedicatedMemory(allocation);</div><div class="line"><a name="l12672"></a><span class="lineno">12672</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l12673"></a><span class="lineno">12673</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l12674"></a><span class="lineno">12674</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l12675"></a><span class="lineno">12675</span>&#160;        }</div><div class="line"><a name="l12676"></a><span class="lineno">12676</span>&#160;    }</div><div class="line"><a name="l12677"></a><span class="lineno">12677</span>&#160;</div><div class="line"><a name="l12678"></a><span class="lineno">12678</span>&#160;    allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div><div class="line"><a name="l12679"></a><span class="lineno">12679</span>&#160;    vma_delete(<span class="keyword">this</span>, allocation);</div><div class="line"><a name="l12680"></a><span class="lineno">12680</span>&#160;}</div><div class="line"><a name="l12681"></a><span class="lineno">12681</span>&#160;</div><div class="line"><a name="l12682"></a><span class="lineno">12682</span>&#160;VkResult VmaAllocator_T::ResizeAllocation(</div><div class="line"><a name="l12683"></a><span class="lineno">12683</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc,</div><div class="line"><a name="l12684"></a><span class="lineno">12684</span>&#160;    VkDeviceSize newSize)</div><div class="line"><a name="l12685"></a><span class="lineno">12685</span>&#160;{</div><div class="line"><a name="l12686"></a><span class="lineno">12686</span>&#160;    <span class="keywordflow">if</span>(newSize == 0 || alloc-&gt;GetLastUseFrameIndex() == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l12687"></a><span class="lineno">12687</span>&#160;    {</div><div class="line"><a name="l12688"></a><span class="lineno">12688</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l12689"></a><span class="lineno">12689</span>&#160;    }</div><div class="line"><a name="l12690"></a><span class="lineno">12690</span>&#160;    <span class="keywordflow">if</span>(newSize == alloc-&gt;GetSize())</div><div class="line"><a name="l12691"></a><span class="lineno">12691</span>&#160;    {</div><div class="line"><a name="l12692"></a><span class="lineno">12692</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12693"></a><span class="lineno">12693</span>&#160;    }</div><div class="line"><a name="l12694"></a><span class="lineno">12694</span>&#160;</div><div class="line"><a name="l12695"></a><span class="lineno">12695</span>&#160;    <span class="keywordflow">switch</span>(alloc-&gt;GetType())</div><div class="line"><a name="l12696"></a><span class="lineno">12696</span>&#160;    {</div><div class="line"><a name="l12697"></a><span class="lineno">12697</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l12698"></a><span class="lineno">12698</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l12699"></a><span class="lineno">12699</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l12700"></a><span class="lineno">12700</span>&#160;        <span class="keywordflow">if</span>(alloc-&gt;GetBlock()-&gt;m_pMetadata-&gt;ResizeAllocation(alloc, newSize))</div><div class="line"><a name="l12701"></a><span class="lineno">12701</span>&#160;        {</div><div class="line"><a name="l12702"></a><span class="lineno">12702</span>&#160;            alloc-&gt;ChangeSize(newSize);</div><div class="line"><a name="l12703"></a><span class="lineno">12703</span>&#160;            VMA_HEAVY_ASSERT(alloc-&gt;GetBlock()-&gt;m_pMetadata-&gt;Validate());</div><div class="line"><a name="l12704"></a><span class="lineno">12704</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12705"></a><span class="lineno">12705</span>&#160;        }</div><div class="line"><a name="l12706"></a><span class="lineno">12706</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l12707"></a><span class="lineno">12707</span>&#160;        {</div><div class="line"><a name="l12708"></a><span class="lineno">12708</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_POOL_MEMORY;</div><div class="line"><a name="l12709"></a><span class="lineno">12709</span>&#160;        }</div><div class="line"><a name="l12710"></a><span class="lineno">12710</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l12711"></a><span class="lineno">12711</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l12712"></a><span class="lineno">12712</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l12713"></a><span class="lineno">12713</span>&#160;    }</div><div class="line"><a name="l12714"></a><span class="lineno">12714</span>&#160;}</div><div class="line"><a name="l12715"></a><span class="lineno">12715</span>&#160;</div><div class="line"><a name="l12716"></a><span class="lineno">12716</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="l12717"></a><span class="lineno">12717</span>&#160;{</div><div class="line"><a name="l12718"></a><span class="lineno">12718</span>&#160;    <span class="comment">// Initialize.</span></div><div class="line"><a name="l12719"></a><span class="lineno">12719</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l12720"></a><span class="lineno">12720</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="l12721"></a><span class="lineno">12721</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l12722"></a><span class="lineno">12722</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="l12723"></a><span class="lineno">12723</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l12724"></a><span class="lineno">12724</span>&#160;    </div><div class="line"><a name="l12725"></a><span class="lineno">12725</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l12726"></a><span class="lineno">12726</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l12727"></a><span class="lineno">12727</span>&#160;    {</div><div class="line"><a name="l12728"></a><span class="lineno">12728</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12729"></a><span class="lineno">12729</span>&#160;        VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l12730"></a><span class="lineno">12730</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div><div class="line"><a name="l12731"></a><span class="lineno">12731</span>&#160;    }</div><div class="line"><a name="l12732"></a><span class="lineno">12732</span>&#160;</div><div class="line"><a name="l12733"></a><span class="lineno">12733</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l12734"></a><span class="lineno">12734</span>&#160;    {</div><div class="line"><a name="l12735"></a><span class="lineno">12735</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l12736"></a><span class="lineno">12736</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="l12737"></a><span class="lineno">12737</span>&#160;        {</div><div class="line"><a name="l12738"></a><span class="lineno">12738</span>&#160;            m_Pools[poolIndex]-&gt;m_BlockVector.AddStats(pStats);</div><div class="line"><a name="l12739"></a><span class="lineno">12739</span>&#160;        }</div><div class="line"><a name="l12740"></a><span class="lineno">12740</span>&#160;    }</div><div class="line"><a name="l12741"></a><span class="lineno">12741</span>&#160;</div><div class="line"><a name="l12742"></a><span class="lineno">12742</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div><div class="line"><a name="l12743"></a><span class="lineno">12743</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l12744"></a><span class="lineno">12744</span>&#160;    {</div><div class="line"><a name="l12745"></a><span class="lineno">12745</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l12746"></a><span class="lineno">12746</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l12747"></a><span class="lineno">12747</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l12748"></a><span class="lineno">12748</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l12749"></a><span class="lineno">12749</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="l12750"></a><span class="lineno">12750</span>&#160;        {</div><div class="line"><a name="l12751"></a><span class="lineno">12751</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l12752"></a><span class="lineno">12752</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div><div class="line"><a name="l12753"></a><span class="lineno">12753</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l12754"></a><span class="lineno">12754</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l12755"></a><span class="lineno">12755</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l12756"></a><span class="lineno">12756</span>&#160;        }</div><div class="line"><a name="l12757"></a><span class="lineno">12757</span>&#160;    }</div><div class="line"><a name="l12758"></a><span class="lineno">12758</span>&#160;</div><div class="line"><a name="l12759"></a><span class="lineno">12759</span>&#160;    <span class="comment">// Postprocess.</span></div><div class="line"><a name="l12760"></a><span class="lineno">12760</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l12761"></a><span class="lineno">12761</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="l12762"></a><span class="lineno">12762</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l12763"></a><span class="lineno">12763</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="l12764"></a><span class="lineno">12764</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l12765"></a><span class="lineno">12765</span>&#160;}</div><div class="line"><a name="l12766"></a><span class="lineno">12766</span>&#160;</div><div class="line"><a name="l12767"></a><span class="lineno">12767</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="l12768"></a><span class="lineno">12768</span>&#160;</div><div class="line"><a name="l12769"></a><span class="lineno">12769</span>&#160;VkResult VmaAllocator_T::Defragment(</div><div class="line"><a name="l12770"></a><span class="lineno">12770</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l12771"></a><span class="lineno">12771</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l12772"></a><span class="lineno">12772</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l12773"></a><span class="lineno">12773</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="l12774"></a><span class="lineno">12774</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l12775"></a><span class="lineno">12775</span>&#160;{</div><div class="line"><a name="l12776"></a><span class="lineno">12776</span>&#160;    <span class="keywordflow">if</span>(pAllocationsChanged != VMA_NULL)</div><div class="line"><a name="l12777"></a><span class="lineno">12777</span>&#160;    {</div><div class="line"><a name="l12778"></a><span class="lineno">12778</span>&#160;        memset(pAllocationsChanged, 0, allocationCount * <span class="keyword">sizeof</span>(VkBool32));</div><div class="line"><a name="l12779"></a><span class="lineno">12779</span>&#160;    }</div><div class="line"><a name="l12780"></a><span class="lineno">12780</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l12781"></a><span class="lineno">12781</span>&#160;    {</div><div class="line"><a name="l12782"></a><span class="lineno">12782</span>&#160;        memset(pDefragmentationStats, 0, <span class="keyword">sizeof</span>(*pDefragmentationStats));</div><div class="line"><a name="l12783"></a><span class="lineno">12783</span>&#160;    }</div><div class="line"><a name="l12784"></a><span class="lineno">12784</span>&#160;</div><div class="line"><a name="l12785"></a><span class="lineno">12785</span>&#160;    <span class="keyword">const</span> uint32_t currentFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12786"></a><span class="lineno">12786</span>&#160;</div><div class="line"><a name="l12787"></a><span class="lineno">12787</span>&#160;    VmaMutexLock poolsLock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l12788"></a><span class="lineno">12788</span>&#160;</div><div class="line"><a name="l12789"></a><span class="lineno">12789</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l12790"></a><span class="lineno">12790</span>&#160;</div><div class="line"><a name="l12791"></a><span class="lineno">12791</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them in BlockVectors when necessary.</span></div><div class="line"><a name="l12792"></a><span class="lineno">12792</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="l12793"></a><span class="lineno">12793</span>&#160;    {</div><div class="line"><a name="l12794"></a><span class="lineno">12794</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = pAllocations[allocIndex];</div><div class="line"><a name="l12795"></a><span class="lineno">12795</span>&#160;        VMA_ASSERT(hAlloc);</div><div class="line"><a name="l12796"></a><span class="lineno">12796</span>&#160;        <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l12797"></a><span class="lineno">12797</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div><div class="line"><a name="l12798"></a><span class="lineno">12798</span>&#160;        <span class="keyword">const</span> VkMemoryPropertyFlags requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l12799"></a><span class="lineno">12799</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div><div class="line"><a name="l12800"></a><span class="lineno">12800</span>&#160;            <span class="comment">// Only HOST_VISIBLE and HOST_COHERENT memory types can be defragmented.</span></div><div class="line"><a name="l12801"></a><span class="lineno">12801</span>&#160;            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags) &amp;&amp;</div><div class="line"><a name="l12802"></a><span class="lineno">12802</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div><div class="line"><a name="l12803"></a><span class="lineno">12803</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l12804"></a><span class="lineno">12804</span>&#160;        {</div><div class="line"><a name="l12805"></a><span class="lineno">12805</span>&#160;            VmaBlockVector* pAllocBlockVector = VMA_NULL;</div><div class="line"><a name="l12806"></a><span class="lineno">12806</span>&#160;</div><div class="line"><a name="l12807"></a><span class="lineno">12807</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="l12808"></a><span class="lineno">12808</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div><div class="line"><a name="l12809"></a><span class="lineno">12809</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div><div class="line"><a name="l12810"></a><span class="lineno">12810</span>&#160;            {</div><div class="line"><a name="l12811"></a><span class="lineno">12811</span>&#160;                <span class="comment">// Pools with linear or buddy algorithm are not defragmented.</span></div><div class="line"><a name="l12812"></a><span class="lineno">12812</span>&#160;                <span class="keywordflow">if</span>(hAllocPool-&gt;m_BlockVector.GetAlgorithm() == 0)</div><div class="line"><a name="l12813"></a><span class="lineno">12813</span>&#160;                {</div><div class="line"><a name="l12814"></a><span class="lineno">12814</span>&#160;                    pAllocBlockVector = &amp;hAllocPool-&gt;m_BlockVector;</div><div class="line"><a name="l12815"></a><span class="lineno">12815</span>&#160;                }</div><div class="line"><a name="l12816"></a><span class="lineno">12816</span>&#160;            }</div><div class="line"><a name="l12817"></a><span class="lineno">12817</span>&#160;            <span class="comment">// This allocation belongs to general pool.</span></div><div class="line"><a name="l12818"></a><span class="lineno">12818</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l12819"></a><span class="lineno">12819</span>&#160;            {</div><div class="line"><a name="l12820"></a><span class="lineno">12820</span>&#160;                pAllocBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12821"></a><span class="lineno">12821</span>&#160;            }</div><div class="line"><a name="l12822"></a><span class="lineno">12822</span>&#160;</div><div class="line"><a name="l12823"></a><span class="lineno">12823</span>&#160;            <span class="keywordflow">if</span>(pAllocBlockVector != VMA_NULL)</div><div class="line"><a name="l12824"></a><span class="lineno">12824</span>&#160;            {</div><div class="line"><a name="l12825"></a><span class="lineno">12825</span>&#160;                VmaDefragmentator* <span class="keyword">const</span> pDefragmentator =</div><div class="line"><a name="l12826"></a><span class="lineno">12826</span>&#160;                    pAllocBlockVector-&gt;EnsureDefragmentator(<span class="keyword">this</span>, currentFrameIndex);</div><div class="line"><a name="l12827"></a><span class="lineno">12827</span>&#160;                VkBool32* <span class="keyword">const</span> pChanged = (pAllocationsChanged != VMA_NULL) ?</div><div class="line"><a name="l12828"></a><span class="lineno">12828</span>&#160;                    &amp;pAllocationsChanged[allocIndex] : VMA_NULL;</div><div class="line"><a name="l12829"></a><span class="lineno">12829</span>&#160;                pDefragmentator-&gt;AddAllocation(hAlloc, pChanged);</div><div class="line"><a name="l12830"></a><span class="lineno">12830</span>&#160;            }</div><div class="line"><a name="l12831"></a><span class="lineno">12831</span>&#160;        }</div><div class="line"><a name="l12832"></a><span class="lineno">12832</span>&#160;    }</div><div class="line"><a name="l12833"></a><span class="lineno">12833</span>&#160;</div><div class="line"><a name="l12834"></a><span class="lineno">12834</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l12835"></a><span class="lineno">12835</span>&#160;</div><div class="line"><a name="l12836"></a><span class="lineno">12836</span>&#160;    <span class="comment">// ======== Main processing.</span></div><div class="line"><a name="l12837"></a><span class="lineno">12837</span>&#160;</div><div class="line"><a name="l12838"></a><span class="lineno">12838</span>&#160;    VkDeviceSize maxBytesToMove = SIZE_MAX;</div><div class="line"><a name="l12839"></a><span class="lineno">12839</span>&#160;    uint32_t maxAllocationsToMove = UINT32_MAX;</div><div class="line"><a name="l12840"></a><span class="lineno">12840</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div><div class="line"><a name="l12841"></a><span class="lineno">12841</span>&#160;    {</div><div class="line"><a name="l12842"></a><span class="lineno">12842</span>&#160;        maxBytesToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l12843"></a><span class="lineno">12843</span>&#160;        maxAllocationsToMove = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l12844"></a><span class="lineno">12844</span>&#160;    }</div><div class="line"><a name="l12845"></a><span class="lineno">12845</span>&#160;</div><div class="line"><a name="l12846"></a><span class="lineno">12846</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l12847"></a><span class="lineno">12847</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div><div class="line"><a name="l12848"></a><span class="lineno">12848</span>&#160;        (memTypeIndex &lt; GetMemoryTypeCount()) &amp;&amp; (result == VK_SUCCESS);</div><div class="line"><a name="l12849"></a><span class="lineno">12849</span>&#160;        ++memTypeIndex)</div><div class="line"><a name="l12850"></a><span class="lineno">12850</span>&#160;    {</div><div class="line"><a name="l12851"></a><span class="lineno">12851</span>&#160;        <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l12852"></a><span class="lineno">12852</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="l12853"></a><span class="lineno">12853</span>&#160;        {</div><div class="line"><a name="l12854"></a><span class="lineno">12854</span>&#160;            result = m_pBlockVectors[memTypeIndex]-&gt;Defragment(</div><div class="line"><a name="l12855"></a><span class="lineno">12855</span>&#160;                pDefragmentationStats,</div><div class="line"><a name="l12856"></a><span class="lineno">12856</span>&#160;                maxBytesToMove,</div><div class="line"><a name="l12857"></a><span class="lineno">12857</span>&#160;                maxAllocationsToMove);</div><div class="line"><a name="l12858"></a><span class="lineno">12858</span>&#160;        }</div><div class="line"><a name="l12859"></a><span class="lineno">12859</span>&#160;    }</div><div class="line"><a name="l12860"></a><span class="lineno">12860</span>&#160;</div><div class="line"><a name="l12861"></a><span class="lineno">12861</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l12862"></a><span class="lineno">12862</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="l12863"></a><span class="lineno">12863</span>&#160;    {</div><div class="line"><a name="l12864"></a><span class="lineno">12864</span>&#160;        result = m_Pools[poolIndex]-&gt;m_BlockVector.Defragment(</div><div class="line"><a name="l12865"></a><span class="lineno">12865</span>&#160;            pDefragmentationStats,</div><div class="line"><a name="l12866"></a><span class="lineno">12866</span>&#160;            maxBytesToMove,</div><div class="line"><a name="l12867"></a><span class="lineno">12867</span>&#160;            maxAllocationsToMove);</div><div class="line"><a name="l12868"></a><span class="lineno">12868</span>&#160;    }</div><div class="line"><a name="l12869"></a><span class="lineno">12869</span>&#160;</div><div class="line"><a name="l12870"></a><span class="lineno">12870</span>&#160;    <span class="comment">// ========  Destroy defragmentators.</span></div><div class="line"><a name="l12871"></a><span class="lineno">12871</span>&#160;</div><div class="line"><a name="l12872"></a><span class="lineno">12872</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l12873"></a><span class="lineno">12873</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = poolCount; poolIndex--; )</div><div class="line"><a name="l12874"></a><span class="lineno">12874</span>&#160;    {</div><div class="line"><a name="l12875"></a><span class="lineno">12875</span>&#160;        m_Pools[poolIndex]-&gt;m_BlockVector.DestroyDefragmentator();</div><div class="line"><a name="l12876"></a><span class="lineno">12876</span>&#160;    }</div><div class="line"><a name="l12877"></a><span class="lineno">12877</span>&#160;</div><div class="line"><a name="l12878"></a><span class="lineno">12878</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l12879"></a><span class="lineno">12879</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )</div><div class="line"><a name="l12880"></a><span class="lineno">12880</span>&#160;    {</div><div class="line"><a name="l12881"></a><span class="lineno">12881</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="l12882"></a><span class="lineno">12882</span>&#160;        {</div><div class="line"><a name="l12883"></a><span class="lineno">12883</span>&#160;            m_pBlockVectors[memTypeIndex]-&gt;DestroyDefragmentator();</div><div class="line"><a name="l12884"></a><span class="lineno">12884</span>&#160;        }</div><div class="line"><a name="l12885"></a><span class="lineno">12885</span>&#160;    }</div><div class="line"><a name="l12886"></a><span class="lineno">12886</span>&#160;</div><div class="line"><a name="l12887"></a><span class="lineno">12887</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l12888"></a><span class="lineno">12888</span>&#160;}</div><div class="line"><a name="l12889"></a><span class="lineno">12889</span>&#160;</div><div class="line"><a name="l12890"></a><span class="lineno">12890</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="l12891"></a><span class="lineno">12891</span>&#160;{</div><div class="line"><a name="l12892"></a><span class="lineno">12892</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l12893"></a><span class="lineno">12893</span>&#160;    {</div><div class="line"><a name="l12894"></a><span class="lineno">12894</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l12895"></a><span class="lineno">12895</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l12896"></a><span class="lineno">12896</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l12897"></a><span class="lineno">12897</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l12898"></a><span class="lineno">12898</span>&#160;        <span class="keyword">const</span> uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12899"></a><span class="lineno">12899</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l12900"></a><span class="lineno">12900</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12901"></a><span class="lineno">12901</span>&#160;        {</div><div class="line"><a name="l12902"></a><span class="lineno">12902</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l12903"></a><span class="lineno">12903</span>&#160;            {</div><div class="line"><a name="l12904"></a><span class="lineno">12904</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div><div class="line"><a name="l12905"></a><span class="lineno">12905</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="l12906"></a><span class="lineno">12906</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div><div class="line"><a name="l12907"></a><span class="lineno">12907</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="l12908"></a><span class="lineno">12908</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l12909"></a><span class="lineno">12909</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="l12910"></a><span class="lineno">12910</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l12911"></a><span class="lineno">12911</span>&#160;            }</div><div class="line"><a name="l12912"></a><span class="lineno">12912</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l12913"></a><span class="lineno">12913</span>&#160;            {</div><div class="line"><a name="l12914"></a><span class="lineno">12914</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="l12915"></a><span class="lineno">12915</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="l12916"></a><span class="lineno">12916</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="l12917"></a><span class="lineno">12917</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="l12918"></a><span class="lineno">12918</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l12919"></a><span class="lineno">12919</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="l12920"></a><span class="lineno">12920</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l12921"></a><span class="lineno">12921</span>&#160;            }</div><div class="line"><a name="l12922"></a><span class="lineno">12922</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l12923"></a><span class="lineno">12923</span>&#160;            {</div><div class="line"><a name="l12924"></a><span class="lineno">12924</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l12925"></a><span class="lineno">12925</span>&#160;                {</div><div class="line"><a name="l12926"></a><span class="lineno">12926</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l12927"></a><span class="lineno">12927</span>&#160;                }</div><div class="line"><a name="l12928"></a><span class="lineno">12928</span>&#160;            }</div><div class="line"><a name="l12929"></a><span class="lineno">12929</span>&#160;        }</div><div class="line"><a name="l12930"></a><span class="lineno">12930</span>&#160;    }</div><div class="line"><a name="l12931"></a><span class="lineno">12931</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12932"></a><span class="lineno">12932</span>&#160;    {</div><div class="line"><a name="l12933"></a><span class="lineno">12933</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l12934"></a><span class="lineno">12934</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12935"></a><span class="lineno">12935</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l12936"></a><span class="lineno">12936</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12937"></a><span class="lineno">12937</span>&#160;        {</div><div class="line"><a name="l12938"></a><span class="lineno">12938</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l12939"></a><span class="lineno">12939</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l12940"></a><span class="lineno">12940</span>&#160;            {</div><div class="line"><a name="l12941"></a><span class="lineno">12941</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l12942"></a><span class="lineno">12942</span>&#160;            }</div><div class="line"><a name="l12943"></a><span class="lineno">12943</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l12944"></a><span class="lineno">12944</span>&#160;            {</div><div class="line"><a name="l12945"></a><span class="lineno">12945</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l12946"></a><span class="lineno">12946</span>&#160;                {</div><div class="line"><a name="l12947"></a><span class="lineno">12947</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l12948"></a><span class="lineno">12948</span>&#160;                }</div><div class="line"><a name="l12949"></a><span class="lineno">12949</span>&#160;            }</div><div class="line"><a name="l12950"></a><span class="lineno">12950</span>&#160;        }</div><div class="line"><a name="l12951"></a><span class="lineno">12951</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12952"></a><span class="lineno">12952</span>&#160;</div><div class="line"><a name="l12953"></a><span class="lineno">12953</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="l12954"></a><span class="lineno">12954</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="l12955"></a><span class="lineno">12955</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="l12956"></a><span class="lineno">12956</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="l12957"></a><span class="lineno">12957</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="l12958"></a><span class="lineno">12958</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="l12959"></a><span class="lineno">12959</span>&#160;    }</div><div class="line"><a name="l12960"></a><span class="lineno">12960</span>&#160;}</div><div class="line"><a name="l12961"></a><span class="lineno">12961</span>&#160;</div><div class="line"><a name="l12962"></a><span class="lineno">12962</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="l12963"></a><span class="lineno">12963</span>&#160;{</div><div class="line"><a name="l12964"></a><span class="lineno">12964</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div><div class="line"><a name="l12965"></a><span class="lineno">12965</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l12966"></a><span class="lineno">12966</span>&#160;    {</div><div class="line"><a name="l12967"></a><span class="lineno">12967</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12968"></a><span class="lineno">12968</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l12969"></a><span class="lineno">12969</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12970"></a><span class="lineno">12970</span>&#160;        {</div><div class="line"><a name="l12971"></a><span class="lineno">12971</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l12972"></a><span class="lineno">12972</span>&#160;            {</div><div class="line"><a name="l12973"></a><span class="lineno">12973</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l12974"></a><span class="lineno">12974</span>&#160;            }</div><div class="line"><a name="l12975"></a><span class="lineno">12975</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l12976"></a><span class="lineno">12976</span>&#160;            {</div><div class="line"><a name="l12977"></a><span class="lineno">12977</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l12978"></a><span class="lineno">12978</span>&#160;            }</div><div class="line"><a name="l12979"></a><span class="lineno">12979</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l12980"></a><span class="lineno">12980</span>&#160;            {</div><div class="line"><a name="l12981"></a><span class="lineno">12981</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l12982"></a><span class="lineno">12982</span>&#160;                {</div><div class="line"><a name="l12983"></a><span class="lineno">12983</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l12984"></a><span class="lineno">12984</span>&#160;                }</div><div class="line"><a name="l12985"></a><span class="lineno">12985</span>&#160;            }</div><div class="line"><a name="l12986"></a><span class="lineno">12986</span>&#160;        }</div><div class="line"><a name="l12987"></a><span class="lineno">12987</span>&#160;    }</div><div class="line"><a name="l12988"></a><span class="lineno">12988</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12989"></a><span class="lineno">12989</span>&#160;    {</div><div class="line"><a name="l12990"></a><span class="lineno">12990</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l12991"></a><span class="lineno">12991</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12992"></a><span class="lineno">12992</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l12993"></a><span class="lineno">12993</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12994"></a><span class="lineno">12994</span>&#160;        {</div><div class="line"><a name="l12995"></a><span class="lineno">12995</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l12996"></a><span class="lineno">12996</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l12997"></a><span class="lineno">12997</span>&#160;            {</div><div class="line"><a name="l12998"></a><span class="lineno">12998</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l12999"></a><span class="lineno">12999</span>&#160;            }</div><div class="line"><a name="l13000"></a><span class="lineno">13000</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l13001"></a><span class="lineno">13001</span>&#160;            {</div><div class="line"><a name="l13002"></a><span class="lineno">13002</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l13003"></a><span class="lineno">13003</span>&#160;                {</div><div class="line"><a name="l13004"></a><span class="lineno">13004</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l13005"></a><span class="lineno">13005</span>&#160;                }</div><div class="line"><a name="l13006"></a><span class="lineno">13006</span>&#160;            }</div><div class="line"><a name="l13007"></a><span class="lineno">13007</span>&#160;        }</div><div class="line"><a name="l13008"></a><span class="lineno">13008</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13009"></a><span class="lineno">13009</span>&#160;</div><div class="line"><a name="l13010"></a><span class="lineno">13010</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l13011"></a><span class="lineno">13011</span>&#160;    }</div><div class="line"><a name="l13012"></a><span class="lineno">13012</span>&#160;}</div><div class="line"><a name="l13013"></a><span class="lineno">13013</span>&#160;</div><div class="line"><a name="l13014"></a><span class="lineno">13014</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="l13015"></a><span class="lineno">13015</span>&#160;{</div><div class="line"><a name="l13016"></a><span class="lineno">13016</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  CreatePool: MemoryTypeIndex=%u, flags=%u&quot;</span>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>);</div><div class="line"><a name="l13017"></a><span class="lineno">13017</span>&#160;</div><div class="line"><a name="l13018"></a><span class="lineno">13018</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div><div class="line"><a name="l13019"></a><span class="lineno">13019</span>&#160;</div><div class="line"><a name="l13020"></a><span class="lineno">13020</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="l13021"></a><span class="lineno">13021</span>&#160;    {</div><div class="line"><a name="l13022"></a><span class="lineno">13022</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div><div class="line"><a name="l13023"></a><span class="lineno">13023</span>&#160;    }</div><div class="line"><a name="l13024"></a><span class="lineno">13024</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a> &gt; newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>)</div><div class="line"><a name="l13025"></a><span class="lineno">13025</span>&#160;    {</div><div class="line"><a name="l13026"></a><span class="lineno">13026</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div><div class="line"><a name="l13027"></a><span class="lineno">13027</span>&#160;    }</div><div class="line"><a name="l13028"></a><span class="lineno">13028</span>&#160;</div><div class="line"><a name="l13029"></a><span class="lineno">13029</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l13030"></a><span class="lineno">13030</span>&#160;</div><div class="line"><a name="l13031"></a><span class="lineno">13031</span>&#160;    *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo, preferredBlockSize);</div><div class="line"><a name="l13032"></a><span class="lineno">13032</span>&#160;</div><div class="line"><a name="l13033"></a><span class="lineno">13033</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div><div class="line"><a name="l13034"></a><span class="lineno">13034</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l13035"></a><span class="lineno">13035</span>&#160;    {</div><div class="line"><a name="l13036"></a><span class="lineno">13036</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div><div class="line"><a name="l13037"></a><span class="lineno">13037</span>&#160;        *pPool = VMA_NULL;</div><div class="line"><a name="l13038"></a><span class="lineno">13038</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13039"></a><span class="lineno">13039</span>&#160;    }</div><div class="line"><a name="l13040"></a><span class="lineno">13040</span>&#160;</div><div class="line"><a name="l13041"></a><span class="lineno">13041</span>&#160;    <span class="comment">// Add to m_Pools.</span></div><div class="line"><a name="l13042"></a><span class="lineno">13042</span>&#160;    {</div><div class="line"><a name="l13043"></a><span class="lineno">13043</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l13044"></a><span class="lineno">13044</span>&#160;        (*pPool)-&gt;SetId(m_NextPoolId++);</div><div class="line"><a name="l13045"></a><span class="lineno">13045</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div><div class="line"><a name="l13046"></a><span class="lineno">13046</span>&#160;    }</div><div class="line"><a name="l13047"></a><span class="lineno">13047</span>&#160;</div><div class="line"><a name="l13048"></a><span class="lineno">13048</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l13049"></a><span class="lineno">13049</span>&#160;}</div><div class="line"><a name="l13050"></a><span class="lineno">13050</span>&#160;</div><div class="line"><a name="l13051"></a><span class="lineno">13051</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="l13052"></a><span class="lineno">13052</span>&#160;{</div><div class="line"><a name="l13053"></a><span class="lineno">13053</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div><div class="line"><a name="l13054"></a><span class="lineno">13054</span>&#160;    {</div><div class="line"><a name="l13055"></a><span class="lineno">13055</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l13056"></a><span class="lineno">13056</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div><div class="line"><a name="l13057"></a><span class="lineno">13057</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div><div class="line"><a name="l13058"></a><span class="lineno">13058</span>&#160;    }</div><div class="line"><a name="l13059"></a><span class="lineno">13059</span>&#160;</div><div class="line"><a name="l13060"></a><span class="lineno">13060</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div><div class="line"><a name="l13061"></a><span class="lineno">13061</span>&#160;}</div><div class="line"><a name="l13062"></a><span class="lineno">13062</span>&#160;</div><div class="line"><a name="l13063"></a><span class="lineno">13063</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="l13064"></a><span class="lineno">13064</span>&#160;{</div><div class="line"><a name="l13065"></a><span class="lineno">13065</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div><div class="line"><a name="l13066"></a><span class="lineno">13066</span>&#160;}</div><div class="line"><a name="l13067"></a><span class="lineno">13067</span>&#160;</div><div class="line"><a name="l13068"></a><span class="lineno">13068</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div><div class="line"><a name="l13069"></a><span class="lineno">13069</span>&#160;{</div><div class="line"><a name="l13070"></a><span class="lineno">13070</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div><div class="line"><a name="l13071"></a><span class="lineno">13071</span>&#160;}</div><div class="line"><a name="l13072"></a><span class="lineno">13072</span>&#160;</div><div class="line"><a name="l13073"></a><span class="lineno">13073</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div><div class="line"><a name="l13074"></a><span class="lineno">13074</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l13075"></a><span class="lineno">13075</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l13076"></a><span class="lineno">13076</span>&#160;{</div><div class="line"><a name="l13077"></a><span class="lineno">13077</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div><div class="line"><a name="l13078"></a><span class="lineno">13078</span>&#160;        m_CurrentFrameIndex.load(),</div><div class="line"><a name="l13079"></a><span class="lineno">13079</span>&#160;        pLostAllocationCount);</div><div class="line"><a name="l13080"></a><span class="lineno">13080</span>&#160;}</div><div class="line"><a name="l13081"></a><span class="lineno">13081</span>&#160;</div><div class="line"><a name="l13082"></a><span class="lineno">13082</span>&#160;VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div><div class="line"><a name="l13083"></a><span class="lineno">13083</span>&#160;{</div><div class="line"><a name="l13084"></a><span class="lineno">13084</span>&#160;    <span class="keywordflow">return</span> hPool-&gt;m_BlockVector.CheckCorruption();</div><div class="line"><a name="l13085"></a><span class="lineno">13085</span>&#160;}</div><div class="line"><a name="l13086"></a><span class="lineno">13086</span>&#160;</div><div class="line"><a name="l13087"></a><span class="lineno">13087</span>&#160;VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div><div class="line"><a name="l13088"></a><span class="lineno">13088</span>&#160;{</div><div class="line"><a name="l13089"></a><span class="lineno">13089</span>&#160;    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l13090"></a><span class="lineno">13090</span>&#160;</div><div class="line"><a name="l13091"></a><span class="lineno">13091</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l13092"></a><span class="lineno">13092</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l13093"></a><span class="lineno">13093</span>&#160;    {</div><div class="line"><a name="l13094"></a><span class="lineno">13094</span>&#160;        <span class="keywordflow">if</span>(((1u &lt;&lt; memTypeIndex) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l13095"></a><span class="lineno">13095</span>&#160;        {</div><div class="line"><a name="l13096"></a><span class="lineno">13096</span>&#160;            VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l13097"></a><span class="lineno">13097</span>&#160;            VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l13098"></a><span class="lineno">13098</span>&#160;            VkResult localRes = pBlockVector-&gt;CheckCorruption();</div><div class="line"><a name="l13099"></a><span class="lineno">13099</span>&#160;            <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l13100"></a><span class="lineno">13100</span>&#160;            {</div><div class="line"><a name="l13101"></a><span class="lineno">13101</span>&#160;            <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l13102"></a><span class="lineno">13102</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l13103"></a><span class="lineno">13103</span>&#160;            <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l13104"></a><span class="lineno">13104</span>&#160;                finalRes = VK_SUCCESS;</div><div class="line"><a name="l13105"></a><span class="lineno">13105</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l13106"></a><span class="lineno">13106</span>&#160;            <span class="keywordflow">default</span>:</div><div class="line"><a name="l13107"></a><span class="lineno">13107</span>&#160;                <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l13108"></a><span class="lineno">13108</span>&#160;            }</div><div class="line"><a name="l13109"></a><span class="lineno">13109</span>&#160;        }</div><div class="line"><a name="l13110"></a><span class="lineno">13110</span>&#160;    }</div><div class="line"><a name="l13111"></a><span class="lineno">13111</span>&#160;</div><div class="line"><a name="l13112"></a><span class="lineno">13112</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l13113"></a><span class="lineno">13113</span>&#160;    {</div><div class="line"><a name="l13114"></a><span class="lineno">13114</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l13115"></a><span class="lineno">13115</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="l13116"></a><span class="lineno">13116</span>&#160;        {</div><div class="line"><a name="l13117"></a><span class="lineno">13117</span>&#160;            <span class="keywordflow">if</span>(((1u &lt;&lt; m_Pools[poolIndex]-&gt;m_BlockVector.GetMemoryTypeIndex()) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l13118"></a><span class="lineno">13118</span>&#160;            {</div><div class="line"><a name="l13119"></a><span class="lineno">13119</span>&#160;                VkResult localRes = m_Pools[poolIndex]-&gt;m_BlockVector.CheckCorruption();</div><div class="line"><a name="l13120"></a><span class="lineno">13120</span>&#160;                <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l13121"></a><span class="lineno">13121</span>&#160;                {</div><div class="line"><a name="l13122"></a><span class="lineno">13122</span>&#160;                <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l13123"></a><span class="lineno">13123</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l13124"></a><span class="lineno">13124</span>&#160;                <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l13125"></a><span class="lineno">13125</span>&#160;                    finalRes = VK_SUCCESS;</div><div class="line"><a name="l13126"></a><span class="lineno">13126</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l13127"></a><span class="lineno">13127</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l13128"></a><span class="lineno">13128</span>&#160;                    <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l13129"></a><span class="lineno">13129</span>&#160;                }</div><div class="line"><a name="l13130"></a><span class="lineno">13130</span>&#160;            }</div><div class="line"><a name="l13131"></a><span class="lineno">13131</span>&#160;        }</div><div class="line"><a name="l13132"></a><span class="lineno">13132</span>&#160;    }</div><div class="line"><a name="l13133"></a><span class="lineno">13133</span>&#160;</div><div class="line"><a name="l13134"></a><span class="lineno">13134</span>&#160;    <span class="keywordflow">return</span> finalRes;</div><div class="line"><a name="l13135"></a><span class="lineno">13135</span>&#160;}</div><div class="line"><a name="l13136"></a><span class="lineno">13136</span>&#160;</div><div class="line"><a name="l13137"></a><span class="lineno">13137</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="l13138"></a><span class="lineno">13138</span>&#160;{</div><div class="line"><a name="l13139"></a><span class="lineno">13139</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="l13140"></a><span class="lineno">13140</span>&#160;    (*pAllocation)-&gt;InitLost();</div><div class="line"><a name="l13141"></a><span class="lineno">13141</span>&#160;}</div><div class="line"><a name="l13142"></a><span class="lineno">13142</span>&#160;</div><div class="line"><a name="l13143"></a><span class="lineno">13143</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div><div class="line"><a name="l13144"></a><span class="lineno">13144</span>&#160;{</div><div class="line"><a name="l13145"></a><span class="lineno">13145</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div><div class="line"><a name="l13146"></a><span class="lineno">13146</span>&#160;</div><div class="line"><a name="l13147"></a><span class="lineno">13147</span>&#160;    VkResult res;</div><div class="line"><a name="l13148"></a><span class="lineno">13148</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l13149"></a><span class="lineno">13149</span>&#160;    {</div><div class="line"><a name="l13150"></a><span class="lineno">13150</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l13151"></a><span class="lineno">13151</span>&#160;        <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] &gt;= pAllocateInfo-&gt;allocationSize)</div><div class="line"><a name="l13152"></a><span class="lineno">13152</span>&#160;        {</div><div class="line"><a name="l13153"></a><span class="lineno">13153</span>&#160;            res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l13154"></a><span class="lineno">13154</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13155"></a><span class="lineno">13155</span>&#160;            {</div><div class="line"><a name="l13156"></a><span class="lineno">13156</span>&#160;                m_HeapSizeLimit[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div><div class="line"><a name="l13157"></a><span class="lineno">13157</span>&#160;            }</div><div class="line"><a name="l13158"></a><span class="lineno">13158</span>&#160;        }</div><div class="line"><a name="l13159"></a><span class="lineno">13159</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l13160"></a><span class="lineno">13160</span>&#160;        {</div><div class="line"><a name="l13161"></a><span class="lineno">13161</span>&#160;            res = VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l13162"></a><span class="lineno">13162</span>&#160;        }</div><div class="line"><a name="l13163"></a><span class="lineno">13163</span>&#160;    }</div><div class="line"><a name="l13164"></a><span class="lineno">13164</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l13165"></a><span class="lineno">13165</span>&#160;    {</div><div class="line"><a name="l13166"></a><span class="lineno">13166</span>&#160;        res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l13167"></a><span class="lineno">13167</span>&#160;    }</div><div class="line"><a name="l13168"></a><span class="lineno">13168</span>&#160;</div><div class="line"><a name="l13169"></a><span class="lineno">13169</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="l13170"></a><span class="lineno">13170</span>&#160;    {</div><div class="line"><a name="l13171"></a><span class="lineno">13171</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="l13172"></a><span class="lineno">13172</span>&#160;    }</div><div class="line"><a name="l13173"></a><span class="lineno">13173</span>&#160;</div><div class="line"><a name="l13174"></a><span class="lineno">13174</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13175"></a><span class="lineno">13175</span>&#160;}</div><div class="line"><a name="l13176"></a><span class="lineno">13176</span>&#160;</div><div class="line"><a name="l13177"></a><span class="lineno">13177</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div><div class="line"><a name="l13178"></a><span class="lineno">13178</span>&#160;{</div><div class="line"><a name="l13179"></a><span class="lineno">13179</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="l13180"></a><span class="lineno">13180</span>&#160;    {</div><div class="line"><a name="l13181"></a><span class="lineno">13181</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="l13182"></a><span class="lineno">13182</span>&#160;    }</div><div class="line"><a name="l13183"></a><span class="lineno">13183</span>&#160;</div><div class="line"><a name="l13184"></a><span class="lineno">13184</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div><div class="line"><a name="l13185"></a><span class="lineno">13185</span>&#160;</div><div class="line"><a name="l13186"></a><span class="lineno">13186</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);</div><div class="line"><a name="l13187"></a><span class="lineno">13187</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l13188"></a><span class="lineno">13188</span>&#160;    {</div><div class="line"><a name="l13189"></a><span class="lineno">13189</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l13190"></a><span class="lineno">13190</span>&#160;        m_HeapSizeLimit[heapIndex] += size;</div><div class="line"><a name="l13191"></a><span class="lineno">13191</span>&#160;    }</div><div class="line"><a name="l13192"></a><span class="lineno">13192</span>&#160;}</div><div class="line"><a name="l13193"></a><span class="lineno">13193</span>&#160;</div><div class="line"><a name="l13194"></a><span class="lineno">13194</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="l13195"></a><span class="lineno">13195</span>&#160;{</div><div class="line"><a name="l13196"></a><span class="lineno">13196</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l13197"></a><span class="lineno">13197</span>&#160;    {</div><div class="line"><a name="l13198"></a><span class="lineno">13198</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l13199"></a><span class="lineno">13199</span>&#160;    }</div><div class="line"><a name="l13200"></a><span class="lineno">13200</span>&#160;</div><div class="line"><a name="l13201"></a><span class="lineno">13201</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13202"></a><span class="lineno">13202</span>&#160;    {</div><div class="line"><a name="l13203"></a><span class="lineno">13203</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13204"></a><span class="lineno">13204</span>&#160;        {</div><div class="line"><a name="l13205"></a><span class="lineno">13205</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l13206"></a><span class="lineno">13206</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div><div class="line"><a name="l13207"></a><span class="lineno">13207</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="l13208"></a><span class="lineno">13208</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13209"></a><span class="lineno">13209</span>&#160;            {</div><div class="line"><a name="l13210"></a><span class="lineno">13210</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div><div class="line"><a name="l13211"></a><span class="lineno">13211</span>&#160;                hAllocation-&gt;BlockAllocMap();</div><div class="line"><a name="l13212"></a><span class="lineno">13212</span>&#160;            }</div><div class="line"><a name="l13213"></a><span class="lineno">13213</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13214"></a><span class="lineno">13214</span>&#160;        }</div><div class="line"><a name="l13215"></a><span class="lineno">13215</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13216"></a><span class="lineno">13216</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div><div class="line"><a name="l13217"></a><span class="lineno">13217</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13218"></a><span class="lineno">13218</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l13219"></a><span class="lineno">13219</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l13220"></a><span class="lineno">13220</span>&#160;    }</div><div class="line"><a name="l13221"></a><span class="lineno">13221</span>&#160;}</div><div class="line"><a name="l13222"></a><span class="lineno">13222</span>&#160;</div><div class="line"><a name="l13223"></a><span class="lineno">13223</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="l13224"></a><span class="lineno">13224</span>&#160;{</div><div class="line"><a name="l13225"></a><span class="lineno">13225</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13226"></a><span class="lineno">13226</span>&#160;    {</div><div class="line"><a name="l13227"></a><span class="lineno">13227</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13228"></a><span class="lineno">13228</span>&#160;        {</div><div class="line"><a name="l13229"></a><span class="lineno">13229</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l13230"></a><span class="lineno">13230</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div><div class="line"><a name="l13231"></a><span class="lineno">13231</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div><div class="line"><a name="l13232"></a><span class="lineno">13232</span>&#160;        }</div><div class="line"><a name="l13233"></a><span class="lineno">13233</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13234"></a><span class="lineno">13234</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13235"></a><span class="lineno">13235</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div><div class="line"><a name="l13236"></a><span class="lineno">13236</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13237"></a><span class="lineno">13237</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13238"></a><span class="lineno">13238</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l13239"></a><span class="lineno">13239</span>&#160;    }</div><div class="line"><a name="l13240"></a><span class="lineno">13240</span>&#160;}</div><div class="line"><a name="l13241"></a><span class="lineno">13241</span>&#160;</div><div class="line"><a name="l13242"></a><span class="lineno">13242</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="l13243"></a><span class="lineno">13243</span>&#160;{</div><div class="line"><a name="l13244"></a><span class="lineno">13244</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l13245"></a><span class="lineno">13245</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13246"></a><span class="lineno">13246</span>&#160;    {</div><div class="line"><a name="l13247"></a><span class="lineno">13247</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13248"></a><span class="lineno">13248</span>&#160;        res = GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l13249"></a><span class="lineno">13249</span>&#160;            m_hDevice,</div><div class="line"><a name="l13250"></a><span class="lineno">13250</span>&#160;            hBuffer,</div><div class="line"><a name="l13251"></a><span class="lineno">13251</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l13252"></a><span class="lineno">13252</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l13253"></a><span class="lineno">13253</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13254"></a><span class="lineno">13254</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13255"></a><span class="lineno">13255</span>&#160;    {</div><div class="line"><a name="l13256"></a><span class="lineno">13256</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l13257"></a><span class="lineno">13257</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="l13258"></a><span class="lineno">13258</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, hBuffer);</div><div class="line"><a name="l13259"></a><span class="lineno">13259</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13260"></a><span class="lineno">13260</span>&#160;    }</div><div class="line"><a name="l13261"></a><span class="lineno">13261</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13262"></a><span class="lineno">13262</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l13263"></a><span class="lineno">13263</span>&#160;    }</div><div class="line"><a name="l13264"></a><span class="lineno">13264</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13265"></a><span class="lineno">13265</span>&#160;}</div><div class="line"><a name="l13266"></a><span class="lineno">13266</span>&#160;</div><div class="line"><a name="l13267"></a><span class="lineno">13267</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="l13268"></a><span class="lineno">13268</span>&#160;{</div><div class="line"><a name="l13269"></a><span class="lineno">13269</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l13270"></a><span class="lineno">13270</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13271"></a><span class="lineno">13271</span>&#160;    {</div><div class="line"><a name="l13272"></a><span class="lineno">13272</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13273"></a><span class="lineno">13273</span>&#160;        res = GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l13274"></a><span class="lineno">13274</span>&#160;            m_hDevice,</div><div class="line"><a name="l13275"></a><span class="lineno">13275</span>&#160;            hImage,</div><div class="line"><a name="l13276"></a><span class="lineno">13276</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l13277"></a><span class="lineno">13277</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l13278"></a><span class="lineno">13278</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13279"></a><span class="lineno">13279</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13280"></a><span class="lineno">13280</span>&#160;    {</div><div class="line"><a name="l13281"></a><span class="lineno">13281</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l13282"></a><span class="lineno">13282</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="l13283"></a><span class="lineno">13283</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, hImage);</div><div class="line"><a name="l13284"></a><span class="lineno">13284</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13285"></a><span class="lineno">13285</span>&#160;    }</div><div class="line"><a name="l13286"></a><span class="lineno">13286</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13287"></a><span class="lineno">13287</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l13288"></a><span class="lineno">13288</span>&#160;    }</div><div class="line"><a name="l13289"></a><span class="lineno">13289</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13290"></a><span class="lineno">13290</span>&#160;}</div><div class="line"><a name="l13291"></a><span class="lineno">13291</span>&#160;</div><div class="line"><a name="l13292"></a><span class="lineno">13292</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FlushOrInvalidateAllocation(</div><div class="line"><a name="l13293"></a><span class="lineno">13293</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l13294"></a><span class="lineno">13294</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l13295"></a><span class="lineno">13295</span>&#160;    VMA_CACHE_OPERATION op)</div><div class="line"><a name="l13296"></a><span class="lineno">13296</span>&#160;{</div><div class="line"><a name="l13297"></a><span class="lineno">13297</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l13298"></a><span class="lineno">13298</span>&#160;    <span class="keywordflow">if</span>(size &gt; 0 &amp;&amp; IsMemoryTypeNonCoherent(memTypeIndex))</div><div class="line"><a name="l13299"></a><span class="lineno">13299</span>&#160;    {</div><div class="line"><a name="l13300"></a><span class="lineno">13300</span>&#160;        <span class="keyword">const</span> VkDeviceSize allocationSize = hAllocation-&gt;GetSize();</div><div class="line"><a name="l13301"></a><span class="lineno">13301</span>&#160;        VMA_ASSERT(offset &lt;= allocationSize);</div><div class="line"><a name="l13302"></a><span class="lineno">13302</span>&#160;</div><div class="line"><a name="l13303"></a><span class="lineno">13303</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div><div class="line"><a name="l13304"></a><span class="lineno">13304</span>&#160;</div><div class="line"><a name="l13305"></a><span class="lineno">13305</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div><div class="line"><a name="l13306"></a><span class="lineno">13306</span>&#160;        memRange.memory = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l13307"></a><span class="lineno">13307</span>&#160;        </div><div class="line"><a name="l13308"></a><span class="lineno">13308</span>&#160;        <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13309"></a><span class="lineno">13309</span>&#160;        {</div><div class="line"><a name="l13310"></a><span class="lineno">13310</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13311"></a><span class="lineno">13311</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l13312"></a><span class="lineno">13312</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l13313"></a><span class="lineno">13313</span>&#160;            {</div><div class="line"><a name="l13314"></a><span class="lineno">13314</span>&#160;                memRange.size = allocationSize - memRange.offset;</div><div class="line"><a name="l13315"></a><span class="lineno">13315</span>&#160;            }</div><div class="line"><a name="l13316"></a><span class="lineno">13316</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l13317"></a><span class="lineno">13317</span>&#160;            {</div><div class="line"><a name="l13318"></a><span class="lineno">13318</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l13319"></a><span class="lineno">13319</span>&#160;                memRange.size = VMA_MIN(</div><div class="line"><a name="l13320"></a><span class="lineno">13320</span>&#160;                    VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize),</div><div class="line"><a name="l13321"></a><span class="lineno">13321</span>&#160;                    allocationSize - memRange.offset);</div><div class="line"><a name="l13322"></a><span class="lineno">13322</span>&#160;            }</div><div class="line"><a name="l13323"></a><span class="lineno">13323</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13324"></a><span class="lineno">13324</span>&#160;</div><div class="line"><a name="l13325"></a><span class="lineno">13325</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13326"></a><span class="lineno">13326</span>&#160;        {</div><div class="line"><a name="l13327"></a><span class="lineno">13327</span>&#160;            <span class="comment">// 1. Still within this allocation.</span></div><div class="line"><a name="l13328"></a><span class="lineno">13328</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l13329"></a><span class="lineno">13329</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l13330"></a><span class="lineno">13330</span>&#160;            {</div><div class="line"><a name="l13331"></a><span class="lineno">13331</span>&#160;                size = allocationSize - offset;</div><div class="line"><a name="l13332"></a><span class="lineno">13332</span>&#160;            }</div><div class="line"><a name="l13333"></a><span class="lineno">13333</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l13334"></a><span class="lineno">13334</span>&#160;            {</div><div class="line"><a name="l13335"></a><span class="lineno">13335</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l13336"></a><span class="lineno">13336</span>&#160;            }</div><div class="line"><a name="l13337"></a><span class="lineno">13337</span>&#160;            memRange.size = VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize);</div><div class="line"><a name="l13338"></a><span class="lineno">13338</span>&#160;</div><div class="line"><a name="l13339"></a><span class="lineno">13339</span>&#160;            <span class="comment">// 2. Adjust to whole block.</span></div><div class="line"><a name="l13340"></a><span class="lineno">13340</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocationOffset = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l13341"></a><span class="lineno">13341</span>&#160;            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div><div class="line"><a name="l13342"></a><span class="lineno">13342</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockSize = hAllocation-&gt;GetBlock()-&gt;m_pMetadata-&gt;GetSize();</div><div class="line"><a name="l13343"></a><span class="lineno">13343</span>&#160;            memRange.offset += allocationOffset;</div><div class="line"><a name="l13344"></a><span class="lineno">13344</span>&#160;            memRange.size = VMA_MIN(memRange.size, blockSize - memRange.offset);</div><div class="line"><a name="l13345"></a><span class="lineno">13345</span>&#160;            </div><div class="line"><a name="l13346"></a><span class="lineno">13346</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13347"></a><span class="lineno">13347</span>&#160;        }</div><div class="line"><a name="l13348"></a><span class="lineno">13348</span>&#160;        </div><div class="line"><a name="l13349"></a><span class="lineno">13349</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l13350"></a><span class="lineno">13350</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l13351"></a><span class="lineno">13351</span>&#160;        }</div><div class="line"><a name="l13352"></a><span class="lineno">13352</span>&#160;</div><div class="line"><a name="l13353"></a><span class="lineno">13353</span>&#160;        <span class="keywordflow">switch</span>(op)</div><div class="line"><a name="l13354"></a><span class="lineno">13354</span>&#160;        {</div><div class="line"><a name="l13355"></a><span class="lineno">13355</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div><div class="line"><a name="l13356"></a><span class="lineno">13356</span>&#160;            (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l13357"></a><span class="lineno">13357</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13358"></a><span class="lineno">13358</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div><div class="line"><a name="l13359"></a><span class="lineno">13359</span>&#160;            (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l13360"></a><span class="lineno">13360</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13361"></a><span class="lineno">13361</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l13362"></a><span class="lineno">13362</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l13363"></a><span class="lineno">13363</span>&#160;        }</div><div class="line"><a name="l13364"></a><span class="lineno">13364</span>&#160;    }</div><div class="line"><a name="l13365"></a><span class="lineno">13365</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div><div class="line"><a name="l13366"></a><span class="lineno">13366</span>&#160;}</div><div class="line"><a name="l13367"></a><span class="lineno">13367</span>&#160;</div><div class="line"><a name="l13368"></a><span class="lineno">13368</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="l13369"></a><span class="lineno">13369</span>&#160;{</div><div class="line"><a name="l13370"></a><span class="lineno">13370</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l13371"></a><span class="lineno">13371</span>&#160;</div><div class="line"><a name="l13372"></a><span class="lineno">13372</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l13373"></a><span class="lineno">13373</span>&#160;    {</div><div class="line"><a name="l13374"></a><span class="lineno">13374</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l13375"></a><span class="lineno">13375</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l13376"></a><span class="lineno">13376</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l13377"></a><span class="lineno">13377</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div><div class="line"><a name="l13378"></a><span class="lineno">13378</span>&#160;        VMA_ASSERT(success);</div><div class="line"><a name="l13379"></a><span class="lineno">13379</span>&#160;    }</div><div class="line"><a name="l13380"></a><span class="lineno">13380</span>&#160;</div><div class="line"><a name="l13381"></a><span class="lineno">13381</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div><div class="line"><a name="l13382"></a><span class="lineno">13382</span>&#160;    </div><div class="line"><a name="l13383"></a><span class="lineno">13383</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l13384"></a><span class="lineno">13384</span>&#160;<span class="comment">    There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div><div class="line"><a name="l13385"></a><span class="lineno">13385</span>&#160;<span class="comment">    before vkFreeMemory.</span></div><div class="line"><a name="l13386"></a><span class="lineno">13386</span>&#160;<span class="comment"></span></div><div class="line"><a name="l13387"></a><span class="lineno">13387</span>&#160;<span class="comment">    if(allocation-&gt;GetMappedData() != VMA_NULL)</span></div><div class="line"><a name="l13388"></a><span class="lineno">13388</span>&#160;<span class="comment">    {</span></div><div class="line"><a name="l13389"></a><span class="lineno">13389</span>&#160;<span class="comment">        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div><div class="line"><a name="l13390"></a><span class="lineno">13390</span>&#160;<span class="comment">    }</span></div><div class="line"><a name="l13391"></a><span class="lineno">13391</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l13392"></a><span class="lineno">13392</span>&#160;    </div><div class="line"><a name="l13393"></a><span class="lineno">13393</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div><div class="line"><a name="l13394"></a><span class="lineno">13394</span>&#160;</div><div class="line"><a name="l13395"></a><span class="lineno">13395</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l13396"></a><span class="lineno">13396</span>&#160;}</div><div class="line"><a name="l13397"></a><span class="lineno">13397</span>&#160;</div><div class="line"><a name="l13398"></a><span class="lineno">13398</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern)</div><div class="line"><a name="l13399"></a><span class="lineno">13399</span>&#160;{</div><div class="line"><a name="l13400"></a><span class="lineno">13400</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &amp;&amp;</div><div class="line"><a name="l13401"></a><span class="lineno">13401</span>&#160;        !hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l13402"></a><span class="lineno">13402</span>&#160;        (m_MemProps.memoryTypes[hAllocation-&gt;GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l13403"></a><span class="lineno">13403</span>&#160;    {</div><div class="line"><a name="l13404"></a><span class="lineno">13404</span>&#160;        <span class="keywordtype">void</span>* pData = VMA_NULL;</div><div class="line"><a name="l13405"></a><span class="lineno">13405</span>&#160;        VkResult res = Map(hAllocation, &amp;pData);</div><div class="line"><a name="l13406"></a><span class="lineno">13406</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13407"></a><span class="lineno">13407</span>&#160;        {</div><div class="line"><a name="l13408"></a><span class="lineno">13408</span>&#160;            memset(pData, (<span class="keywordtype">int</span>)pattern, (<span class="keywordtype">size_t</span>)hAllocation-&gt;GetSize());</div><div class="line"><a name="l13409"></a><span class="lineno">13409</span>&#160;            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div><div class="line"><a name="l13410"></a><span class="lineno">13410</span>&#160;            Unmap(hAllocation);</div><div class="line"><a name="l13411"></a><span class="lineno">13411</span>&#160;        }</div><div class="line"><a name="l13412"></a><span class="lineno">13412</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l13413"></a><span class="lineno">13413</span>&#160;        {</div><div class="line"><a name="l13414"></a><span class="lineno">13414</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn&#39;t map memory to fill allocation.&quot;</span>);</div><div class="line"><a name="l13415"></a><span class="lineno">13415</span>&#160;        }</div><div class="line"><a name="l13416"></a><span class="lineno">13416</span>&#160;    }</div><div class="line"><a name="l13417"></a><span class="lineno">13417</span>&#160;}</div><div class="line"><a name="l13418"></a><span class="lineno">13418</span>&#160;</div><div class="line"><a name="l13419"></a><span class="lineno">13419</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l13420"></a><span class="lineno">13420</span>&#160;</div><div class="line"><a name="l13421"></a><span class="lineno">13421</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div><div class="line"><a name="l13422"></a><span class="lineno">13422</span>&#160;{</div><div class="line"><a name="l13423"></a><span class="lineno">13423</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l13424"></a><span class="lineno">13424</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l13425"></a><span class="lineno">13425</span>&#160;    {</div><div class="line"><a name="l13426"></a><span class="lineno">13426</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l13427"></a><span class="lineno">13427</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l13428"></a><span class="lineno">13428</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l13429"></a><span class="lineno">13429</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div><div class="line"><a name="l13430"></a><span class="lineno">13430</span>&#160;        {</div><div class="line"><a name="l13431"></a><span class="lineno">13431</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l13432"></a><span class="lineno">13432</span>&#160;            {</div><div class="line"><a name="l13433"></a><span class="lineno">13433</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l13434"></a><span class="lineno">13434</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div><div class="line"><a name="l13435"></a><span class="lineno">13435</span>&#160;                json.BeginObject();</div><div class="line"><a name="l13436"></a><span class="lineno">13436</span>&#160;            }</div><div class="line"><a name="l13437"></a><span class="lineno">13437</span>&#160;</div><div class="line"><a name="l13438"></a><span class="lineno">13438</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l13439"></a><span class="lineno">13439</span>&#160;            json.ContinueString(memTypeIndex);</div><div class="line"><a name="l13440"></a><span class="lineno">13440</span>&#160;            json.EndString();</div><div class="line"><a name="l13441"></a><span class="lineno">13441</span>&#160;                </div><div class="line"><a name="l13442"></a><span class="lineno">13442</span>&#160;            json.BeginArray();</div><div class="line"><a name="l13443"></a><span class="lineno">13443</span>&#160;</div><div class="line"><a name="l13444"></a><span class="lineno">13444</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="l13445"></a><span class="lineno">13445</span>&#160;            {</div><div class="line"><a name="l13446"></a><span class="lineno">13446</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l13447"></a><span class="lineno">13447</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="l13448"></a><span class="lineno">13448</span>&#160;                hAlloc-&gt;PrintParameters(json);</div><div class="line"><a name="l13449"></a><span class="lineno">13449</span>&#160;                json.EndObject();</div><div class="line"><a name="l13450"></a><span class="lineno">13450</span>&#160;            }</div><div class="line"><a name="l13451"></a><span class="lineno">13451</span>&#160;</div><div class="line"><a name="l13452"></a><span class="lineno">13452</span>&#160;            json.EndArray();</div><div class="line"><a name="l13453"></a><span class="lineno">13453</span>&#160;        }</div><div class="line"><a name="l13454"></a><span class="lineno">13454</span>&#160;    }</div><div class="line"><a name="l13455"></a><span class="lineno">13455</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div><div class="line"><a name="l13456"></a><span class="lineno">13456</span>&#160;    {</div><div class="line"><a name="l13457"></a><span class="lineno">13457</span>&#160;        json.EndObject();</div><div class="line"><a name="l13458"></a><span class="lineno">13458</span>&#160;    }</div><div class="line"><a name="l13459"></a><span class="lineno">13459</span>&#160;</div><div class="line"><a name="l13460"></a><span class="lineno">13460</span>&#160;    {</div><div class="line"><a name="l13461"></a><span class="lineno">13461</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l13462"></a><span class="lineno">13462</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l13463"></a><span class="lineno">13463</span>&#160;        {</div><div class="line"><a name="l13464"></a><span class="lineno">13464</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l13465"></a><span class="lineno">13465</span>&#160;            {</div><div class="line"><a name="l13466"></a><span class="lineno">13466</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l13467"></a><span class="lineno">13467</span>&#160;                {</div><div class="line"><a name="l13468"></a><span class="lineno">13468</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l13469"></a><span class="lineno">13469</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div><div class="line"><a name="l13470"></a><span class="lineno">13470</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l13471"></a><span class="lineno">13471</span>&#160;                }</div><div class="line"><a name="l13472"></a><span class="lineno">13472</span>&#160;</div><div class="line"><a name="l13473"></a><span class="lineno">13473</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l13474"></a><span class="lineno">13474</span>&#160;                json.ContinueString(memTypeIndex);</div><div class="line"><a name="l13475"></a><span class="lineno">13475</span>&#160;                json.EndString();</div><div class="line"><a name="l13476"></a><span class="lineno">13476</span>&#160;</div><div class="line"><a name="l13477"></a><span class="lineno">13477</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l13478"></a><span class="lineno">13478</span>&#160;            }</div><div class="line"><a name="l13479"></a><span class="lineno">13479</span>&#160;        }</div><div class="line"><a name="l13480"></a><span class="lineno">13480</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div><div class="line"><a name="l13481"></a><span class="lineno">13481</span>&#160;        {</div><div class="line"><a name="l13482"></a><span class="lineno">13482</span>&#160;            json.EndObject();</div><div class="line"><a name="l13483"></a><span class="lineno">13483</span>&#160;        }</div><div class="line"><a name="l13484"></a><span class="lineno">13484</span>&#160;    }</div><div class="line"><a name="l13485"></a><span class="lineno">13485</span>&#160;</div><div class="line"><a name="l13486"></a><span class="lineno">13486</span>&#160;    <span class="comment">// Custom pools</span></div><div class="line"><a name="l13487"></a><span class="lineno">13487</span>&#160;    {</div><div class="line"><a name="l13488"></a><span class="lineno">13488</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l13489"></a><span class="lineno">13489</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l13490"></a><span class="lineno">13490</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div><div class="line"><a name="l13491"></a><span class="lineno">13491</span>&#160;        {</div><div class="line"><a name="l13492"></a><span class="lineno">13492</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div><div class="line"><a name="l13493"></a><span class="lineno">13493</span>&#160;            json.BeginObject();</div><div class="line"><a name="l13494"></a><span class="lineno">13494</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="l13495"></a><span class="lineno">13495</span>&#160;            {</div><div class="line"><a name="l13496"></a><span class="lineno">13496</span>&#160;                json.BeginString();</div><div class="line"><a name="l13497"></a><span class="lineno">13497</span>&#160;                json.ContinueString(m_Pools[poolIndex]-&gt;GetId());</div><div class="line"><a name="l13498"></a><span class="lineno">13498</span>&#160;                json.EndString();</div><div class="line"><a name="l13499"></a><span class="lineno">13499</span>&#160;</div><div class="line"><a name="l13500"></a><span class="lineno">13500</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div><div class="line"><a name="l13501"></a><span class="lineno">13501</span>&#160;            }</div><div class="line"><a name="l13502"></a><span class="lineno">13502</span>&#160;            json.EndObject();</div><div class="line"><a name="l13503"></a><span class="lineno">13503</span>&#160;        }</div><div class="line"><a name="l13504"></a><span class="lineno">13504</span>&#160;    }</div><div class="line"><a name="l13505"></a><span class="lineno">13505</span>&#160;}</div><div class="line"><a name="l13506"></a><span class="lineno">13506</span>&#160;</div><div class="line"><a name="l13507"></a><span class="lineno">13507</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l13508"></a><span class="lineno">13508</span>&#160;</div><div class="line"><a name="l13510"></a><span class="lineno">13510</span>&#160;<span class="comment">// Public interface</span></div><div class="line"><a name="l13511"></a><span class="lineno">13511</span>&#160;</div><div class="line"><a name="l13512"></a><span class="lineno">13512</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l13513"></a><span class="lineno">13513</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="l13514"></a><span class="lineno">13514</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div><div class="line"><a name="l13515"></a><span class="lineno">13515</span>&#160;{</div><div class="line"><a name="l13516"></a><span class="lineno">13516</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div><div class="line"><a name="l13517"></a><span class="lineno">13517</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div><div class="line"><a name="l13518"></a><span class="lineno">13518</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="l13519"></a><span class="lineno">13519</span>&#160;    <span class="keywordflow">return</span> (*pAllocator)-&gt;Init(pCreateInfo);</div><div class="line"><a name="l13520"></a><span class="lineno">13520</span>&#160;}</div><div class="line"><a name="l13521"></a><span class="lineno">13521</span>&#160;</div><div class="line"><a name="l13522"></a><span class="lineno">13522</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="l13523"></a><span class="lineno">13523</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l13524"></a><span class="lineno">13524</span>&#160;{</div><div class="line"><a name="l13525"></a><span class="lineno">13525</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div><div class="line"><a name="l13526"></a><span class="lineno">13526</span>&#160;    {</div><div class="line"><a name="l13527"></a><span class="lineno">13527</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div><div class="line"><a name="l13528"></a><span class="lineno">13528</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div><div class="line"><a name="l13529"></a><span class="lineno">13529</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div><div class="line"><a name="l13530"></a><span class="lineno">13530</span>&#160;    }</div><div class="line"><a name="l13531"></a><span class="lineno">13531</span>&#160;}</div><div class="line"><a name="l13532"></a><span class="lineno">13532</span>&#160;</div><div class="line"><a name="l13533"></a><span class="lineno">13533</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="l13534"></a><span class="lineno">13534</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13535"></a><span class="lineno">13535</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div><div class="line"><a name="l13536"></a><span class="lineno">13536</span>&#160;{</div><div class="line"><a name="l13537"></a><span class="lineno">13537</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div><div class="line"><a name="l13538"></a><span class="lineno">13538</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div><div class="line"><a name="l13539"></a><span class="lineno">13539</span>&#160;}</div><div class="line"><a name="l13540"></a><span class="lineno">13540</span>&#160;</div><div class="line"><a name="l13541"></a><span class="lineno">13541</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="l13542"></a><span class="lineno">13542</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13543"></a><span class="lineno">13543</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div><div class="line"><a name="l13544"></a><span class="lineno">13544</span>&#160;{</div><div class="line"><a name="l13545"></a><span class="lineno">13545</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l13546"></a><span class="lineno">13546</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div><div class="line"><a name="l13547"></a><span class="lineno">13547</span>&#160;}</div><div class="line"><a name="l13548"></a><span class="lineno">13548</span>&#160;</div><div class="line"><a name="l13549"></a><span class="lineno">13549</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="l13550"></a><span class="lineno">13550</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13551"></a><span class="lineno">13551</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l13552"></a><span class="lineno">13552</span>&#160;    VkMemoryPropertyFlags* pFlags)</div><div class="line"><a name="l13553"></a><span class="lineno">13553</span>&#160;{</div><div class="line"><a name="l13554"></a><span class="lineno">13554</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div><div class="line"><a name="l13555"></a><span class="lineno">13555</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div><div class="line"><a name="l13556"></a><span class="lineno">13556</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div><div class="line"><a name="l13557"></a><span class="lineno">13557</span>&#160;}</div><div class="line"><a name="l13558"></a><span class="lineno">13558</span>&#160;</div><div class="line"><a name="l13559"></a><span class="lineno">13559</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="l13560"></a><span class="lineno">13560</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13561"></a><span class="lineno">13561</span>&#160;    uint32_t frameIndex)</div><div class="line"><a name="l13562"></a><span class="lineno">13562</span>&#160;{</div><div class="line"><a name="l13563"></a><span class="lineno">13563</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l13564"></a><span class="lineno">13564</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l13565"></a><span class="lineno">13565</span>&#160;</div><div class="line"><a name="l13566"></a><span class="lineno">13566</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13567"></a><span class="lineno">13567</span>&#160;</div><div class="line"><a name="l13568"></a><span class="lineno">13568</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div><div class="line"><a name="l13569"></a><span class="lineno">13569</span>&#160;}</div><div class="line"><a name="l13570"></a><span class="lineno">13570</span>&#160;</div><div class="line"><a name="l13571"></a><span class="lineno">13571</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="l13572"></a><span class="lineno">13572</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13573"></a><span class="lineno">13573</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l13574"></a><span class="lineno">13574</span>&#160;{</div><div class="line"><a name="l13575"></a><span class="lineno">13575</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div><div class="line"><a name="l13576"></a><span class="lineno">13576</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13577"></a><span class="lineno">13577</span>&#160;    allocator-&gt;CalculateStats(pStats);</div><div class="line"><a name="l13578"></a><span class="lineno">13578</span>&#160;}</div><div class="line"><a name="l13579"></a><span class="lineno">13579</span>&#160;</div><div class="line"><a name="l13580"></a><span class="lineno">13580</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l13581"></a><span class="lineno">13581</span>&#160;</div><div class="line"><a name="l13582"></a><span class="lineno">13582</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="l13583"></a><span class="lineno">13583</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13584"></a><span class="lineno">13584</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l13585"></a><span class="lineno">13585</span>&#160;    VkBool32 detailedMap)</div><div class="line"><a name="l13586"></a><span class="lineno">13586</span>&#160;{</div><div class="line"><a name="l13587"></a><span class="lineno">13587</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div><div class="line"><a name="l13588"></a><span class="lineno">13588</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13589"></a><span class="lineno">13589</span>&#160;</div><div class="line"><a name="l13590"></a><span class="lineno">13590</span>&#160;    VmaStringBuilder sb(allocator);</div><div class="line"><a name="l13591"></a><span class="lineno">13591</span>&#160;    {</div><div class="line"><a name="l13592"></a><span class="lineno">13592</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div><div class="line"><a name="l13593"></a><span class="lineno">13593</span>&#160;        json.BeginObject();</div><div class="line"><a name="l13594"></a><span class="lineno">13594</span>&#160;</div><div class="line"><a name="l13595"></a><span class="lineno">13595</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div><div class="line"><a name="l13596"></a><span class="lineno">13596</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div><div class="line"><a name="l13597"></a><span class="lineno">13597</span>&#160;</div><div class="line"><a name="l13598"></a><span class="lineno">13598</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div><div class="line"><a name="l13599"></a><span class="lineno">13599</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l13600"></a><span class="lineno">13600</span>&#160;    </div><div class="line"><a name="l13601"></a><span class="lineno">13601</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l13602"></a><span class="lineno">13602</span>&#160;        {</div><div class="line"><a name="l13603"></a><span class="lineno">13603</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div><div class="line"><a name="l13604"></a><span class="lineno">13604</span>&#160;            json.ContinueString(heapIndex);</div><div class="line"><a name="l13605"></a><span class="lineno">13605</span>&#160;            json.EndString();</div><div class="line"><a name="l13606"></a><span class="lineno">13606</span>&#160;            json.BeginObject();</div><div class="line"><a name="l13607"></a><span class="lineno">13607</span>&#160;</div><div class="line"><a name="l13608"></a><span class="lineno">13608</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l13609"></a><span class="lineno">13609</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div><div class="line"><a name="l13610"></a><span class="lineno">13610</span>&#160;</div><div class="line"><a name="l13611"></a><span class="lineno">13611</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l13612"></a><span class="lineno">13612</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l13613"></a><span class="lineno">13613</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="l13614"></a><span class="lineno">13614</span>&#160;            {</div><div class="line"><a name="l13615"></a><span class="lineno">13615</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l13616"></a><span class="lineno">13616</span>&#160;            }</div><div class="line"><a name="l13617"></a><span class="lineno">13617</span>&#160;            json.EndArray();</div><div class="line"><a name="l13618"></a><span class="lineno">13618</span>&#160;</div><div class="line"><a name="l13619"></a><span class="lineno">13619</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="l13620"></a><span class="lineno">13620</span>&#160;            {</div><div class="line"><a name="l13621"></a><span class="lineno">13621</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l13622"></a><span class="lineno">13622</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div><div class="line"><a name="l13623"></a><span class="lineno">13623</span>&#160;            }</div><div class="line"><a name="l13624"></a><span class="lineno">13624</span>&#160;</div><div class="line"><a name="l13625"></a><span class="lineno">13625</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div><div class="line"><a name="l13626"></a><span class="lineno">13626</span>&#160;            {</div><div class="line"><a name="l13627"></a><span class="lineno">13627</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div><div class="line"><a name="l13628"></a><span class="lineno">13628</span>&#160;                {</div><div class="line"><a name="l13629"></a><span class="lineno">13629</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l13630"></a><span class="lineno">13630</span>&#160;                    json.ContinueString(typeIndex);</div><div class="line"><a name="l13631"></a><span class="lineno">13631</span>&#160;                    json.EndString();</div><div class="line"><a name="l13632"></a><span class="lineno">13632</span>&#160;</div><div class="line"><a name="l13633"></a><span class="lineno">13633</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l13634"></a><span class="lineno">13634</span>&#160;</div><div class="line"><a name="l13635"></a><span class="lineno">13635</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l13636"></a><span class="lineno">13636</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l13637"></a><span class="lineno">13637</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div><div class="line"><a name="l13638"></a><span class="lineno">13638</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l13639"></a><span class="lineno">13639</span>&#160;                    {</div><div class="line"><a name="l13640"></a><span class="lineno">13640</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l13641"></a><span class="lineno">13641</span>&#160;                    }</div><div class="line"><a name="l13642"></a><span class="lineno">13642</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l13643"></a><span class="lineno">13643</span>&#160;                    {</div><div class="line"><a name="l13644"></a><span class="lineno">13644</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div><div class="line"><a name="l13645"></a><span class="lineno">13645</span>&#160;                    }</div><div class="line"><a name="l13646"></a><span class="lineno">13646</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div><div class="line"><a name="l13647"></a><span class="lineno">13647</span>&#160;                    {</div><div class="line"><a name="l13648"></a><span class="lineno">13648</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div><div class="line"><a name="l13649"></a><span class="lineno">13649</span>&#160;                    }</div><div class="line"><a name="l13650"></a><span class="lineno">13650</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div><div class="line"><a name="l13651"></a><span class="lineno">13651</span>&#160;                    {</div><div class="line"><a name="l13652"></a><span class="lineno">13652</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div><div class="line"><a name="l13653"></a><span class="lineno">13653</span>&#160;                    }</div><div class="line"><a name="l13654"></a><span class="lineno">13654</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div><div class="line"><a name="l13655"></a><span class="lineno">13655</span>&#160;                    {</div><div class="line"><a name="l13656"></a><span class="lineno">13656</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div><div class="line"><a name="l13657"></a><span class="lineno">13657</span>&#160;                    }</div><div class="line"><a name="l13658"></a><span class="lineno">13658</span>&#160;                    json.EndArray();</div><div class="line"><a name="l13659"></a><span class="lineno">13659</span>&#160;</div><div class="line"><a name="l13660"></a><span class="lineno">13660</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="l13661"></a><span class="lineno">13661</span>&#160;                    {</div><div class="line"><a name="l13662"></a><span class="lineno">13662</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l13663"></a><span class="lineno">13663</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div><div class="line"><a name="l13664"></a><span class="lineno">13664</span>&#160;                    }</div><div class="line"><a name="l13665"></a><span class="lineno">13665</span>&#160;</div><div class="line"><a name="l13666"></a><span class="lineno">13666</span>&#160;                    json.EndObject();</div><div class="line"><a name="l13667"></a><span class="lineno">13667</span>&#160;                }</div><div class="line"><a name="l13668"></a><span class="lineno">13668</span>&#160;            }</div><div class="line"><a name="l13669"></a><span class="lineno">13669</span>&#160;</div><div class="line"><a name="l13670"></a><span class="lineno">13670</span>&#160;            json.EndObject();</div><div class="line"><a name="l13671"></a><span class="lineno">13671</span>&#160;        }</div><div class="line"><a name="l13672"></a><span class="lineno">13672</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div><div class="line"><a name="l13673"></a><span class="lineno">13673</span>&#160;        {</div><div class="line"><a name="l13674"></a><span class="lineno">13674</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l13675"></a><span class="lineno">13675</span>&#160;        }</div><div class="line"><a name="l13676"></a><span class="lineno">13676</span>&#160;</div><div class="line"><a name="l13677"></a><span class="lineno">13677</span>&#160;        json.EndObject();</div><div class="line"><a name="l13678"></a><span class="lineno">13678</span>&#160;    }</div><div class="line"><a name="l13679"></a><span class="lineno">13679</span>&#160;</div><div class="line"><a name="l13680"></a><span class="lineno">13680</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div><div class="line"><a name="l13681"></a><span class="lineno">13681</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="l13682"></a><span class="lineno">13682</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div><div class="line"><a name="l13683"></a><span class="lineno">13683</span>&#160;    {</div><div class="line"><a name="l13684"></a><span class="lineno">13684</span>&#160;        memcpy(pChars, sb.GetData(), len);</div><div class="line"><a name="l13685"></a><span class="lineno">13685</span>&#160;    }</div><div class="line"><a name="l13686"></a><span class="lineno">13686</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l13687"></a><span class="lineno">13687</span>&#160;    *ppStatsString = pChars;</div><div class="line"><a name="l13688"></a><span class="lineno">13688</span>&#160;}</div><div class="line"><a name="l13689"></a><span class="lineno">13689</span>&#160;</div><div class="line"><a name="l13690"></a><span class="lineno">13690</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="l13691"></a><span class="lineno">13691</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13692"></a><span class="lineno">13692</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div><div class="line"><a name="l13693"></a><span class="lineno">13693</span>&#160;{</div><div class="line"><a name="l13694"></a><span class="lineno">13694</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div><div class="line"><a name="l13695"></a><span class="lineno">13695</span>&#160;    {</div><div class="line"><a name="l13696"></a><span class="lineno">13696</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l13697"></a><span class="lineno">13697</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div><div class="line"><a name="l13698"></a><span class="lineno">13698</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div><div class="line"><a name="l13699"></a><span class="lineno">13699</span>&#160;    }</div><div class="line"><a name="l13700"></a><span class="lineno">13700</span>&#160;}</div><div class="line"><a name="l13701"></a><span class="lineno">13701</span>&#160;</div><div class="line"><a name="l13702"></a><span class="lineno">13702</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l13703"></a><span class="lineno">13703</span>&#160;</div><div class="line"><a name="l13704"></a><span class="lineno">13704</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l13705"></a><span class="lineno">13705</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="l13706"></a><span class="lineno">13706</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l13707"></a><span class="lineno">13707</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l13708"></a><span class="lineno">13708</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13709"></a><span class="lineno">13709</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l13710"></a><span class="lineno">13710</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="l13711"></a><span class="lineno">13711</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l13712"></a><span class="lineno">13712</span>&#160;{</div><div class="line"><a name="l13713"></a><span class="lineno">13713</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l13714"></a><span class="lineno">13714</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l13715"></a><span class="lineno">13715</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l13716"></a><span class="lineno">13716</span>&#160;</div><div class="line"><a name="l13717"></a><span class="lineno">13717</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="l13718"></a><span class="lineno">13718</span>&#160;    {</div><div class="line"><a name="l13719"></a><span class="lineno">13719</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="l13720"></a><span class="lineno">13720</span>&#160;    }</div><div class="line"><a name="l13721"></a><span class="lineno">13721</span>&#160;    </div><div class="line"><a name="l13722"></a><span class="lineno">13722</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="l13723"></a><span class="lineno">13723</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="l13724"></a><span class="lineno">13724</span>&#160;</div><div class="line"><a name="l13725"></a><span class="lineno">13725</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (pAllocationCreateInfo-&gt;<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="l13726"></a><span class="lineno">13726</span>&#160;    <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l13727"></a><span class="lineno">13727</span>&#160;    {</div><div class="line"><a name="l13728"></a><span class="lineno">13728</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l13729"></a><span class="lineno">13729</span>&#160;    }</div><div class="line"><a name="l13730"></a><span class="lineno">13730</span>&#160;</div><div class="line"><a name="l13731"></a><span class="lineno">13731</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div><div class="line"><a name="l13732"></a><span class="lineno">13732</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="l13733"></a><span class="lineno">13733</span>&#160;    {</div><div class="line"><a name="l13734"></a><span class="lineno">13734</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="l13735"></a><span class="lineno">13735</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13736"></a><span class="lineno">13736</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="l13737"></a><span class="lineno">13737</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l13738"></a><span class="lineno">13738</span>&#160;        {</div><div class="line"><a name="l13739"></a><span class="lineno">13739</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l13740"></a><span class="lineno">13740</span>&#160;        }</div><div class="line"><a name="l13741"></a><span class="lineno">13741</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13742"></a><span class="lineno">13742</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="l13743"></a><span class="lineno">13743</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l13744"></a><span class="lineno">13744</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13745"></a><span class="lineno">13745</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="l13746"></a><span class="lineno">13746</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l13747"></a><span class="lineno">13747</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l13748"></a><span class="lineno">13748</span>&#160;        {</div><div class="line"><a name="l13749"></a><span class="lineno">13749</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l13750"></a><span class="lineno">13750</span>&#160;        }</div><div class="line"><a name="l13751"></a><span class="lineno">13751</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13752"></a><span class="lineno">13752</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="l13753"></a><span class="lineno">13753</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l13754"></a><span class="lineno">13754</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line"><a name="l13755"></a><span class="lineno">13755</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13756"></a><span class="lineno">13756</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13757"></a><span class="lineno">13757</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13758"></a><span class="lineno">13758</span>&#160;    }</div><div class="line"><a name="l13759"></a><span class="lineno">13759</span>&#160;</div><div class="line"><a name="l13760"></a><span class="lineno">13760</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div><div class="line"><a name="l13761"></a><span class="lineno">13761</span>&#160;    uint32_t minCost = UINT32_MAX;</div><div class="line"><a name="l13762"></a><span class="lineno">13762</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div><div class="line"><a name="l13763"></a><span class="lineno">13763</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div><div class="line"><a name="l13764"></a><span class="lineno">13764</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div><div class="line"><a name="l13765"></a><span class="lineno">13765</span>&#160;    {</div><div class="line"><a name="l13766"></a><span class="lineno">13766</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div><div class="line"><a name="l13767"></a><span class="lineno">13767</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l13768"></a><span class="lineno">13768</span>&#160;        {</div><div class="line"><a name="l13769"></a><span class="lineno">13769</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div><div class="line"><a name="l13770"></a><span class="lineno">13770</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div><div class="line"><a name="l13771"></a><span class="lineno">13771</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div><div class="line"><a name="l13772"></a><span class="lineno">13772</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div><div class="line"><a name="l13773"></a><span class="lineno">13773</span>&#160;            {</div><div class="line"><a name="l13774"></a><span class="lineno">13774</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="l13775"></a><span class="lineno">13775</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags);</div><div class="line"><a name="l13776"></a><span class="lineno">13776</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div><div class="line"><a name="l13777"></a><span class="lineno">13777</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div><div class="line"><a name="l13778"></a><span class="lineno">13778</span>&#160;                {</div><div class="line"><a name="l13779"></a><span class="lineno">13779</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l13780"></a><span class="lineno">13780</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div><div class="line"><a name="l13781"></a><span class="lineno">13781</span>&#160;                    {</div><div class="line"><a name="l13782"></a><span class="lineno">13782</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l13783"></a><span class="lineno">13783</span>&#160;                    }</div><div class="line"><a name="l13784"></a><span class="lineno">13784</span>&#160;                    minCost = currCost;</div><div class="line"><a name="l13785"></a><span class="lineno">13785</span>&#160;                }</div><div class="line"><a name="l13786"></a><span class="lineno">13786</span>&#160;            }</div><div class="line"><a name="l13787"></a><span class="lineno">13787</span>&#160;        }</div><div class="line"><a name="l13788"></a><span class="lineno">13788</span>&#160;    }</div><div class="line"><a name="l13789"></a><span class="lineno">13789</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l13790"></a><span class="lineno">13790</span>&#160;}</div><div class="line"><a name="l13791"></a><span class="lineno">13791</span>&#160;</div><div class="line"><a name="l13792"></a><span class="lineno">13792</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l13793"></a><span class="lineno">13793</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13794"></a><span class="lineno">13794</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l13795"></a><span class="lineno">13795</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="l13796"></a><span class="lineno">13796</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l13797"></a><span class="lineno">13797</span>&#160;{</div><div class="line"><a name="l13798"></a><span class="lineno">13798</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l13799"></a><span class="lineno">13799</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div><div class="line"><a name="l13800"></a><span class="lineno">13800</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l13801"></a><span class="lineno">13801</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l13802"></a><span class="lineno">13802</span>&#160;</div><div class="line"><a name="l13803"></a><span class="lineno">13803</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l13804"></a><span class="lineno">13804</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l13805"></a><span class="lineno">13805</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div><div class="line"><a name="l13806"></a><span class="lineno">13806</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div><div class="line"><a name="l13807"></a><span class="lineno">13807</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13808"></a><span class="lineno">13808</span>&#160;    {</div><div class="line"><a name="l13809"></a><span class="lineno">13809</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l13810"></a><span class="lineno">13810</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div><div class="line"><a name="l13811"></a><span class="lineno">13811</span>&#160;            hDev, hBuffer, &amp;memReq);</div><div class="line"><a name="l13812"></a><span class="lineno">13812</span>&#160;</div><div class="line"><a name="l13813"></a><span class="lineno">13813</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l13814"></a><span class="lineno">13814</span>&#160;            allocator,</div><div class="line"><a name="l13815"></a><span class="lineno">13815</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l13816"></a><span class="lineno">13816</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l13817"></a><span class="lineno">13817</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l13818"></a><span class="lineno">13818</span>&#160;</div><div class="line"><a name="l13819"></a><span class="lineno">13819</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div><div class="line"><a name="l13820"></a><span class="lineno">13820</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l13821"></a><span class="lineno">13821</span>&#160;    }</div><div class="line"><a name="l13822"></a><span class="lineno">13822</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13823"></a><span class="lineno">13823</span>&#160;}</div><div class="line"><a name="l13824"></a><span class="lineno">13824</span>&#160;</div><div class="line"><a name="l13825"></a><span class="lineno">13825</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l13826"></a><span class="lineno">13826</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13827"></a><span class="lineno">13827</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l13828"></a><span class="lineno">13828</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="l13829"></a><span class="lineno">13829</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l13830"></a><span class="lineno">13830</span>&#160;{</div><div class="line"><a name="l13831"></a><span class="lineno">13831</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l13832"></a><span class="lineno">13832</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div><div class="line"><a name="l13833"></a><span class="lineno">13833</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l13834"></a><span class="lineno">13834</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l13835"></a><span class="lineno">13835</span>&#160;</div><div class="line"><a name="l13836"></a><span class="lineno">13836</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l13837"></a><span class="lineno">13837</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div><div class="line"><a name="l13838"></a><span class="lineno">13838</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div><div class="line"><a name="l13839"></a><span class="lineno">13839</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div><div class="line"><a name="l13840"></a><span class="lineno">13840</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13841"></a><span class="lineno">13841</span>&#160;    {</div><div class="line"><a name="l13842"></a><span class="lineno">13842</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l13843"></a><span class="lineno">13843</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div><div class="line"><a name="l13844"></a><span class="lineno">13844</span>&#160;            hDev, hImage, &amp;memReq);</div><div class="line"><a name="l13845"></a><span class="lineno">13845</span>&#160;</div><div class="line"><a name="l13846"></a><span class="lineno">13846</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l13847"></a><span class="lineno">13847</span>&#160;            allocator,</div><div class="line"><a name="l13848"></a><span class="lineno">13848</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l13849"></a><span class="lineno">13849</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l13850"></a><span class="lineno">13850</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l13851"></a><span class="lineno">13851</span>&#160;</div><div class="line"><a name="l13852"></a><span class="lineno">13852</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div><div class="line"><a name="l13853"></a><span class="lineno">13853</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l13854"></a><span class="lineno">13854</span>&#160;    }</div><div class="line"><a name="l13855"></a><span class="lineno">13855</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13856"></a><span class="lineno">13856</span>&#160;}</div><div class="line"><a name="l13857"></a><span class="lineno">13857</span>&#160;</div><div class="line"><a name="l13858"></a><span class="lineno">13858</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l13859"></a><span class="lineno">13859</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13860"></a><span class="lineno">13860</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="l13861"></a><span class="lineno">13861</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l13862"></a><span class="lineno">13862</span>&#160;{</div><div class="line"><a name="l13863"></a><span class="lineno">13863</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div><div class="line"><a name="l13864"></a><span class="lineno">13864</span>&#160;    </div><div class="line"><a name="l13865"></a><span class="lineno">13865</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div><div class="line"><a name="l13866"></a><span class="lineno">13866</span>&#160;    </div><div class="line"><a name="l13867"></a><span class="lineno">13867</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13868"></a><span class="lineno">13868</span>&#160;    </div><div class="line"><a name="l13869"></a><span class="lineno">13869</span>&#160;    VkResult res = allocator-&gt;CreatePool(pCreateInfo, pPool);</div><div class="line"><a name="l13870"></a><span class="lineno">13870</span>&#160;    </div><div class="line"><a name="l13871"></a><span class="lineno">13871</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13872"></a><span class="lineno">13872</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13873"></a><span class="lineno">13873</span>&#160;    {</div><div class="line"><a name="l13874"></a><span class="lineno">13874</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreatePool(allocator-&gt;GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div><div class="line"><a name="l13875"></a><span class="lineno">13875</span>&#160;    }</div><div class="line"><a name="l13876"></a><span class="lineno">13876</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13877"></a><span class="lineno">13877</span>&#160;    </div><div class="line"><a name="l13878"></a><span class="lineno">13878</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13879"></a><span class="lineno">13879</span>&#160;}</div><div class="line"><a name="l13880"></a><span class="lineno">13880</span>&#160;</div><div class="line"><a name="l13881"></a><span class="lineno">13881</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="l13882"></a><span class="lineno">13882</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13883"></a><span class="lineno">13883</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l13884"></a><span class="lineno">13884</span>&#160;{</div><div class="line"><a name="l13885"></a><span class="lineno">13885</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l13886"></a><span class="lineno">13886</span>&#160;    </div><div class="line"><a name="l13887"></a><span class="lineno">13887</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div><div class="line"><a name="l13888"></a><span class="lineno">13888</span>&#160;    {</div><div class="line"><a name="l13889"></a><span class="lineno">13889</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l13890"></a><span class="lineno">13890</span>&#160;    }</div><div class="line"><a name="l13891"></a><span class="lineno">13891</span>&#160;    </div><div class="line"><a name="l13892"></a><span class="lineno">13892</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div><div class="line"><a name="l13893"></a><span class="lineno">13893</span>&#160;    </div><div class="line"><a name="l13894"></a><span class="lineno">13894</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13895"></a><span class="lineno">13895</span>&#160;    </div><div class="line"><a name="l13896"></a><span class="lineno">13896</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13897"></a><span class="lineno">13897</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13898"></a><span class="lineno">13898</span>&#160;    {</div><div class="line"><a name="l13899"></a><span class="lineno">13899</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyPool(allocator-&gt;GetCurrentFrameIndex(), pool);</div><div class="line"><a name="l13900"></a><span class="lineno">13900</span>&#160;    }</div><div class="line"><a name="l13901"></a><span class="lineno">13901</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13902"></a><span class="lineno">13902</span>&#160;</div><div class="line"><a name="l13903"></a><span class="lineno">13903</span>&#160;    allocator-&gt;DestroyPool(pool);</div><div class="line"><a name="l13904"></a><span class="lineno">13904</span>&#160;}</div><div class="line"><a name="l13905"></a><span class="lineno">13905</span>&#160;</div><div class="line"><a name="l13906"></a><span class="lineno">13906</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="l13907"></a><span class="lineno">13907</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13908"></a><span class="lineno">13908</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l13909"></a><span class="lineno">13909</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l13910"></a><span class="lineno">13910</span>&#160;{</div><div class="line"><a name="l13911"></a><span class="lineno">13911</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div><div class="line"><a name="l13912"></a><span class="lineno">13912</span>&#160;</div><div class="line"><a name="l13913"></a><span class="lineno">13913</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13914"></a><span class="lineno">13914</span>&#160;</div><div class="line"><a name="l13915"></a><span class="lineno">13915</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div><div class="line"><a name="l13916"></a><span class="lineno">13916</span>&#160;}</div><div class="line"><a name="l13917"></a><span class="lineno">13917</span>&#160;</div><div class="line"><a name="l13918"></a><span class="lineno">13918</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="l13919"></a><span class="lineno">13919</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13920"></a><span class="lineno">13920</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l13921"></a><span class="lineno">13921</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l13922"></a><span class="lineno">13922</span>&#160;{</div><div class="line"><a name="l13923"></a><span class="lineno">13923</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l13924"></a><span class="lineno">13924</span>&#160;</div><div class="line"><a name="l13925"></a><span class="lineno">13925</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13926"></a><span class="lineno">13926</span>&#160;</div><div class="line"><a name="l13927"></a><span class="lineno">13927</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13928"></a><span class="lineno">13928</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13929"></a><span class="lineno">13929</span>&#160;    {</div><div class="line"><a name="l13930"></a><span class="lineno">13930</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMakePoolAllocationsLost(allocator-&gt;GetCurrentFrameIndex(), pool);</div><div class="line"><a name="l13931"></a><span class="lineno">13931</span>&#160;    }</div><div class="line"><a name="l13932"></a><span class="lineno">13932</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13933"></a><span class="lineno">13933</span>&#160;</div><div class="line"><a name="l13934"></a><span class="lineno">13934</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div><div class="line"><a name="l13935"></a><span class="lineno">13935</span>&#160;}</div><div class="line"><a name="l13936"></a><span class="lineno">13936</span>&#160;</div><div class="line"><a name="l13937"></a><span class="lineno">13937</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l13938"></a><span class="lineno">13938</span>&#160;{</div><div class="line"><a name="l13939"></a><span class="lineno">13939</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l13940"></a><span class="lineno">13940</span>&#160;</div><div class="line"><a name="l13941"></a><span class="lineno">13941</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13942"></a><span class="lineno">13942</span>&#160;</div><div class="line"><a name="l13943"></a><span class="lineno">13943</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckPoolCorruption&quot;</span>);</div><div class="line"><a name="l13944"></a><span class="lineno">13944</span>&#160;</div><div class="line"><a name="l13945"></a><span class="lineno">13945</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckPoolCorruption(pool);</div><div class="line"><a name="l13946"></a><span class="lineno">13946</span>&#160;}</div><div class="line"><a name="l13947"></a><span class="lineno">13947</span>&#160;</div><div class="line"><a name="l13948"></a><span class="lineno">13948</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l13949"></a><span class="lineno">13949</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13950"></a><span class="lineno">13950</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l13951"></a><span class="lineno">13951</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="l13952"></a><span class="lineno">13952</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l13953"></a><span class="lineno">13953</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l13954"></a><span class="lineno">13954</span>&#160;{</div><div class="line"><a name="l13955"></a><span class="lineno">13955</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l13956"></a><span class="lineno">13956</span>&#160;</div><div class="line"><a name="l13957"></a><span class="lineno">13957</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div><div class="line"><a name="l13958"></a><span class="lineno">13958</span>&#160;</div><div class="line"><a name="l13959"></a><span class="lineno">13959</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13960"></a><span class="lineno">13960</span>&#160;</div><div class="line"><a name="l13961"></a><span class="lineno">13961</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l13962"></a><span class="lineno">13962</span>&#160;        *pVkMemoryRequirements,</div><div class="line"><a name="l13963"></a><span class="lineno">13963</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div><div class="line"><a name="l13964"></a><span class="lineno">13964</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div><div class="line"><a name="l13965"></a><span class="lineno">13965</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l13966"></a><span class="lineno">13966</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l13967"></a><span class="lineno">13967</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l13968"></a><span class="lineno">13968</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div><div class="line"><a name="l13969"></a><span class="lineno">13969</span>&#160;        pAllocation);</div><div class="line"><a name="l13970"></a><span class="lineno">13970</span>&#160;</div><div class="line"><a name="l13971"></a><span class="lineno">13971</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13972"></a><span class="lineno">13972</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13973"></a><span class="lineno">13973</span>&#160;    {</div><div class="line"><a name="l13974"></a><span class="lineno">13974</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemory(</div><div class="line"><a name="l13975"></a><span class="lineno">13975</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l13976"></a><span class="lineno">13976</span>&#160;            *pVkMemoryRequirements,</div><div class="line"><a name="l13977"></a><span class="lineno">13977</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l13978"></a><span class="lineno">13978</span>&#160;            *pAllocation);</div><div class="line"><a name="l13979"></a><span class="lineno">13979</span>&#160;    }</div><div class="line"><a name="l13980"></a><span class="lineno">13980</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13981"></a><span class="lineno">13981</span>&#160;        </div><div class="line"><a name="l13982"></a><span class="lineno">13982</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l13983"></a><span class="lineno">13983</span>&#160;    {</div><div class="line"><a name="l13984"></a><span class="lineno">13984</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l13985"></a><span class="lineno">13985</span>&#160;    }</div><div class="line"><a name="l13986"></a><span class="lineno">13986</span>&#160;</div><div class="line"><a name="l13987"></a><span class="lineno">13987</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l13988"></a><span class="lineno">13988</span>&#160;}</div><div class="line"><a name="l13989"></a><span class="lineno">13989</span>&#160;</div><div class="line"><a name="l13990"></a><span class="lineno">13990</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l13991"></a><span class="lineno">13991</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13992"></a><span class="lineno">13992</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l13993"></a><span class="lineno">13993</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="l13994"></a><span class="lineno">13994</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l13995"></a><span class="lineno">13995</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l13996"></a><span class="lineno">13996</span>&#160;{</div><div class="line"><a name="l13997"></a><span class="lineno">13997</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l13998"></a><span class="lineno">13998</span>&#160;</div><div class="line"><a name="l13999"></a><span class="lineno">13999</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div><div class="line"><a name="l14000"></a><span class="lineno">14000</span>&#160;</div><div class="line"><a name="l14001"></a><span class="lineno">14001</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14002"></a><span class="lineno">14002</span>&#160;</div><div class="line"><a name="l14003"></a><span class="lineno">14003</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l14004"></a><span class="lineno">14004</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14005"></a><span class="lineno">14005</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14006"></a><span class="lineno">14006</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div><div class="line"><a name="l14007"></a><span class="lineno">14007</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l14008"></a><span class="lineno">14008</span>&#160;        prefersDedicatedAllocation);</div><div class="line"><a name="l14009"></a><span class="lineno">14009</span>&#160;</div><div class="line"><a name="l14010"></a><span class="lineno">14010</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l14011"></a><span class="lineno">14011</span>&#160;        vkMemReq,</div><div class="line"><a name="l14012"></a><span class="lineno">14012</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l14013"></a><span class="lineno">14013</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l14014"></a><span class="lineno">14014</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l14015"></a><span class="lineno">14015</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l14016"></a><span class="lineno">14016</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l14017"></a><span class="lineno">14017</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l14018"></a><span class="lineno">14018</span>&#160;        pAllocation);</div><div class="line"><a name="l14019"></a><span class="lineno">14019</span>&#160;</div><div class="line"><a name="l14020"></a><span class="lineno">14020</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14021"></a><span class="lineno">14021</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14022"></a><span class="lineno">14022</span>&#160;    {</div><div class="line"><a name="l14023"></a><span class="lineno">14023</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForBuffer(</div><div class="line"><a name="l14024"></a><span class="lineno">14024</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14025"></a><span class="lineno">14025</span>&#160;            vkMemReq,</div><div class="line"><a name="l14026"></a><span class="lineno">14026</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l14027"></a><span class="lineno">14027</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l14028"></a><span class="lineno">14028</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l14029"></a><span class="lineno">14029</span>&#160;            *pAllocation);</div><div class="line"><a name="l14030"></a><span class="lineno">14030</span>&#160;    }</div><div class="line"><a name="l14031"></a><span class="lineno">14031</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14032"></a><span class="lineno">14032</span>&#160;</div><div class="line"><a name="l14033"></a><span class="lineno">14033</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l14034"></a><span class="lineno">14034</span>&#160;    {</div><div class="line"><a name="l14035"></a><span class="lineno">14035</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l14036"></a><span class="lineno">14036</span>&#160;    }</div><div class="line"><a name="l14037"></a><span class="lineno">14037</span>&#160;</div><div class="line"><a name="l14038"></a><span class="lineno">14038</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l14039"></a><span class="lineno">14039</span>&#160;}</div><div class="line"><a name="l14040"></a><span class="lineno">14040</span>&#160;</div><div class="line"><a name="l14041"></a><span class="lineno">14041</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l14042"></a><span class="lineno">14042</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14043"></a><span class="lineno">14043</span>&#160;    VkImage image,</div><div class="line"><a name="l14044"></a><span class="lineno">14044</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="l14045"></a><span class="lineno">14045</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l14046"></a><span class="lineno">14046</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l14047"></a><span class="lineno">14047</span>&#160;{</div><div class="line"><a name="l14048"></a><span class="lineno">14048</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l14049"></a><span class="lineno">14049</span>&#160;</div><div class="line"><a name="l14050"></a><span class="lineno">14050</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div><div class="line"><a name="l14051"></a><span class="lineno">14051</span>&#160;</div><div class="line"><a name="l14052"></a><span class="lineno">14052</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14053"></a><span class="lineno">14053</span>&#160;</div><div class="line"><a name="l14054"></a><span class="lineno">14054</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l14055"></a><span class="lineno">14055</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14056"></a><span class="lineno">14056</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l14057"></a><span class="lineno">14057</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div><div class="line"><a name="l14058"></a><span class="lineno">14058</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l14059"></a><span class="lineno">14059</span>&#160;</div><div class="line"><a name="l14060"></a><span class="lineno">14060</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l14061"></a><span class="lineno">14061</span>&#160;        vkMemReq,</div><div class="line"><a name="l14062"></a><span class="lineno">14062</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l14063"></a><span class="lineno">14063</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l14064"></a><span class="lineno">14064</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l14065"></a><span class="lineno">14065</span>&#160;        image, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l14066"></a><span class="lineno">14066</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l14067"></a><span class="lineno">14067</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div><div class="line"><a name="l14068"></a><span class="lineno">14068</span>&#160;        pAllocation);</div><div class="line"><a name="l14069"></a><span class="lineno">14069</span>&#160;</div><div class="line"><a name="l14070"></a><span class="lineno">14070</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14071"></a><span class="lineno">14071</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14072"></a><span class="lineno">14072</span>&#160;    {</div><div class="line"><a name="l14073"></a><span class="lineno">14073</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForImage(</div><div class="line"><a name="l14074"></a><span class="lineno">14074</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14075"></a><span class="lineno">14075</span>&#160;            vkMemReq,</div><div class="line"><a name="l14076"></a><span class="lineno">14076</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l14077"></a><span class="lineno">14077</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l14078"></a><span class="lineno">14078</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l14079"></a><span class="lineno">14079</span>&#160;            *pAllocation);</div><div class="line"><a name="l14080"></a><span class="lineno">14080</span>&#160;    }</div><div class="line"><a name="l14081"></a><span class="lineno">14081</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14082"></a><span class="lineno">14082</span>&#160;</div><div class="line"><a name="l14083"></a><span class="lineno">14083</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l14084"></a><span class="lineno">14084</span>&#160;    {</div><div class="line"><a name="l14085"></a><span class="lineno">14085</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l14086"></a><span class="lineno">14086</span>&#160;    }</div><div class="line"><a name="l14087"></a><span class="lineno">14087</span>&#160;</div><div class="line"><a name="l14088"></a><span class="lineno">14088</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l14089"></a><span class="lineno">14089</span>&#160;}</div><div class="line"><a name="l14090"></a><span class="lineno">14090</span>&#160;</div><div class="line"><a name="l14091"></a><span class="lineno">14091</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="l14092"></a><span class="lineno">14092</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14093"></a><span class="lineno">14093</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14094"></a><span class="lineno">14094</span>&#160;{</div><div class="line"><a name="l14095"></a><span class="lineno">14095</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l14096"></a><span class="lineno">14096</span>&#160;    </div><div class="line"><a name="l14097"></a><span class="lineno">14097</span>&#160;    <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l14098"></a><span class="lineno">14098</span>&#160;    {</div><div class="line"><a name="l14099"></a><span class="lineno">14099</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l14100"></a><span class="lineno">14100</span>&#160;    }</div><div class="line"><a name="l14101"></a><span class="lineno">14101</span>&#160;    </div><div class="line"><a name="l14102"></a><span class="lineno">14102</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div><div class="line"><a name="l14103"></a><span class="lineno">14103</span>&#160;    </div><div class="line"><a name="l14104"></a><span class="lineno">14104</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14105"></a><span class="lineno">14105</span>&#160;</div><div class="line"><a name="l14106"></a><span class="lineno">14106</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14107"></a><span class="lineno">14107</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14108"></a><span class="lineno">14108</span>&#160;    {</div><div class="line"><a name="l14109"></a><span class="lineno">14109</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemory(</div><div class="line"><a name="l14110"></a><span class="lineno">14110</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14111"></a><span class="lineno">14111</span>&#160;            allocation);</div><div class="line"><a name="l14112"></a><span class="lineno">14112</span>&#160;    }</div><div class="line"><a name="l14113"></a><span class="lineno">14113</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14114"></a><span class="lineno">14114</span>&#160;    </div><div class="line"><a name="l14115"></a><span class="lineno">14115</span>&#160;    allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l14116"></a><span class="lineno">14116</span>&#160;}</div><div class="line"><a name="l14117"></a><span class="lineno">14117</span>&#160;</div><div class="line"><a name="l14118"></a><span class="lineno">14118</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a>(</div><div class="line"><a name="l14119"></a><span class="lineno">14119</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14120"></a><span class="lineno">14120</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14121"></a><span class="lineno">14121</span>&#160;    VkDeviceSize newSize)</div><div class="line"><a name="l14122"></a><span class="lineno">14122</span>&#160;{</div><div class="line"><a name="l14123"></a><span class="lineno">14123</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14124"></a><span class="lineno">14124</span>&#160;    </div><div class="line"><a name="l14125"></a><span class="lineno">14125</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaResizeAllocation&quot;</span>);</div><div class="line"><a name="l14126"></a><span class="lineno">14126</span>&#160;    </div><div class="line"><a name="l14127"></a><span class="lineno">14127</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14128"></a><span class="lineno">14128</span>&#160;</div><div class="line"><a name="l14129"></a><span class="lineno">14129</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14130"></a><span class="lineno">14130</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14131"></a><span class="lineno">14131</span>&#160;    {</div><div class="line"><a name="l14132"></a><span class="lineno">14132</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordResizeAllocation(</div><div class="line"><a name="l14133"></a><span class="lineno">14133</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14134"></a><span class="lineno">14134</span>&#160;            allocation,</div><div class="line"><a name="l14135"></a><span class="lineno">14135</span>&#160;            newSize);</div><div class="line"><a name="l14136"></a><span class="lineno">14136</span>&#160;    }</div><div class="line"><a name="l14137"></a><span class="lineno">14137</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14138"></a><span class="lineno">14138</span>&#160;    </div><div class="line"><a name="l14139"></a><span class="lineno">14139</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;ResizeAllocation(allocation, newSize);</div><div class="line"><a name="l14140"></a><span class="lineno">14140</span>&#160;}</div><div class="line"><a name="l14141"></a><span class="lineno">14141</span>&#160;</div><div class="line"><a name="l14142"></a><span class="lineno">14142</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="l14143"></a><span class="lineno">14143</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14144"></a><span class="lineno">14144</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14145"></a><span class="lineno">14145</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l14146"></a><span class="lineno">14146</span>&#160;{</div><div class="line"><a name="l14147"></a><span class="lineno">14147</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div><div class="line"><a name="l14148"></a><span class="lineno">14148</span>&#160;</div><div class="line"><a name="l14149"></a><span class="lineno">14149</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14150"></a><span class="lineno">14150</span>&#160;</div><div class="line"><a name="l14151"></a><span class="lineno">14151</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14152"></a><span class="lineno">14152</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14153"></a><span class="lineno">14153</span>&#160;    {</div><div class="line"><a name="l14154"></a><span class="lineno">14154</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordGetAllocationInfo(</div><div class="line"><a name="l14155"></a><span class="lineno">14155</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14156"></a><span class="lineno">14156</span>&#160;            allocation);</div><div class="line"><a name="l14157"></a><span class="lineno">14157</span>&#160;    }</div><div class="line"><a name="l14158"></a><span class="lineno">14158</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14159"></a><span class="lineno">14159</span>&#160;</div><div class="line"><a name="l14160"></a><span class="lineno">14160</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div><div class="line"><a name="l14161"></a><span class="lineno">14161</span>&#160;}</div><div class="line"><a name="l14162"></a><span class="lineno">14162</span>&#160;</div><div class="line"><a name="l14163"></a><span class="lineno">14163</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l14164"></a><span class="lineno">14164</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14165"></a><span class="lineno">14165</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14166"></a><span class="lineno">14166</span>&#160;{</div><div class="line"><a name="l14167"></a><span class="lineno">14167</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14168"></a><span class="lineno">14168</span>&#160;</div><div class="line"><a name="l14169"></a><span class="lineno">14169</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14170"></a><span class="lineno">14170</span>&#160;</div><div class="line"><a name="l14171"></a><span class="lineno">14171</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14172"></a><span class="lineno">14172</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14173"></a><span class="lineno">14173</span>&#160;    {</div><div class="line"><a name="l14174"></a><span class="lineno">14174</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordTouchAllocation(</div><div class="line"><a name="l14175"></a><span class="lineno">14175</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14176"></a><span class="lineno">14176</span>&#160;            allocation);</div><div class="line"><a name="l14177"></a><span class="lineno">14177</span>&#160;    }</div><div class="line"><a name="l14178"></a><span class="lineno">14178</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14179"></a><span class="lineno">14179</span>&#160;</div><div class="line"><a name="l14180"></a><span class="lineno">14180</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div><div class="line"><a name="l14181"></a><span class="lineno">14181</span>&#160;}</div><div class="line"><a name="l14182"></a><span class="lineno">14182</span>&#160;</div><div class="line"><a name="l14183"></a><span class="lineno">14183</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="l14184"></a><span class="lineno">14184</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14185"></a><span class="lineno">14185</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14186"></a><span class="lineno">14186</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l14187"></a><span class="lineno">14187</span>&#160;{</div><div class="line"><a name="l14188"></a><span class="lineno">14188</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14189"></a><span class="lineno">14189</span>&#160;</div><div class="line"><a name="l14190"></a><span class="lineno">14190</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14191"></a><span class="lineno">14191</span>&#160;</div><div class="line"><a name="l14192"></a><span class="lineno">14192</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div><div class="line"><a name="l14193"></a><span class="lineno">14193</span>&#160;</div><div class="line"><a name="l14194"></a><span class="lineno">14194</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14195"></a><span class="lineno">14195</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14196"></a><span class="lineno">14196</span>&#160;    {</div><div class="line"><a name="l14197"></a><span class="lineno">14197</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetAllocationUserData(</div><div class="line"><a name="l14198"></a><span class="lineno">14198</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14199"></a><span class="lineno">14199</span>&#160;            allocation,</div><div class="line"><a name="l14200"></a><span class="lineno">14200</span>&#160;            pUserData);</div><div class="line"><a name="l14201"></a><span class="lineno">14201</span>&#160;    }</div><div class="line"><a name="l14202"></a><span class="lineno">14202</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14203"></a><span class="lineno">14203</span>&#160;}</div><div class="line"><a name="l14204"></a><span class="lineno">14204</span>&#160;</div><div class="line"><a name="l14205"></a><span class="lineno">14205</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="l14206"></a><span class="lineno">14206</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14207"></a><span class="lineno">14207</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l14208"></a><span class="lineno">14208</span>&#160;{</div><div class="line"><a name="l14209"></a><span class="lineno">14209</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div><div class="line"><a name="l14210"></a><span class="lineno">14210</span>&#160;</div><div class="line"><a name="l14211"></a><span class="lineno">14211</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div><div class="line"><a name="l14212"></a><span class="lineno">14212</span>&#160;</div><div class="line"><a name="l14213"></a><span class="lineno">14213</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div><div class="line"><a name="l14214"></a><span class="lineno">14214</span>&#160;</div><div class="line"><a name="l14215"></a><span class="lineno">14215</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14216"></a><span class="lineno">14216</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14217"></a><span class="lineno">14217</span>&#160;    {</div><div class="line"><a name="l14218"></a><span class="lineno">14218</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreateLostAllocation(</div><div class="line"><a name="l14219"></a><span class="lineno">14219</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14220"></a><span class="lineno">14220</span>&#160;            *pAllocation);</div><div class="line"><a name="l14221"></a><span class="lineno">14221</span>&#160;    }</div><div class="line"><a name="l14222"></a><span class="lineno">14222</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14223"></a><span class="lineno">14223</span>&#160;}</div><div class="line"><a name="l14224"></a><span class="lineno">14224</span>&#160;</div><div class="line"><a name="l14225"></a><span class="lineno">14225</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l14226"></a><span class="lineno">14226</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14227"></a><span class="lineno">14227</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14228"></a><span class="lineno">14228</span>&#160;    <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l14229"></a><span class="lineno">14229</span>&#160;{</div><div class="line"><a name="l14230"></a><span class="lineno">14230</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div><div class="line"><a name="l14231"></a><span class="lineno">14231</span>&#160;</div><div class="line"><a name="l14232"></a><span class="lineno">14232</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14233"></a><span class="lineno">14233</span>&#160;</div><div class="line"><a name="l14234"></a><span class="lineno">14234</span>&#160;    VkResult res = allocator-&gt;Map(allocation, ppData);</div><div class="line"><a name="l14235"></a><span class="lineno">14235</span>&#160;</div><div class="line"><a name="l14236"></a><span class="lineno">14236</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14237"></a><span class="lineno">14237</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14238"></a><span class="lineno">14238</span>&#160;    {</div><div class="line"><a name="l14239"></a><span class="lineno">14239</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMapMemory(</div><div class="line"><a name="l14240"></a><span class="lineno">14240</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14241"></a><span class="lineno">14241</span>&#160;            allocation);</div><div class="line"><a name="l14242"></a><span class="lineno">14242</span>&#160;    }</div><div class="line"><a name="l14243"></a><span class="lineno">14243</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14244"></a><span class="lineno">14244</span>&#160;</div><div class="line"><a name="l14245"></a><span class="lineno">14245</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14246"></a><span class="lineno">14246</span>&#160;}</div><div class="line"><a name="l14247"></a><span class="lineno">14247</span>&#160;</div><div class="line"><a name="l14248"></a><span class="lineno">14248</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="l14249"></a><span class="lineno">14249</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14250"></a><span class="lineno">14250</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14251"></a><span class="lineno">14251</span>&#160;{</div><div class="line"><a name="l14252"></a><span class="lineno">14252</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14253"></a><span class="lineno">14253</span>&#160;</div><div class="line"><a name="l14254"></a><span class="lineno">14254</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14255"></a><span class="lineno">14255</span>&#160;</div><div class="line"><a name="l14256"></a><span class="lineno">14256</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14257"></a><span class="lineno">14257</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14258"></a><span class="lineno">14258</span>&#160;    {</div><div class="line"><a name="l14259"></a><span class="lineno">14259</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordUnmapMemory(</div><div class="line"><a name="l14260"></a><span class="lineno">14260</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14261"></a><span class="lineno">14261</span>&#160;            allocation);</div><div class="line"><a name="l14262"></a><span class="lineno">14262</span>&#160;    }</div><div class="line"><a name="l14263"></a><span class="lineno">14263</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14264"></a><span class="lineno">14264</span>&#160;</div><div class="line"><a name="l14265"></a><span class="lineno">14265</span>&#160;    allocator-&gt;Unmap(allocation);</div><div class="line"><a name="l14266"></a><span class="lineno">14266</span>&#160;}</div><div class="line"><a name="l14267"></a><span class="lineno">14267</span>&#160;</div><div class="line"><a name="l14268"></a><span class="lineno">14268</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l14269"></a><span class="lineno">14269</span>&#160;{</div><div class="line"><a name="l14270"></a><span class="lineno">14270</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14271"></a><span class="lineno">14271</span>&#160;</div><div class="line"><a name="l14272"></a><span class="lineno">14272</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocation&quot;</span>);</div><div class="line"><a name="l14273"></a><span class="lineno">14273</span>&#160;</div><div class="line"><a name="l14274"></a><span class="lineno">14274</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14275"></a><span class="lineno">14275</span>&#160;</div><div class="line"><a name="l14276"></a><span class="lineno">14276</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div><div class="line"><a name="l14277"></a><span class="lineno">14277</span>&#160;</div><div class="line"><a name="l14278"></a><span class="lineno">14278</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14279"></a><span class="lineno">14279</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14280"></a><span class="lineno">14280</span>&#160;    {</div><div class="line"><a name="l14281"></a><span class="lineno">14281</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFlushAllocation(</div><div class="line"><a name="l14282"></a><span class="lineno">14282</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14283"></a><span class="lineno">14283</span>&#160;            allocation, offset, size);</div><div class="line"><a name="l14284"></a><span class="lineno">14284</span>&#160;    }</div><div class="line"><a name="l14285"></a><span class="lineno">14285</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14286"></a><span class="lineno">14286</span>&#160;}</div><div class="line"><a name="l14287"></a><span class="lineno">14287</span>&#160;</div><div class="line"><a name="l14288"></a><span class="lineno">14288</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l14289"></a><span class="lineno">14289</span>&#160;{</div><div class="line"><a name="l14290"></a><span class="lineno">14290</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14291"></a><span class="lineno">14291</span>&#160;</div><div class="line"><a name="l14292"></a><span class="lineno">14292</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocation&quot;</span>);</div><div class="line"><a name="l14293"></a><span class="lineno">14293</span>&#160;</div><div class="line"><a name="l14294"></a><span class="lineno">14294</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14295"></a><span class="lineno">14295</span>&#160;</div><div class="line"><a name="l14296"></a><span class="lineno">14296</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div><div class="line"><a name="l14297"></a><span class="lineno">14297</span>&#160;</div><div class="line"><a name="l14298"></a><span class="lineno">14298</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14299"></a><span class="lineno">14299</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14300"></a><span class="lineno">14300</span>&#160;    {</div><div class="line"><a name="l14301"></a><span class="lineno">14301</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordInvalidateAllocation(</div><div class="line"><a name="l14302"></a><span class="lineno">14302</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14303"></a><span class="lineno">14303</span>&#160;            allocation, offset, size);</div><div class="line"><a name="l14304"></a><span class="lineno">14304</span>&#160;    }</div><div class="line"><a name="l14305"></a><span class="lineno">14305</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14306"></a><span class="lineno">14306</span>&#160;}</div><div class="line"><a name="l14307"></a><span class="lineno">14307</span>&#160;</div><div class="line"><a name="l14308"></a><span class="lineno">14308</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</div><div class="line"><a name="l14309"></a><span class="lineno">14309</span>&#160;{</div><div class="line"><a name="l14310"></a><span class="lineno">14310</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l14311"></a><span class="lineno">14311</span>&#160;</div><div class="line"><a name="l14312"></a><span class="lineno">14312</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckCorruption&quot;</span>);</div><div class="line"><a name="l14313"></a><span class="lineno">14313</span>&#160;</div><div class="line"><a name="l14314"></a><span class="lineno">14314</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14315"></a><span class="lineno">14315</span>&#160;</div><div class="line"><a name="l14316"></a><span class="lineno">14316</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckCorruption(memoryTypeBits);</div><div class="line"><a name="l14317"></a><span class="lineno">14317</span>&#160;}</div><div class="line"><a name="l14318"></a><span class="lineno">14318</span>&#160;</div><div class="line"><a name="l14319"></a><span class="lineno">14319</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l14320"></a><span class="lineno">14320</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14321"></a><span class="lineno">14321</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l14322"></a><span class="lineno">14322</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l14323"></a><span class="lineno">14323</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l14324"></a><span class="lineno">14324</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="l14325"></a><span class="lineno">14325</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l14326"></a><span class="lineno">14326</span>&#160;{</div><div class="line"><a name="l14327"></a><span class="lineno">14327</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocations);</div><div class="line"><a name="l14328"></a><span class="lineno">14328</span>&#160;</div><div class="line"><a name="l14329"></a><span class="lineno">14329</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragment&quot;</span>);</div><div class="line"><a name="l14330"></a><span class="lineno">14330</span>&#160;</div><div class="line"><a name="l14331"></a><span class="lineno">14331</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14332"></a><span class="lineno">14332</span>&#160;</div><div class="line"><a name="l14333"></a><span class="lineno">14333</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;Defragment(pAllocations, allocationCount, pAllocationsChanged, pDefragmentationInfo, pDefragmentationStats);</div><div class="line"><a name="l14334"></a><span class="lineno">14334</span>&#160;}</div><div class="line"><a name="l14335"></a><span class="lineno">14335</span>&#160;</div><div class="line"><a name="l14336"></a><span class="lineno">14336</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l14337"></a><span class="lineno">14337</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14338"></a><span class="lineno">14338</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14339"></a><span class="lineno">14339</span>&#160;    VkBuffer buffer)</div><div class="line"><a name="l14340"></a><span class="lineno">14340</span>&#160;{</div><div class="line"><a name="l14341"></a><span class="lineno">14341</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div><div class="line"><a name="l14342"></a><span class="lineno">14342</span>&#160;</div><div class="line"><a name="l14343"></a><span class="lineno">14343</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div><div class="line"><a name="l14344"></a><span class="lineno">14344</span>&#160;</div><div class="line"><a name="l14345"></a><span class="lineno">14345</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14346"></a><span class="lineno">14346</span>&#160;</div><div class="line"><a name="l14347"></a><span class="lineno">14347</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, buffer);</div><div class="line"><a name="l14348"></a><span class="lineno">14348</span>&#160;}</div><div class="line"><a name="l14349"></a><span class="lineno">14349</span>&#160;</div><div class="line"><a name="l14350"></a><span class="lineno">14350</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l14351"></a><span class="lineno">14351</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14352"></a><span class="lineno">14352</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14353"></a><span class="lineno">14353</span>&#160;    VkImage image)</div><div class="line"><a name="l14354"></a><span class="lineno">14354</span>&#160;{</div><div class="line"><a name="l14355"></a><span class="lineno">14355</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div><div class="line"><a name="l14356"></a><span class="lineno">14356</span>&#160;</div><div class="line"><a name="l14357"></a><span class="lineno">14357</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div><div class="line"><a name="l14358"></a><span class="lineno">14358</span>&#160;</div><div class="line"><a name="l14359"></a><span class="lineno">14359</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14360"></a><span class="lineno">14360</span>&#160;</div><div class="line"><a name="l14361"></a><span class="lineno">14361</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, image);</div><div class="line"><a name="l14362"></a><span class="lineno">14362</span>&#160;}</div><div class="line"><a name="l14363"></a><span class="lineno">14363</span>&#160;</div><div class="line"><a name="l14364"></a><span class="lineno">14364</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l14365"></a><span class="lineno">14365</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14366"></a><span class="lineno">14366</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l14367"></a><span class="lineno">14367</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="l14368"></a><span class="lineno">14368</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l14369"></a><span class="lineno">14369</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l14370"></a><span class="lineno">14370</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l14371"></a><span class="lineno">14371</span>&#160;{</div><div class="line"><a name="l14372"></a><span class="lineno">14372</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div><div class="line"><a name="l14373"></a><span class="lineno">14373</span>&#160;</div><div class="line"><a name="l14374"></a><span class="lineno">14374</span>&#160;    <span class="keywordflow">if</span>(pBufferCreateInfo-&gt;size == 0)</div><div class="line"><a name="l14375"></a><span class="lineno">14375</span>&#160;    {</div><div class="line"><a name="l14376"></a><span class="lineno">14376</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l14377"></a><span class="lineno">14377</span>&#160;    }</div><div class="line"><a name="l14378"></a><span class="lineno">14378</span>&#160;    </div><div class="line"><a name="l14379"></a><span class="lineno">14379</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div><div class="line"><a name="l14380"></a><span class="lineno">14380</span>&#160;    </div><div class="line"><a name="l14381"></a><span class="lineno">14381</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14382"></a><span class="lineno">14382</span>&#160;</div><div class="line"><a name="l14383"></a><span class="lineno">14383</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l14384"></a><span class="lineno">14384</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l14385"></a><span class="lineno">14385</span>&#160;</div><div class="line"><a name="l14386"></a><span class="lineno">14386</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div><div class="line"><a name="l14387"></a><span class="lineno">14387</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l14388"></a><span class="lineno">14388</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l14389"></a><span class="lineno">14389</span>&#160;        pBufferCreateInfo,</div><div class="line"><a name="l14390"></a><span class="lineno">14390</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l14391"></a><span class="lineno">14391</span>&#160;        pBuffer);</div><div class="line"><a name="l14392"></a><span class="lineno">14392</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14393"></a><span class="lineno">14393</span>&#160;    {</div><div class="line"><a name="l14394"></a><span class="lineno">14394</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div><div class="line"><a name="l14395"></a><span class="lineno">14395</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l14396"></a><span class="lineno">14396</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14397"></a><span class="lineno">14397</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l14398"></a><span class="lineno">14398</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div><div class="line"><a name="l14399"></a><span class="lineno">14399</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l14400"></a><span class="lineno">14400</span>&#160;</div><div class="line"><a name="l14401"></a><span class="lineno">14401</span>&#160;        <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div><div class="line"><a name="l14402"></a><span class="lineno">14402</span>&#160;        <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div><div class="line"><a name="l14403"></a><span class="lineno">14403</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="l14404"></a><span class="lineno">14404</span>&#160;        {</div><div class="line"><a name="l14405"></a><span class="lineno">14405</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l14406"></a><span class="lineno">14406</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div><div class="line"><a name="l14407"></a><span class="lineno">14407</span>&#160;        }</div><div class="line"><a name="l14408"></a><span class="lineno">14408</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div><div class="line"><a name="l14409"></a><span class="lineno">14409</span>&#160;        {</div><div class="line"><a name="l14410"></a><span class="lineno">14410</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l14411"></a><span class="lineno">14411</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div><div class="line"><a name="l14412"></a><span class="lineno">14412</span>&#160;        }</div><div class="line"><a name="l14413"></a><span class="lineno">14413</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div><div class="line"><a name="l14414"></a><span class="lineno">14414</span>&#160;        {</div><div class="line"><a name="l14415"></a><span class="lineno">14415</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l14416"></a><span class="lineno">14416</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div><div class="line"><a name="l14417"></a><span class="lineno">14417</span>&#160;        }</div><div class="line"><a name="l14418"></a><span class="lineno">14418</span>&#160;</div><div class="line"><a name="l14419"></a><span class="lineno">14419</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div><div class="line"><a name="l14420"></a><span class="lineno">14420</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l14421"></a><span class="lineno">14421</span>&#160;            vkMemReq,</div><div class="line"><a name="l14422"></a><span class="lineno">14422</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l14423"></a><span class="lineno">14423</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l14424"></a><span class="lineno">14424</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l14425"></a><span class="lineno">14425</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l14426"></a><span class="lineno">14426</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l14427"></a><span class="lineno">14427</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l14428"></a><span class="lineno">14428</span>&#160;            pAllocation);</div><div class="line"><a name="l14429"></a><span class="lineno">14429</span>&#160;</div><div class="line"><a name="l14430"></a><span class="lineno">14430</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14431"></a><span class="lineno">14431</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14432"></a><span class="lineno">14432</span>&#160;        {</div><div class="line"><a name="l14433"></a><span class="lineno">14433</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateBuffer(</div><div class="line"><a name="l14434"></a><span class="lineno">14434</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14435"></a><span class="lineno">14435</span>&#160;                *pBufferCreateInfo,</div><div class="line"><a name="l14436"></a><span class="lineno">14436</span>&#160;                *pAllocationCreateInfo,</div><div class="line"><a name="l14437"></a><span class="lineno">14437</span>&#160;                *pAllocation);</div><div class="line"><a name="l14438"></a><span class="lineno">14438</span>&#160;        }</div><div class="line"><a name="l14439"></a><span class="lineno">14439</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14440"></a><span class="lineno">14440</span>&#160;</div><div class="line"><a name="l14441"></a><span class="lineno">14441</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14442"></a><span class="lineno">14442</span>&#160;        {</div><div class="line"><a name="l14443"></a><span class="lineno">14443</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div><div class="line"><a name="l14444"></a><span class="lineno">14444</span>&#160;            res = allocator-&gt;BindBufferMemory(*pAllocation, *pBuffer);</div><div class="line"><a name="l14445"></a><span class="lineno">14445</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14446"></a><span class="lineno">14446</span>&#160;            {</div><div class="line"><a name="l14447"></a><span class="lineno">14447</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l14448"></a><span class="lineno">14448</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l14449"></a><span class="lineno">14449</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pBufferCreateInfo-&gt;usage);</div><div class="line"><a name="l14450"></a><span class="lineno">14450</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l14451"></a><span class="lineno">14451</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l14452"></a><span class="lineno">14452</span>&#160;                {</div><div class="line"><a name="l14453"></a><span class="lineno">14453</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l14454"></a><span class="lineno">14454</span>&#160;                }</div><div class="line"><a name="l14455"></a><span class="lineno">14455</span>&#160;</div><div class="line"><a name="l14456"></a><span class="lineno">14456</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l14457"></a><span class="lineno">14457</span>&#160;            }</div><div class="line"><a name="l14458"></a><span class="lineno">14458</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l14459"></a><span class="lineno">14459</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l14460"></a><span class="lineno">14460</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14461"></a><span class="lineno">14461</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l14462"></a><span class="lineno">14462</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14463"></a><span class="lineno">14463</span>&#160;        }</div><div class="line"><a name="l14464"></a><span class="lineno">14464</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14465"></a><span class="lineno">14465</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l14466"></a><span class="lineno">14466</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14467"></a><span class="lineno">14467</span>&#160;    }</div><div class="line"><a name="l14468"></a><span class="lineno">14468</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14469"></a><span class="lineno">14469</span>&#160;}</div><div class="line"><a name="l14470"></a><span class="lineno">14470</span>&#160;</div><div class="line"><a name="l14471"></a><span class="lineno">14471</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="l14472"></a><span class="lineno">14472</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14473"></a><span class="lineno">14473</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l14474"></a><span class="lineno">14474</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14475"></a><span class="lineno">14475</span>&#160;{</div><div class="line"><a name="l14476"></a><span class="lineno">14476</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l14477"></a><span class="lineno">14477</span>&#160;</div><div class="line"><a name="l14478"></a><span class="lineno">14478</span>&#160;    <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l14479"></a><span class="lineno">14479</span>&#160;    {</div><div class="line"><a name="l14480"></a><span class="lineno">14480</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l14481"></a><span class="lineno">14481</span>&#160;    }</div><div class="line"><a name="l14482"></a><span class="lineno">14482</span>&#160;</div><div class="line"><a name="l14483"></a><span class="lineno">14483</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div><div class="line"><a name="l14484"></a><span class="lineno">14484</span>&#160;</div><div class="line"><a name="l14485"></a><span class="lineno">14485</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14486"></a><span class="lineno">14486</span>&#160;</div><div class="line"><a name="l14487"></a><span class="lineno">14487</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14488"></a><span class="lineno">14488</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14489"></a><span class="lineno">14489</span>&#160;    {</div><div class="line"><a name="l14490"></a><span class="lineno">14490</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyBuffer(</div><div class="line"><a name="l14491"></a><span class="lineno">14491</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14492"></a><span class="lineno">14492</span>&#160;            allocation);</div><div class="line"><a name="l14493"></a><span class="lineno">14493</span>&#160;    }</div><div class="line"><a name="l14494"></a><span class="lineno">14494</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14495"></a><span class="lineno">14495</span>&#160;</div><div class="line"><a name="l14496"></a><span class="lineno">14496</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div><div class="line"><a name="l14497"></a><span class="lineno">14497</span>&#160;    {</div><div class="line"><a name="l14498"></a><span class="lineno">14498</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14499"></a><span class="lineno">14499</span>&#160;    }</div><div class="line"><a name="l14500"></a><span class="lineno">14500</span>&#160;</div><div class="line"><a name="l14501"></a><span class="lineno">14501</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l14502"></a><span class="lineno">14502</span>&#160;    {</div><div class="line"><a name="l14503"></a><span class="lineno">14503</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l14504"></a><span class="lineno">14504</span>&#160;    }</div><div class="line"><a name="l14505"></a><span class="lineno">14505</span>&#160;}</div><div class="line"><a name="l14506"></a><span class="lineno">14506</span>&#160;</div><div class="line"><a name="l14507"></a><span class="lineno">14507</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l14508"></a><span class="lineno">14508</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14509"></a><span class="lineno">14509</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l14510"></a><span class="lineno">14510</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="l14511"></a><span class="lineno">14511</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l14512"></a><span class="lineno">14512</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l14513"></a><span class="lineno">14513</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l14514"></a><span class="lineno">14514</span>&#160;{</div><div class="line"><a name="l14515"></a><span class="lineno">14515</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div><div class="line"><a name="l14516"></a><span class="lineno">14516</span>&#160;</div><div class="line"><a name="l14517"></a><span class="lineno">14517</span>&#160;    <span class="keywordflow">if</span>(pImageCreateInfo-&gt;extent.width == 0 ||</div><div class="line"><a name="l14518"></a><span class="lineno">14518</span>&#160;        pImageCreateInfo-&gt;extent.height == 0 ||</div><div class="line"><a name="l14519"></a><span class="lineno">14519</span>&#160;        pImageCreateInfo-&gt;extent.depth == 0 ||</div><div class="line"><a name="l14520"></a><span class="lineno">14520</span>&#160;        pImageCreateInfo-&gt;mipLevels == 0 ||</div><div class="line"><a name="l14521"></a><span class="lineno">14521</span>&#160;        pImageCreateInfo-&gt;arrayLayers == 0)</div><div class="line"><a name="l14522"></a><span class="lineno">14522</span>&#160;    {</div><div class="line"><a name="l14523"></a><span class="lineno">14523</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l14524"></a><span class="lineno">14524</span>&#160;    }</div><div class="line"><a name="l14525"></a><span class="lineno">14525</span>&#160;</div><div class="line"><a name="l14526"></a><span class="lineno">14526</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div><div class="line"><a name="l14527"></a><span class="lineno">14527</span>&#160;</div><div class="line"><a name="l14528"></a><span class="lineno">14528</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14529"></a><span class="lineno">14529</span>&#160;</div><div class="line"><a name="l14530"></a><span class="lineno">14530</span>&#160;    *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l14531"></a><span class="lineno">14531</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l14532"></a><span class="lineno">14532</span>&#160;</div><div class="line"><a name="l14533"></a><span class="lineno">14533</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div><div class="line"><a name="l14534"></a><span class="lineno">14534</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div><div class="line"><a name="l14535"></a><span class="lineno">14535</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l14536"></a><span class="lineno">14536</span>&#160;        pImageCreateInfo,</div><div class="line"><a name="l14537"></a><span class="lineno">14537</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l14538"></a><span class="lineno">14538</span>&#160;        pImage);</div><div class="line"><a name="l14539"></a><span class="lineno">14539</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14540"></a><span class="lineno">14540</span>&#160;    {</div><div class="line"><a name="l14541"></a><span class="lineno">14541</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div><div class="line"><a name="l14542"></a><span class="lineno">14542</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div><div class="line"><a name="l14543"></a><span class="lineno">14543</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div><div class="line"><a name="l14544"></a><span class="lineno">14544</span>&#160;        </div><div class="line"><a name="l14545"></a><span class="lineno">14545</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div><div class="line"><a name="l14546"></a><span class="lineno">14546</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l14547"></a><span class="lineno">14547</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14548"></a><span class="lineno">14548</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l14549"></a><span class="lineno">14549</span>&#160;        allocator-&gt;GetImageMemoryRequirements(*pImage, vkMemReq,</div><div class="line"><a name="l14550"></a><span class="lineno">14550</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l14551"></a><span class="lineno">14551</span>&#160;</div><div class="line"><a name="l14552"></a><span class="lineno">14552</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l14553"></a><span class="lineno">14553</span>&#160;            vkMemReq,</div><div class="line"><a name="l14554"></a><span class="lineno">14554</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l14555"></a><span class="lineno">14555</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l14556"></a><span class="lineno">14556</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l14557"></a><span class="lineno">14557</span>&#160;            *pImage, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l14558"></a><span class="lineno">14558</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l14559"></a><span class="lineno">14559</span>&#160;            suballocType,</div><div class="line"><a name="l14560"></a><span class="lineno">14560</span>&#160;            pAllocation);</div><div class="line"><a name="l14561"></a><span class="lineno">14561</span>&#160;</div><div class="line"><a name="l14562"></a><span class="lineno">14562</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14563"></a><span class="lineno">14563</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14564"></a><span class="lineno">14564</span>&#160;        {</div><div class="line"><a name="l14565"></a><span class="lineno">14565</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateImage(</div><div class="line"><a name="l14566"></a><span class="lineno">14566</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14567"></a><span class="lineno">14567</span>&#160;                *pImageCreateInfo,</div><div class="line"><a name="l14568"></a><span class="lineno">14568</span>&#160;                *pAllocationCreateInfo,</div><div class="line"><a name="l14569"></a><span class="lineno">14569</span>&#160;                *pAllocation);</div><div class="line"><a name="l14570"></a><span class="lineno">14570</span>&#160;        }</div><div class="line"><a name="l14571"></a><span class="lineno">14571</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14572"></a><span class="lineno">14572</span>&#160;</div><div class="line"><a name="l14573"></a><span class="lineno">14573</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14574"></a><span class="lineno">14574</span>&#160;        {</div><div class="line"><a name="l14575"></a><span class="lineno">14575</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div><div class="line"><a name="l14576"></a><span class="lineno">14576</span>&#160;            res = allocator-&gt;BindImageMemory(*pAllocation, *pImage);</div><div class="line"><a name="l14577"></a><span class="lineno">14577</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14578"></a><span class="lineno">14578</span>&#160;            {</div><div class="line"><a name="l14579"></a><span class="lineno">14579</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l14580"></a><span class="lineno">14580</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l14581"></a><span class="lineno">14581</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pImageCreateInfo-&gt;usage);</div><div class="line"><a name="l14582"></a><span class="lineno">14582</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l14583"></a><span class="lineno">14583</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l14584"></a><span class="lineno">14584</span>&#160;                {</div><div class="line"><a name="l14585"></a><span class="lineno">14585</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l14586"></a><span class="lineno">14586</span>&#160;                }</div><div class="line"><a name="l14587"></a><span class="lineno">14587</span>&#160;</div><div class="line"><a name="l14588"></a><span class="lineno">14588</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l14589"></a><span class="lineno">14589</span>&#160;            }</div><div class="line"><a name="l14590"></a><span class="lineno">14590</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l14591"></a><span class="lineno">14591</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l14592"></a><span class="lineno">14592</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14593"></a><span class="lineno">14593</span>&#160;            *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l14594"></a><span class="lineno">14594</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14595"></a><span class="lineno">14595</span>&#160;        }</div><div class="line"><a name="l14596"></a><span class="lineno">14596</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14597"></a><span class="lineno">14597</span>&#160;        *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l14598"></a><span class="lineno">14598</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14599"></a><span class="lineno">14599</span>&#160;    }</div><div class="line"><a name="l14600"></a><span class="lineno">14600</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14601"></a><span class="lineno">14601</span>&#160;}</div><div class="line"><a name="l14602"></a><span class="lineno">14602</span>&#160;</div><div class="line"><a name="l14603"></a><span class="lineno">14603</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="l14604"></a><span class="lineno">14604</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14605"></a><span class="lineno">14605</span>&#160;    VkImage image,</div><div class="line"><a name="l14606"></a><span class="lineno">14606</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14607"></a><span class="lineno">14607</span>&#160;{</div><div class="line"><a name="l14608"></a><span class="lineno">14608</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l14609"></a><span class="lineno">14609</span>&#160;</div><div class="line"><a name="l14610"></a><span class="lineno">14610</span>&#160;    <span class="keywordflow">if</span>(image == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l14611"></a><span class="lineno">14611</span>&#160;    {</div><div class="line"><a name="l14612"></a><span class="lineno">14612</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l14613"></a><span class="lineno">14613</span>&#160;    }</div><div class="line"><a name="l14614"></a><span class="lineno">14614</span>&#160;</div><div class="line"><a name="l14615"></a><span class="lineno">14615</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div><div class="line"><a name="l14616"></a><span class="lineno">14616</span>&#160;</div><div class="line"><a name="l14617"></a><span class="lineno">14617</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14618"></a><span class="lineno">14618</span>&#160;</div><div class="line"><a name="l14619"></a><span class="lineno">14619</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14620"></a><span class="lineno">14620</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14621"></a><span class="lineno">14621</span>&#160;    {</div><div class="line"><a name="l14622"></a><span class="lineno">14622</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyImage(</div><div class="line"><a name="l14623"></a><span class="lineno">14623</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14624"></a><span class="lineno">14624</span>&#160;            allocation);</div><div class="line"><a name="l14625"></a><span class="lineno">14625</span>&#160;    }</div><div class="line"><a name="l14626"></a><span class="lineno">14626</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14627"></a><span class="lineno">14627</span>&#160;</div><div class="line"><a name="l14628"></a><span class="lineno">14628</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div><div class="line"><a name="l14629"></a><span class="lineno">14629</span>&#160;    {</div><div class="line"><a name="l14630"></a><span class="lineno">14630</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14631"></a><span class="lineno">14631</span>&#160;    }</div><div class="line"><a name="l14632"></a><span class="lineno">14632</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l14633"></a><span class="lineno">14633</span>&#160;    {</div><div class="line"><a name="l14634"></a><span class="lineno">14634</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l14635"></a><span class="lineno">14635</span>&#160;    }</div><div class="line"><a name="l14636"></a><span class="lineno">14636</span>&#160;}</div><div class="line"><a name="l14637"></a><span class="lineno">14637</span>&#160;</div><div class="line"><a name="l14638"></a><span class="lineno">14638</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:1586</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:1887</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="l01460"></a><span class="lineno"> 1460</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;<span class="comment">Define this macro to 0/1 to disable/enable support for recording functionality,</span></div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;<span class="comment">available through VmaAllocatorCreateInfo::pRecordSettings.</span></div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;<span class="preprocessor">#ifndef VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;<span class="preprocessor">    #ifdef _WIN32</span></div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;<span class="preprocessor">        #define VMA_RECORDING_ENABLED 1</span></div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01468"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c"> 1468</a></span>&#160;<span class="preprocessor">        #define VMA_RECORDING_ENABLED 0</span></div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;<span class="preprocessor">#ifndef NOMINMAX</span></div><div class="line"><a name="l01473"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9f918755b601cf4bffca775992e6fb90"> 1473</a></span>&#160;<span class="preprocessor">    #define NOMINMAX // For windows.h</span></div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;<span class="preprocessor">#include &lt;vulkan/vulkan.h&gt;</span></div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;<span class="preprocessor">    #include &lt;windows.h&gt;</span></div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;</div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;<span class="preprocessor">#if !defined(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;<span class="preprocessor">    #if VK_KHR_get_memory_requirements2 &amp;&amp; VK_KHR_dedicated_allocation</span></div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 1</span></div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;<span class="preprocessor">    #else</span></div><div class="line"><a name="l01486"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af7b860e63b96d11e44ae8587ba06bbf4"> 1486</a></span>&#160;<span class="preprocessor">        #define VMA_DEDICATED_ALLOCATION 0</span></div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;<span class="preprocessor">    #endif</span></div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a>)</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</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="l01503"></a><span class="lineno"> 1503</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01508"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aef2545dc2e9dd4f29ab9ba6ac6fe2f49"> 1508</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="l01509"></a><span class="lineno"> 1509</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>      allocator,</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;    uint32_t          memoryType,</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;    VkDeviceMemory    memory,</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;    VkDeviceSize      size);</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;</div><div class="line"><a name="l01521"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html"> 1521</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="l01523"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#a4f17f7b255101e733b44d5633aceabfb"> 1523</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="l01525"></a><span class="lineno"><a class="line" href="struct_vma_device_memory_callbacks.html#abe8a3328bbc916f6f712fdb6b299444c"> 1525</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="l01526"></a><span class="lineno"> 1526</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a5e2eb68d727cfd4df25702b027b7aa31">VmaDeviceMemoryCallbacks</a>;</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;</div><div class="line"><a name="l01529"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c"> 1529</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="l01534"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7ca4816ddaed324ba110172ca608a20f29d"> 1534</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="l01556"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cace7da7cc6e71a625dfa763c55a597878"> 1556</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="l01557"></a><span class="lineno"> 1557</span>&#160;</div><div class="line"><a name="l01558"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7cae4d5ad929caba5f23eb502b13bd5286c"> 1558</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="l01559"></a><span class="lineno"> 1559</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4f87c9100d154a65a4ad495f7763cf7c">VmaAllocatorCreateFlagBits</a>;</div><div class="line"><a name="l01560"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d"> 1560</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="l01561"></a><span class="lineno"> 1561</span>&#160;</div><div class="line"><a name="l01566"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html"> 1566</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="l01567"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96"> 1567</a></span>&#160;    PFN_vkGetPhysicalDeviceProperties <a class="code" href="struct_vma_vulkan_functions.html#a77b7a74082823e865dd6546623468f96">vkGetPhysicalDeviceProperties</a>;</div><div class="line"><a name="l01568"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830"> 1568</a></span>&#160;    PFN_vkGetPhysicalDeviceMemoryProperties <a class="code" href="struct_vma_vulkan_functions.html#a60d25c33bba06bb8592e6875cbaa9830">vkGetPhysicalDeviceMemoryProperties</a>;</div><div class="line"><a name="l01569"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c"> 1569</a></span>&#160;    PFN_vkAllocateMemory <a class="code" href="struct_vma_vulkan_functions.html#a2943bf99dfd784a0e8f599d987e22e6c">vkAllocateMemory</a>;</div><div class="line"><a name="l01570"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4"> 1570</a></span>&#160;    PFN_vkFreeMemory <a class="code" href="struct_vma_vulkan_functions.html#a4c658701778564d62034255b5dda91b4">vkFreeMemory</a>;</div><div class="line"><a name="l01571"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49"> 1571</a></span>&#160;    PFN_vkMapMemory <a class="code" href="struct_vma_vulkan_functions.html#ab5c1f38dea3a2cf00dc9eb4f57218c49">vkMapMemory</a>;</div><div class="line"><a name="l01572"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9"> 1572</a></span>&#160;    PFN_vkUnmapMemory <a class="code" href="struct_vma_vulkan_functions.html#acc798589736f0becb317fc2196c1d8b9">vkUnmapMemory</a>;</div><div class="line"><a name="l01573"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9"> 1573</a></span>&#160;    PFN_vkFlushMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">vkFlushMappedMemoryRanges</a>;</div><div class="line"><a name="l01574"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1"> 1574</a></span>&#160;    PFN_vkInvalidateMappedMemoryRanges <a class="code" href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">vkInvalidateMappedMemoryRanges</a>;</div><div class="line"><a name="l01575"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2"> 1575</a></span>&#160;    PFN_vkBindBufferMemory <a class="code" href="struct_vma_vulkan_functions.html#a94fc4f3a605d9880bb3c0ba2c2fc80b2">vkBindBufferMemory</a>;</div><div class="line"><a name="l01576"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637"> 1576</a></span>&#160;    PFN_vkBindImageMemory <a class="code" href="struct_vma_vulkan_functions.html#a1338d96a128a5ade648b8d934907c637">vkBindImageMemory</a>;</div><div class="line"><a name="l01577"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143"> 1577</a></span>&#160;    PFN_vkGetBufferMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a5b92901df89a4194b0d12f6071d4d143">vkGetBufferMemoryRequirements</a>;</div><div class="line"><a name="l01578"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4"> 1578</a></span>&#160;    PFN_vkGetImageMemoryRequirements <a class="code" href="struct_vma_vulkan_functions.html#a475f6f49f8debe4d10800592606d53f4">vkGetImageMemoryRequirements</a>;</div><div class="line"><a name="l01579"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f"> 1579</a></span>&#160;    PFN_vkCreateBuffer <a class="code" href="struct_vma_vulkan_functions.html#ae8084315a25006271a2edfc3a447519f">vkCreateBuffer</a>;</div><div class="line"><a name="l01580"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45"> 1580</a></span>&#160;    PFN_vkDestroyBuffer <a class="code" href="struct_vma_vulkan_functions.html#a7e054606faddb07f0e8556f3ed317d45">vkDestroyBuffer</a>;</div><div class="line"><a name="l01581"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325"> 1581</a></span>&#160;    PFN_vkCreateImage <a class="code" href="struct_vma_vulkan_functions.html#a23ebe70be515b9b5010a1d691200e325">vkCreateImage</a>;</div><div class="line"><a name="l01582"></a><span class="lineno"><a class="line" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa"> 1582</a></span>&#160;    PFN_vkDestroyImage <a class="code" href="struct_vma_vulkan_functions.html#a90b898227039b1dcb3520f6e91f09ffa">vkDestroyImage</a>;</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;    PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;    PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a97064a1a271b0061ebfc3a079862d0c5">VmaVulkanFunctions</a>;</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;</div><div class="line"><a name="l01590"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2"> 1590</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a> {</div><div class="line"><a name="l01596"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"> 1596</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a> = 0x00000001,</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;    </div><div class="line"><a name="l01598"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"> 1598</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a>;</div><div class="line"><a name="l01600"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828"> 1600</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a>;</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;</div><div class="line"><a name="l01603"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html"> 1603</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a></div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;{</div><div class="line"><a name="l01606"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a"> 1606</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> <a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div><div class="line"><a name="l01614"></a><span class="lineno"><a class="line" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d"> 1614</a></span>&#160;    <span class="keyword">const</span> <span class="keywordtype">char</span>* <a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>;</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a>;</div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;</div><div class="line"><a name="l01618"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html"> 1618</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="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_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346"> 1621</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#acfe6863e160722c2c1bbcf7573fddc4d">VmaAllocatorCreateFlags</a> <a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a>;</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;</div><div class="line"><a name="l01624"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156"> 1624</a></span>&#160;    VkPhysicalDevice <a class="code" href="struct_vma_allocator_create_info.html#a08230f04ae6ccf8a78150a9e829a7156">physicalDevice</a>;</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;</div><div class="line"><a name="l01627"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500"> 1627</a></span>&#160;    VkDevice <a class="code" href="struct_vma_allocator_create_info.html#ad924ddd77b04039c88d0c09b0ffcd500">device</a>;</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;</div><div class="line"><a name="l01630"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a"> 1630</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocator_create_info.html#a8e4714298e3121cdd8b214a1ae7a637a">preferredLargeHeapBlockSize</a>;</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;</div><div class="line"><a name="l01633"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a6e409087e3be55400d0e4ccbe43c608d"> 1633</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="l01635"></a><span class="lineno"> 1635</span>&#160;</div><div class="line"><a name="l01636"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#af1380969b5e1ea4c3184a877892d260e"> 1636</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="l01650"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7"> 1650</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>;</div><div class="line"><a name="l01674"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a31c192aa6cbffa33279f6d9f0c47c44b"> 1674</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="l01686"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd"> 1686</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="l01693"></a><span class="lineno"><a class="line" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee"> 1693</a></span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>* <a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>;</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae0f6d1d733dded220d28134da46b4283">VmaAllocatorCreateInfo</a>;</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</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="l01699"></a><span class="lineno"> 1699</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator);</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</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="l01703"></a><span class="lineno"> 1703</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator);</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</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="l01710"></a><span class="lineno"> 1710</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties** ppPhysicalDeviceProperties);</div><div class="line"><a name="l01712"></a><span class="lineno"> 1712</span>&#160;</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</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="l01718"></a><span class="lineno"> 1718</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</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="l01728"></a><span class="lineno"> 1728</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;    VkMemoryPropertyFlags* pFlags);</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</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="l01741"></a><span class="lineno"> 1741</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;    uint32_t frameIndex);</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;</div><div class="line"><a name="l01746"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html"> 1746</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="l01747"></a><span class="lineno"> 1747</span>&#160;{</div><div class="line"><a name="l01749"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4"> 1749</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>;</div><div class="line"><a name="l01751"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff"> 1751</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l01753"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9"> 1753</a></span>&#160;    uint32_t <a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l01755"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a"> 1755</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l01757"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669"> 1757</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</div><div class="line"><a name="l01758"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea"> 1758</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, <a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>, <a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>;</div><div class="line"><a name="l01759"></a><span class="lineno"><a class="line" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4"> 1759</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, <a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>, <a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>;</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a810b009a788ee8aac72a25b42ffbe31c">VmaStatInfo</a>;</div><div class="line"><a name="l01761"></a><span class="lineno"> 1761</span>&#160;</div><div class="line"><a name="l01763"></a><span class="lineno"><a class="line" href="struct_vma_stats.html"> 1763</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="l01764"></a><span class="lineno"> 1764</span>&#160;{</div><div class="line"><a name="l01765"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331"> 1765</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l01766"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0"> 1766</a></span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> <a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l01767"></a><span class="lineno"><a class="line" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9"> 1767</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="l01768"></a><span class="lineno"> 1768</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a732be855fb4a7c248e6853d928a729af">VmaStats</a>;</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</span>&#160;</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</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="l01772"></a><span class="lineno"> 1772</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats);</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;</div><div class="line"><a name="l01775"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ae25f0d55fd91cb166f002b63244800e1"> 1775</a></span>&#160;<span class="preprocessor">#define VMA_STATS_STRING_ENABLED 1</span></div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01778"></a><span class="lineno"> 1778</span>&#160;</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</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="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="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</span>&#160;    VkBool32 detailedMap);</div><div class="line"><a name="l01786"></a><span class="lineno"> 1786</span>&#160;</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</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="l01788"></a><span class="lineno"> 1788</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;    <span class="keywordtype">char</span>* pStatsString);</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_pool.html">VmaPool</a>)</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;</div><div class="line"><a name="l01803"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc"> 1803</a></span>&#160;typedef enum <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a></div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;{</div><div class="line"><a name="l01808"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccaf50d27e34e0925cf3a63db8c839121dd"> 1808</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="l01825"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305ccac6b5dc1432d88647aa4cd456246eadf7"> 1825</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="l01835"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca40bdf4cddeffeb12f43d45ca1286e0a5"> 1835</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="l01842"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca9066b52c5a7079bb74a69aaf8b92ff67"> 1842</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="l01851"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca7b586d2fdaf82a463b58f581ed72be27"> 1851</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="l01852"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cca091e69437ef693e8d0d287f1c719ba6e"> 1852</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="l01853"></a><span class="lineno"> 1853</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#aa5846affa1e9da3800e3e78fae2305cc">VmaMemoryUsage</a>;</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;</div><div class="line"><a name="l01856"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597"> 1856</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="l01868"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a3fc311d855c2ff53f1090ef5c722b38f"> 1868</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="l01869"></a><span class="lineno"> 1869</span>&#160;</div><div class="line"><a name="l01879"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a89759603401014eb325eb22a3839f2ff"> 1879</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="l01892"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f"> 1892</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="l01905"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a5f436af6c8fe8540573a6d22627a6fd2"> 1905</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="l01912"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e"> 1912</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="l01918"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597aa6f24f821cd6a7c5e4a443f7bf59c520"> 1918</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="l01923"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"> 1923</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a> = 0x00000040,</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;</div><div class="line"><a name="l01928"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"> 1928</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>  = 0x00010000,</div><div class="line"><a name="l01932"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"> 1932</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> = 0x00020000,</div><div class="line"><a name="l01936"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"> 1936</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a> = 0x00040000,</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;</div><div class="line"><a name="l01940"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"> 1940</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>,</div><div class="line"><a name="l01943"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"> 1943</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div><div class="line"><a name="l01946"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"> 1946</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a> = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>,</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;</div><div class="line"><a name="l01950"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"> 1950</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a> =</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a> |</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a> |</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>,</div><div class="line"><a name="l01954"></a><span class="lineno"> 1954</span>&#160;</div><div class="line"><a name="l01955"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ae5633ec569f4899cf8f29e7385b2f882"> 1955</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="l01956"></a><span class="lineno"> 1956</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597">VmaAllocationCreateFlagBits</a>;</div><div class="line"><a name="l01957"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817"> 1957</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="l01958"></a><span class="lineno"> 1958</span>&#160;</div><div class="line"><a name="l01959"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html"> 1959</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="l01960"></a><span class="lineno"> 1960</span>&#160;{</div><div class="line"><a name="l01962"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b"> 1962</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> <a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div><div class="line"><a name="l01968"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910"> 1968</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="l01973"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90"> 1973</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>;</div><div class="line"><a name="l01978"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d"> 1978</a></span>&#160;    VkMemoryPropertyFlags <a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>;</div><div class="line"><a name="l01986"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055"> 1986</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>;</div><div class="line"><a name="l01992"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150"> 1992</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="l01999"></a><span class="lineno"><a class="line" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19"> 1999</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="l02000"></a><span class="lineno"> 2000</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a86c44f9950b40d50088ed93a17870a7a">VmaAllocationCreateInfo</a>;</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</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="l02022"></a><span class="lineno"> 2022</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</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="l02040"></a><span class="lineno"> 2040</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</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="l02058"></a><span class="lineno"> 2058</span>&#160;    uint32_t* pMemoryTypeIndex);</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;</div><div class="line"><a name="l02061"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7"> 2061</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="l02079"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a9f1a499508a8edb4e8ba40aa0290a3d2"> 2079</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="l02080"></a><span class="lineno"> 2080</span>&#160;</div><div class="line"><a name="l02096"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"> 2096</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> = 0x00000004,</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</span>&#160;</div><div class="line"><a name="l02107"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"> 2107</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a> = 0x00000008,</div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;</div><div class="line"><a name="l02111"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"> 2111</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a> =</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> |</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>,</div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;</div><div class="line"><a name="l02115"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a1c7312bea9ea246846b9054fd6bd6aec"> 2115</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="l02116"></a><span class="lineno"> 2116</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7">VmaPoolCreateFlagBits</a>;</div><div class="line"><a name="l02117"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a"> 2117</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="l02118"></a><span class="lineno"> 2118</span>&#160;</div><div class="line"><a name="l02121"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html"> 2121</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="l02124"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319"> 2124</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>;</div><div class="line"><a name="l02127"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446"> 2127</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a2770e325ea42e087c1b91fdf46d0292a">VmaPoolCreateFlags</a> <a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>;</div><div class="line"><a name="l02136"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676"> 2136</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>;</div><div class="line"><a name="l02141"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae"> 2141</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="l02149"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c"> 2149</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="l02163"></a><span class="lineno"><a class="line" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa"> 2163</a></span>&#160;    uint32_t <a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>;</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a211706e9348dcee25a843ed4ea69bce7">VmaPoolCreateInfo</a>;</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;</div><div class="line"><a name="l02168"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html"> 2168</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="l02171"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c"> 2171</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a>;</div><div class="line"><a name="l02174"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8"> 2174</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a>;</div><div class="line"><a name="l02177"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb"> 2177</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="l02180"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4"> 2180</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="l02187"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b"> 2187</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a>;</div><div class="line"><a name="l02190"></a><span class="lineno"><a class="line" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7"> 2190</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a>;</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a2e5612d871d64c5624087b837a338c34">VmaPoolStats</a>;</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</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="l02202"></a><span class="lineno"> 2202</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool);</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</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="l02207"></a><span class="lineno"> 2207</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</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="l02217"></a><span class="lineno"> 2217</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats);</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</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="l02228"></a><span class="lineno"> 2228</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>)</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;</div><div class="line"><a name="l02276"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html"> 2276</a></span>&#160;typedef struct <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a> {</div><div class="line"><a name="l02281"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5"> 2281</a></span>&#160;    uint32_t <a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a>;</div><div class="line"><a name="l02290"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67"> 2290</a></span>&#160;    VkDeviceMemory <a class="code" href="struct_vma_allocation_info.html#ae0bfb7dfdf79a76ffefc9a94677a2f67">deviceMemory</a>;</div><div class="line"><a name="l02295"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268"> 2295</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a>;</div><div class="line"><a name="l02300"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f"> 2300</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_allocation_info.html#aac76d113a6a5ccbb09fea00fb25fd18f">size</a>;</div><div class="line"><a name="l02309"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2"> 2309</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="l02314"></a><span class="lineno"><a class="line" href="struct_vma_allocation_info.html#adc507656149c04de7ed95d0042ba2a13"> 2314</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="l02315"></a><span class="lineno"> 2315</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a795e6ff02a21d5486c0565f403dd9255">VmaAllocationInfo</a>;</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160;</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</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="l02331"></a><span class="lineno"> 2331</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</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="l02344"></a><span class="lineno"> 2344</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;    VkImage image,</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</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="l02352"></a><span class="lineno"> 2352</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</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="l02357"></a><span class="lineno"> 2357</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160;</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</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="l02377"></a><span class="lineno"> 2377</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</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="l02413"></a><span class="lineno"> 2413</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02414"></a><span class="lineno"> 2414</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02415"></a><span class="lineno"> 2415</span>&#160;    <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l02416"></a><span class="lineno"> 2416</span>&#160;</div><div class="line"><a name="l02427"></a><span class="lineno"> 2427</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="l02428"></a><span class="lineno"> 2428</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02429"></a><span class="lineno"> 2429</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l02430"></a><span class="lineno"> 2430</span>&#160;</div><div class="line"><a name="l02465"></a><span class="lineno"> 2465</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l02466"></a><span class="lineno"> 2466</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02467"></a><span class="lineno"> 2467</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02468"></a><span class="lineno"> 2468</span>&#160;    <span class="keywordtype">void</span>** ppData);</div><div class="line"><a name="l02469"></a><span class="lineno"> 2469</span>&#160;</div><div class="line"><a name="l02474"></a><span class="lineno"> 2474</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="l02475"></a><span class="lineno"> 2475</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02476"></a><span class="lineno"> 2476</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02477"></a><span class="lineno"> 2477</span>&#160;</div><div class="line"><a name="l02490"></a><span class="lineno"> 2490</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l02491"></a><span class="lineno"> 2491</span>&#160;</div><div class="line"><a name="l02504"></a><span class="lineno"> 2504</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l02505"></a><span class="lineno"> 2505</span>&#160;</div><div class="line"><a name="l02522"></a><span class="lineno"> 2522</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits);</div><div class="line"><a name="l02523"></a><span class="lineno"> 2523</span>&#160;</div><div class="line"><a name="l02530"></a><span class="lineno"> 2530</span>&#160;VK_DEFINE_HANDLE(<a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>)</div><div class="line"><a name="l02531"></a><span class="lineno"> 2531</span>&#160;</div><div class="line"><a name="l02532"></a><span class="lineno"> 2532</span>&#160;<span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a> {</div><div class="line"><a name="l02537"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071"> 2537</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071">VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT</a> = 0x00000001,</div><div class="line"><a name="l02538"></a><span class="lineno"> 2538</span>&#160;</div><div class="line"><a name="l02544"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f"> 2544</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f">VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT</a> = 0x000010000,</div><div class="line"><a name="l02549"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46"> 2549</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46">VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT</a> = 0x00002000,</div><div class="line"><a name="l02552"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d"> 2552</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d">VMA_DEFRAGMENTATION_ALGORITHM_MASK</a> =</div><div class="line"><a name="l02553"></a><span class="lineno"> 2553</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f">VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT</a> |</div><div class="line"><a name="l02554"></a><span class="lineno"> 2554</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46">VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT</a>,</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"><a class="line" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"> 2556</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a> = 0x7FFFFFFF</div><div class="line"><a name="l02557"></a><span class="lineno"> 2557</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a>;</div><div class="line"><a name="l02558"></a><span class="lineno"><a class="line" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d"> 2558</a></span>&#160;<span class="keyword">typedef</span> VkFlags <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a>;</div><div class="line"><a name="l02559"></a><span class="lineno"> 2559</span>&#160;</div><div class="line"><a name="l02564"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html"> 2564</a></span>&#160;<span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> {</div><div class="line"><a name="l02567"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9"> 2567</a></span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a> <a class="code" href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">flags</a>;</div><div class="line"><a name="l02570"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57"> 2570</a></span>&#160;    <span class="keywordtype">size_t</span> <a class="code" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">allocationCount</a>;</div><div class="line"><a name="l02576"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96"> 2576</a></span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* <a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>;</div><div class="line"><a name="l02582"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc"> 2582</a></span>&#160;    VkBool32* <a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>;</div><div class="line"><a name="l02587"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a"> 2587</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>;</div><div class="line"><a name="l02592"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671"> 2592</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>;</div><div class="line"><a name="l02597"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08"> 2597</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">maxGpuBytesToMove</a>;</div><div class="line"><a name="l02602"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6"> 2602</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">maxGpuAllocationsToMove</a>;</div><div class="line"><a name="l02603"></a><span class="lineno"> 2603</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29">VmaDefragmentationInfo2</a>;</div><div class="line"><a name="l02604"></a><span class="lineno"> 2604</span>&#160;</div><div class="line"><a name="l02609"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html"> 2609</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="l02614"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d"> 2614</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l02619"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc"> 2619</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l02620"></a><span class="lineno"> 2620</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ae67f8573a0cf20f16f0a1eecbca566a0">VmaDefragmentationInfo</a>;</div><div class="line"><a name="l02621"></a><span class="lineno"> 2621</span>&#160;</div><div class="line"><a name="l02623"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html"> 2623</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="l02625"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d"> 2625</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a>;</div><div class="line"><a name="l02627"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28"> 2627</a></span>&#160;    VkDeviceSize <a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a>;</div><div class="line"><a name="l02629"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9"> 2629</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a>;</div><div class="line"><a name="l02631"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b"> 2631</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l02633"></a><span class="lineno"><a class="line" href="struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03"> 2633</a></span>&#160;    uint32_t <a class="code" href="struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03">allocationsLost</a>;</div><div class="line"><a name="l02634"></a><span class="lineno"> 2634</span>&#160;} <a class="code" href="vk__mem__alloc_8h.html#ab0f9b06441c840fee560de4a2967f8c9">VmaDefragmentationStats</a>;</div><div class="line"><a name="l02635"></a><span class="lineno"> 2635</span>&#160;</div><div class="line"><a name="l02661"></a><span class="lineno"> 2661</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div><div class="line"><a name="l02662"></a><span class="lineno"> 2662</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02663"></a><span class="lineno"> 2663</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* pInfo,</div><div class="line"><a name="l02664"></a><span class="lineno"> 2664</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l02665"></a><span class="lineno"> 2665</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext);</div><div class="line"><a name="l02666"></a><span class="lineno"> 2666</span>&#160;</div><div class="line"><a name="l02672"></a><span class="lineno"> 2672</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div><div class="line"><a name="l02673"></a><span class="lineno"> 2673</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02674"></a><span class="lineno"> 2674</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div><div class="line"><a name="l02675"></a><span class="lineno"> 2675</span>&#160;</div><div class="line"><a name="l02716"></a><span class="lineno"> 2716</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l02717"></a><span class="lineno"> 2717</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02718"></a><span class="lineno"> 2718</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l02719"></a><span class="lineno"> 2719</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l02720"></a><span class="lineno"> 2720</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l02721"></a><span class="lineno"> 2721</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="l02722"></a><span class="lineno"> 2722</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats);</div><div class="line"><a name="l02723"></a><span class="lineno"> 2723</span>&#160;</div><div class="line"><a name="l02736"></a><span class="lineno"> 2736</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l02737"></a><span class="lineno"> 2737</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02738"></a><span class="lineno"> 2738</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02739"></a><span class="lineno"> 2739</span>&#160;    VkBuffer buffer);</div><div class="line"><a name="l02740"></a><span class="lineno"> 2740</span>&#160;</div><div class="line"><a name="l02753"></a><span class="lineno"> 2753</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l02754"></a><span class="lineno"> 2754</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02755"></a><span class="lineno"> 2755</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l02756"></a><span class="lineno"> 2756</span>&#160;    VkImage image);</div><div class="line"><a name="l02757"></a><span class="lineno"> 2757</span>&#160;</div><div class="line"><a name="l02784"></a><span class="lineno"> 2784</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l02785"></a><span class="lineno"> 2785</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02786"></a><span class="lineno"> 2786</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l02787"></a><span class="lineno"> 2787</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="l02788"></a><span class="lineno"> 2788</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l02789"></a><span class="lineno"> 2789</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02790"></a><span class="lineno"> 2790</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02791"></a><span class="lineno"> 2791</span>&#160;</div><div class="line"><a name="l02803"></a><span class="lineno"> 2803</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="l02804"></a><span class="lineno"> 2804</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02805"></a><span class="lineno"> 2805</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l02806"></a><span class="lineno"> 2806</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l02807"></a><span class="lineno"> 2807</span>&#160;</div><div class="line"><a name="l02809"></a><span class="lineno"> 2809</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l02810"></a><span class="lineno"> 2810</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02811"></a><span class="lineno"> 2811</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l02812"></a><span class="lineno"> 2812</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="l02813"></a><span class="lineno"> 2813</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l02814"></a><span class="lineno"> 2814</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l02815"></a><span class="lineno"> 2815</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo);</div><div class="line"><a name="l02816"></a><span class="lineno"> 2816</span>&#160;</div><div class="line"><a name="l02828"></a><span class="lineno"> 2828</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="l02829"></a><span class="lineno"> 2829</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l02830"></a><span class="lineno"> 2830</span>&#160;    VkImage image,</div><div class="line"><a name="l02831"></a><span class="lineno"> 2831</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</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="preprocessor">#ifdef __cplusplus</span></div><div class="line"><a name="l02834"></a><span class="lineno"> 2834</span>&#160;}</div><div class="line"><a name="l02835"></a><span class="lineno"> 2835</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#endif // AMD_VULKAN_MEMORY_ALLOCATOR_H</span></div><div class="line"><a name="l02838"></a><span class="lineno"> 2838</span>&#160;</div><div class="line"><a name="l02839"></a><span class="lineno"> 2839</span>&#160;<span class="comment">// For Visual Studio IntelliSense.</span></div><div class="line"><a name="l02840"></a><span class="lineno"> 2840</span>&#160;<span class="preprocessor">#if defined(__cplusplus) &amp;&amp; defined(__INTELLISENSE__)</span></div><div class="line"><a name="l02841"></a><span class="lineno"> 2841</span>&#160;<span class="preprocessor">#define VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02842"></a><span class="lineno"> 2842</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifdef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02845"></a><span class="lineno"> 2845</span>&#160;<span class="preprocessor">#undef VMA_IMPLEMENTATION</span></div><div class="line"><a name="l02846"></a><span class="lineno"> 2846</span>&#160;</div><div class="line"><a name="l02847"></a><span class="lineno"> 2847</span>&#160;<span class="preprocessor">#include &lt;cstdint&gt;</span></div><div class="line"><a name="l02848"></a><span class="lineno"> 2848</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02849"></a><span class="lineno"> 2849</span>&#160;<span class="preprocessor">#include &lt;cstring&gt;</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;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l02852"></a><span class="lineno"> 2852</span>&#160;<span class="comment">CONFIGURATION SECTION</span></div><div class="line"><a name="l02853"></a><span class="lineno"> 2853</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02854"></a><span class="lineno"> 2854</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="l02855"></a><span class="lineno"> 2855</span>&#160;<span class="comment">here if you need other then default behavior depending on your environment.</span></div><div class="line"><a name="l02856"></a><span class="lineno"> 2856</span>&#160;<span class="comment">*/</span></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="comment">/*</span></div><div class="line"><a name="l02859"></a><span class="lineno"> 2859</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="l02860"></a><span class="lineno"> 2860</span>&#160;<span class="comment">internally, like:</span></div><div class="line"><a name="l02861"></a><span class="lineno"> 2861</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02862"></a><span class="lineno"> 2862</span>&#160;<span class="comment">    vulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</span></div><div class="line"><a name="l02863"></a><span class="lineno"> 2863</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02864"></a><span class="lineno"> 2864</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="l02865"></a><span class="lineno"> 2865</span>&#160;<span class="comment">VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l02866"></a><span class="lineno"> 2866</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02867"></a><span class="lineno"> 2867</span>&#160;<span class="preprocessor">#if !defined(VMA_STATIC_VULKAN_FUNCTIONS) &amp;&amp; !defined(VK_NO_PROTOTYPES)</span></div><div class="line"><a name="l02868"></a><span class="lineno"> 2868</span>&#160;<span class="preprocessor">#define VMA_STATIC_VULKAN_FUNCTIONS 1</span></div><div class="line"><a name="l02869"></a><span class="lineno"> 2869</span>&#160;<span class="preprocessor">#endif</span></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="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="l02872"></a><span class="lineno"> 2872</span>&#160;<span class="comment">//#define VMA_USE_STL_CONTAINERS 1</span></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;<span class="comment">/* Set this macro to 1 to make the library including and using STL containers:</span></div><div class="line"><a name="l02875"></a><span class="lineno"> 2875</span>&#160;<span class="comment">std::pair, std::vector, std::list, std::unordered_map.</span></div><div class="line"><a name="l02876"></a><span class="lineno"> 2876</span>&#160;<span class="comment"></span></div><div class="line"><a name="l02877"></a><span class="lineno"> 2877</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="l02878"></a><span class="lineno"> 2878</span>&#160;<span class="comment">the containers.</span></div><div class="line"><a name="l02879"></a><span class="lineno"> 2879</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02880"></a><span class="lineno"> 2880</span>&#160;<span class="preprocessor">#if VMA_USE_STL_CONTAINERS</span></div><div class="line"><a name="l02881"></a><span class="lineno"> 2881</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_VECTOR 1</span></div><div class="line"><a name="l02882"></a><span class="lineno"> 2882</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_UNORDERED_MAP 1</span></div><div class="line"><a name="l02883"></a><span class="lineno"> 2883</span>&#160;<span class="preprocessor">   #define VMA_USE_STL_LIST 1</span></div><div class="line"><a name="l02884"></a><span class="lineno"> 2884</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l02887"></a><span class="lineno"> 2887</span>&#160;<span class="preprocessor">   #include &lt;vector&gt;</span></div><div class="line"><a name="l02888"></a><span class="lineno"> 2888</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02889"></a><span class="lineno"> 2889</span>&#160;</div><div class="line"><a name="l02890"></a><span class="lineno"> 2890</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l02891"></a><span class="lineno"> 2891</span>&#160;<span class="preprocessor">   #include &lt;unordered_map&gt;</span></div><div class="line"><a name="l02892"></a><span class="lineno"> 2892</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02893"></a><span class="lineno"> 2893</span>&#160;</div><div class="line"><a name="l02894"></a><span class="lineno"> 2894</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></div><div class="line"><a name="l02895"></a><span class="lineno"> 2895</span>&#160;<span class="preprocessor">   #include &lt;list&gt;</span></div><div class="line"><a name="l02896"></a><span class="lineno"> 2896</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">/*</span></div><div class="line"><a name="l02899"></a><span class="lineno"> 2899</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="l02900"></a><span class="lineno"> 2900</span>&#160;<span class="comment">remove them if not needed.</span></div><div class="line"><a name="l02901"></a><span class="lineno"> 2901</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l02902"></a><span class="lineno"> 2902</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span> <span class="comment">// for assert</span></div><div class="line"><a name="l02903"></a><span class="lineno"> 2903</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for min, max</span></div><div class="line"><a name="l02904"></a><span class="lineno"> 2904</span>&#160;<span class="preprocessor">#include &lt;mutex&gt;</span> <span class="comment">// for std::mutex</span></div><div class="line"><a name="l02905"></a><span class="lineno"> 2905</span>&#160;<span class="preprocessor">#include &lt;atomic&gt;</span> <span class="comment">// for std::atomic</span></div><div class="line"><a name="l02906"></a><span class="lineno"> 2906</span>&#160;</div><div class="line"><a name="l02907"></a><span class="lineno"> 2907</span>&#160;<span class="preprocessor">#ifndef VMA_NULL</span></div><div class="line"><a name="l02908"></a><span class="lineno"> 2908</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="l02909"></a><span class="lineno"> 2909</span>&#160;<span class="preprocessor">   #define VMA_NULL   nullptr</span></div><div class="line"><a name="l02910"></a><span class="lineno"> 2910</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02911"></a><span class="lineno"> 2911</span>&#160;</div><div class="line"><a name="l02912"></a><span class="lineno"> 2912</span>&#160;<span class="preprocessor">#if defined(__APPLE__) || defined(__ANDROID__)</span></div><div class="line"><a name="l02913"></a><span class="lineno"> 2913</span>&#160;<span class="preprocessor">#include &lt;cstdlib&gt;</span></div><div class="line"><a name="l02914"></a><span class="lineno"> 2914</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="l02915"></a><span class="lineno"> 2915</span>&#160;{</div><div class="line"><a name="l02916"></a><span class="lineno"> 2916</span>&#160;    <span class="comment">// alignment must be &gt;= sizeof(void*)</span></div><div class="line"><a name="l02917"></a><span class="lineno"> 2917</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="l02918"></a><span class="lineno"> 2918</span>&#160;    {</div><div class="line"><a name="l02919"></a><span class="lineno"> 2919</span>&#160;        alignment = <span class="keyword">sizeof</span>(<span class="keywordtype">void</span>*);</div><div class="line"><a name="l02920"></a><span class="lineno"> 2920</span>&#160;    }</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;    <span class="keywordtype">void</span> *pointer;</div><div class="line"><a name="l02923"></a><span class="lineno"> 2923</span>&#160;    <span class="keywordflow">if</span>(posix_memalign(&amp;pointer, alignment, size) == 0)</div><div class="line"><a name="l02924"></a><span class="lineno"> 2924</span>&#160;        <span class="keywordflow">return</span> pointer;</div><div class="line"><a name="l02925"></a><span class="lineno"> 2925</span>&#160;    <span class="keywordflow">return</span> VMA_NULL;</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="preprocessor">#endif</span></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="comment">// If your compiler is not compatible with C++11 and definition of</span></div><div class="line"><a name="l02930"></a><span class="lineno"> 2930</span>&#160;<span class="comment">// aligned_alloc() function is missing, uncommeting following line may help:</span></div><div class="line"><a name="l02931"></a><span class="lineno"> 2931</span>&#160;</div><div class="line"><a name="l02932"></a><span class="lineno"> 2932</span>&#160;<span class="comment">//#include &lt;malloc.h&gt;</span></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="comment">// Normal assert to check for programmer&#39;s errors, especially in Debug configuration.</span></div><div class="line"><a name="l02935"></a><span class="lineno"> 2935</span>&#160;<span class="preprocessor">#ifndef VMA_ASSERT</span></div><div class="line"><a name="l02936"></a><span class="lineno"> 2936</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02937"></a><span class="lineno"> 2937</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)         assert(expr)</span></div><div class="line"><a name="l02938"></a><span class="lineno"> 2938</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02939"></a><span class="lineno"> 2939</span>&#160;<span class="preprocessor">       #define VMA_ASSERT(expr)</span></div><div class="line"><a name="l02940"></a><span class="lineno"> 2940</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02941"></a><span class="lineno"> 2941</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02942"></a><span class="lineno"> 2942</span>&#160;</div><div class="line"><a name="l02943"></a><span class="lineno"> 2943</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="l02944"></a><span class="lineno"> 2944</span>&#160;<span class="comment">// Making it non-empty can make program slow.</span></div><div class="line"><a name="l02945"></a><span class="lineno"> 2945</span>&#160;<span class="preprocessor">#ifndef VMA_HEAVY_ASSERT</span></div><div class="line"><a name="l02946"></a><span class="lineno"> 2946</span>&#160;<span class="preprocessor">   #ifdef _DEBUG</span></div><div class="line"><a name="l02947"></a><span class="lineno"> 2947</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)   //VMA_ASSERT(expr)</span></div><div class="line"><a name="l02948"></a><span class="lineno"> 2948</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02949"></a><span class="lineno"> 2949</span>&#160;<span class="preprocessor">       #define VMA_HEAVY_ASSERT(expr)</span></div><div class="line"><a name="l02950"></a><span class="lineno"> 2950</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02951"></a><span class="lineno"> 2951</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_ALIGN_OF</span></div><div class="line"><a name="l02954"></a><span class="lineno"> 2954</span>&#160;<span class="preprocessor">   #define VMA_ALIGN_OF(type)       (__alignof(type))</span></div><div class="line"><a name="l02955"></a><span class="lineno"> 2955</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02956"></a><span class="lineno"> 2956</span>&#160;</div><div class="line"><a name="l02957"></a><span class="lineno"> 2957</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_ALIGNED_MALLOC</span></div><div class="line"><a name="l02958"></a><span class="lineno"> 2958</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02959"></a><span class="lineno"> 2959</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (_aligned_malloc((size), (alignment)))</span></div><div class="line"><a name="l02960"></a><span class="lineno"> 2960</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02961"></a><span class="lineno"> 2961</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_ALIGNED_MALLOC(size, alignment)   (aligned_alloc((alignment), (size) ))</span></div><div class="line"><a name="l02962"></a><span class="lineno"> 2962</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02963"></a><span class="lineno"> 2963</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02964"></a><span class="lineno"> 2964</span>&#160;</div><div class="line"><a name="l02965"></a><span class="lineno"> 2965</span>&#160;<span class="preprocessor">#ifndef VMA_SYSTEM_FREE</span></div><div class="line"><a name="l02966"></a><span class="lineno"> 2966</span>&#160;<span class="preprocessor">   #if defined(_WIN32)</span></div><div class="line"><a name="l02967"></a><span class="lineno"> 2967</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   _aligned_free(ptr)</span></div><div class="line"><a name="l02968"></a><span class="lineno"> 2968</span>&#160;<span class="preprocessor">   #else</span></div><div class="line"><a name="l02969"></a><span class="lineno"> 2969</span>&#160;<span class="preprocessor">       #define VMA_SYSTEM_FREE(ptr)   free(ptr)</span></div><div class="line"><a name="l02970"></a><span class="lineno"> 2970</span>&#160;<span class="preprocessor">   #endif</span></div><div class="line"><a name="l02971"></a><span class="lineno"> 2971</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02972"></a><span class="lineno"> 2972</span>&#160;</div><div class="line"><a name="l02973"></a><span class="lineno"> 2973</span>&#160;<span class="preprocessor">#ifndef VMA_MIN</span></div><div class="line"><a name="l02974"></a><span class="lineno"> 2974</span>&#160;<span class="preprocessor">   #define VMA_MIN(v1, v2)    (std::min((v1), (v2)))</span></div><div class="line"><a name="l02975"></a><span class="lineno"> 2975</span>&#160;<span class="preprocessor">#endif</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="preprocessor">#ifndef VMA_MAX</span></div><div class="line"><a name="l02978"></a><span class="lineno"> 2978</span>&#160;<span class="preprocessor">   #define VMA_MAX(v1, v2)    (std::max((v1), (v2)))</span></div><div class="line"><a name="l02979"></a><span class="lineno"> 2979</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02980"></a><span class="lineno"> 2980</span>&#160;</div><div class="line"><a name="l02981"></a><span class="lineno"> 2981</span>&#160;<span class="preprocessor">#ifndef VMA_SWAP</span></div><div class="line"><a name="l02982"></a><span class="lineno"> 2982</span>&#160;<span class="preprocessor">   #define VMA_SWAP(v1, v2)   std::swap((v1), (v2))</span></div><div class="line"><a name="l02983"></a><span class="lineno"> 2983</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l02984"></a><span class="lineno"> 2984</span>&#160;</div><div class="line"><a name="l02985"></a><span class="lineno"> 2985</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></div><div class="line"><a name="l02986"></a><span class="lineno"> 2986</span>&#160;<span class="preprocessor">   #define VMA_SORT(beg, end, cmp)  std::sort(beg, end, cmp)</span></div><div class="line"><a name="l02987"></a><span class="lineno"> 2987</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_LOG</span></div><div class="line"><a name="l02990"></a><span class="lineno"> 2990</span>&#160;<span class="preprocessor">   #define VMA_DEBUG_LOG(format, ...)</span></div><div class="line"><a name="l02991"></a><span class="lineno"> 2991</span>&#160;   <span class="comment">/*</span></div><div class="line"><a name="l02992"></a><span class="lineno"> 2992</span>&#160;<span class="comment">   #define VMA_DEBUG_LOG(format, ...) do { \</span></div><div class="line"><a name="l02993"></a><span class="lineno"> 2993</span>&#160;<span class="comment">       printf(format, __VA_ARGS__); \</span></div><div class="line"><a name="l02994"></a><span class="lineno"> 2994</span>&#160;<span class="comment">       printf(&quot;\n&quot;); \</span></div><div class="line"><a name="l02995"></a><span class="lineno"> 2995</span>&#160;<span class="comment">   } while(false)</span></div><div class="line"><a name="l02996"></a><span class="lineno"> 2996</span>&#160;<span class="comment">   */</span></div><div class="line"><a name="l02997"></a><span class="lineno"> 2997</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">// Define this macro to 1 to enable functions: vmaBuildStatsString, vmaFreeStatsString.</span></div><div class="line"><a name="l03000"></a><span class="lineno"> 3000</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l03001"></a><span class="lineno"> 3001</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="l03002"></a><span class="lineno"> 3002</span>&#160;    {</div><div class="line"><a name="l03003"></a><span class="lineno"> 3003</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="l03004"></a><span class="lineno"> 3004</span>&#160;    }</div><div class="line"><a name="l03005"></a><span class="lineno"> 3005</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="l03006"></a><span class="lineno"> 3006</span>&#160;    {</div><div class="line"><a name="l03007"></a><span class="lineno"> 3007</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="l03008"></a><span class="lineno"> 3008</span>&#160;    }</div><div class="line"><a name="l03009"></a><span class="lineno"> 3009</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="l03010"></a><span class="lineno"> 3010</span>&#160;    {</div><div class="line"><a name="l03011"></a><span class="lineno"> 3011</span>&#160;        snprintf(outStr, strLen, <span class="stringliteral">&quot;%p&quot;</span>, ptr);</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;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03014"></a><span class="lineno"> 3014</span>&#160;</div><div class="line"><a name="l03015"></a><span class="lineno"> 3015</span>&#160;<span class="preprocessor">#ifndef VMA_MUTEX</span></div><div class="line"><a name="l03016"></a><span class="lineno"> 3016</span>&#160;    <span class="keyword">class </span>VmaMutex</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="keyword">public</span>:</div><div class="line"><a name="l03019"></a><span class="lineno"> 3019</span>&#160;        VmaMutex() { }</div><div class="line"><a name="l03020"></a><span class="lineno"> 3020</span>&#160;        ~VmaMutex() { }</div><div class="line"><a name="l03021"></a><span class="lineno"> 3021</span>&#160;        <span class="keywordtype">void</span> Lock() { m_Mutex.lock(); }</div><div class="line"><a name="l03022"></a><span class="lineno"> 3022</span>&#160;        <span class="keywordtype">void</span> Unlock() { m_Mutex.unlock(); }</div><div class="line"><a name="l03023"></a><span class="lineno"> 3023</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l03024"></a><span class="lineno"> 3024</span>&#160;        std::mutex m_Mutex;</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;<span class="preprocessor">    #define VMA_MUTEX VmaMutex</span></div><div class="line"><a name="l03027"></a><span class="lineno"> 3027</span>&#160;<span class="preprocessor">#endif</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">If providing your own implementation, you need to implement a subset of std::atomic:</span></div><div class="line"><a name="l03031"></a><span class="lineno"> 3031</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03032"></a><span class="lineno"> 3032</span>&#160;<span class="comment">- Constructor(uint32_t desired)</span></div><div class="line"><a name="l03033"></a><span class="lineno"> 3033</span>&#160;<span class="comment">- uint32_t load() const</span></div><div class="line"><a name="l03034"></a><span class="lineno"> 3034</span>&#160;<span class="comment">- void store(uint32_t desired)</span></div><div class="line"><a name="l03035"></a><span class="lineno"> 3035</span>&#160;<span class="comment">- bool compare_exchange_weak(uint32_t&amp; expected, uint32_t desired)</span></div><div class="line"><a name="l03036"></a><span class="lineno"> 3036</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03037"></a><span class="lineno"> 3037</span>&#160;<span class="preprocessor">#ifndef VMA_ATOMIC_UINT32</span></div><div class="line"><a name="l03038"></a><span class="lineno"> 3038</span>&#160;<span class="preprocessor">   #define VMA_ATOMIC_UINT32 std::atomic&lt;uint32_t&gt;</span></div><div class="line"><a name="l03039"></a><span class="lineno"> 3039</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03040"></a><span class="lineno"> 3040</span>&#160;</div><div class="line"><a name="l03041"></a><span class="lineno"> 3041</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALWAYS_DEDICATED_MEMORY</span></div><div class="line"><a name="l03042"></a><span class="lineno"> 3042</span>&#160;</div><div class="line"><a name="l03046"></a><span class="lineno"> 3046</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALWAYS_DEDICATED_MEMORY (0)</span></div><div class="line"><a name="l03047"></a><span class="lineno"> 3047</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03048"></a><span class="lineno"> 3048</span>&#160;</div><div class="line"><a name="l03049"></a><span class="lineno"> 3049</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_ALIGNMENT</span></div><div class="line"><a name="l03050"></a><span class="lineno"> 3050</span>&#160;</div><div class="line"><a name="l03054"></a><span class="lineno"> 3054</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_ALIGNMENT (1)</span></div><div class="line"><a name="l03055"></a><span class="lineno"> 3055</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_MARGIN</span></div><div class="line"><a name="l03058"></a><span class="lineno"> 3058</span>&#160;</div><div class="line"><a name="l03062"></a><span class="lineno"> 3062</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MARGIN (0)</span></div><div class="line"><a name="l03063"></a><span class="lineno"> 3063</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03064"></a><span class="lineno"> 3064</span>&#160;</div><div class="line"><a name="l03065"></a><span class="lineno"> 3065</span>&#160;<span class="preprocessor">#ifndef VMA_DEBUG_INITIALIZE_ALLOCATIONS</span></div><div class="line"><a name="l03066"></a><span class="lineno"> 3066</span>&#160;</div><div class="line"><a name="l03070"></a><span class="lineno"> 3070</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_INITIALIZE_ALLOCATIONS (0)</span></div><div class="line"><a name="l03071"></a><span class="lineno"> 3071</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_DETECT_CORRUPTION</span></div><div class="line"><a name="l03074"></a><span class="lineno"> 3074</span>&#160;</div><div class="line"><a name="l03079"></a><span class="lineno"> 3079</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_DETECT_CORRUPTION (0)</span></div><div class="line"><a name="l03080"></a><span class="lineno"> 3080</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l03083"></a><span class="lineno"> 3083</span>&#160;</div><div class="line"><a name="l03087"></a><span class="lineno"> 3087</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX (0)</span></div><div class="line"><a name="l03088"></a><span class="lineno"> 3088</span>&#160;<span class="preprocessor">#endif</span></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="preprocessor">#ifndef VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY</span></div><div class="line"><a name="l03091"></a><span class="lineno"> 3091</span>&#160;</div><div class="line"><a name="l03095"></a><span class="lineno"> 3095</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY (1)</span></div><div class="line"><a name="l03096"></a><span class="lineno"> 3096</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03097"></a><span class="lineno"> 3097</span>&#160;</div><div class="line"><a name="l03098"></a><span class="lineno"> 3098</span>&#160;<span class="preprocessor">#ifndef VMA_SMALL_HEAP_MAX_SIZE</span></div><div class="line"><a name="l03099"></a><span class="lineno"> 3099</span>&#160;<span class="preprocessor">   #define VMA_SMALL_HEAP_MAX_SIZE (1024ull * 1024 * 1024)</span></div><div class="line"><a name="l03101"></a><span class="lineno"> 3101</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l03102"></a><span class="lineno"> 3102</span>&#160;</div><div class="line"><a name="l03103"></a><span class="lineno"> 3103</span>&#160;<span class="preprocessor">#ifndef VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE</span></div><div class="line"><a name="l03104"></a><span class="lineno"> 3104</span>&#160;<span class="preprocessor">   #define VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE (256ull * 1024 * 1024)</span></div><div class="line"><a name="l03106"></a><span class="lineno"> 3106</span>&#160;<span class="preprocessor">#endif</span></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;<span class="preprocessor">#ifndef VMA_CLASS_NO_COPY</span></div><div class="line"><a name="l03109"></a><span class="lineno"> 3109</span>&#160;<span class="preprocessor">    #define VMA_CLASS_NO_COPY(className) \</span></div><div class="line"><a name="l03110"></a><span class="lineno"> 3110</span>&#160;<span class="preprocessor">        private: \</span></div><div class="line"><a name="l03111"></a><span class="lineno"> 3111</span>&#160;<span class="preprocessor">            className(const className&amp;) = delete; \</span></div><div class="line"><a name="l03112"></a><span class="lineno"> 3112</span>&#160;<span class="preprocessor">            className&amp; operator=(const className&amp;) = delete;</span></div><div class="line"><a name="l03113"></a><span class="lineno"> 3113</span>&#160;<span class="preprocessor">#endif</span></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;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_FRAME_INDEX_LOST = UINT32_MAX;</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">// Decimal 2139416166, float NaN, little-endian binary 66 E6 84 7F.</span></div><div class="line"><a name="l03118"></a><span class="lineno"> 3118</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint32_t VMA_CORRUPTION_DETECTION_MAGIC_VALUE = 0x7F84E666;</div><div class="line"><a name="l03119"></a><span class="lineno"> 3119</span>&#160;</div><div class="line"><a name="l03120"></a><span class="lineno"> 3120</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_CREATED   = 0xDC;</div><div class="line"><a name="l03121"></a><span class="lineno"> 3121</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> uint8_t VMA_ALLOCATION_FILL_PATTERN_DESTROYED = 0xEF;</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;<span class="comment">/*******************************************************************************</span></div><div class="line"><a name="l03124"></a><span class="lineno"> 3124</span>&#160;<span class="comment">END OF CONFIGURATION</span></div><div class="line"><a name="l03125"></a><span class="lineno"> 3125</span>&#160;<span class="comment">*/</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;<span class="keyword">static</span> VkAllocationCallbacks VmaEmptyAllocationCallbacks = {</div><div class="line"><a name="l03128"></a><span class="lineno"> 3128</span>&#160;    VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL, VMA_NULL };</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="comment">// Returns number of bits set to 1 in (v).</span></div><div class="line"><a name="l03131"></a><span class="lineno"> 3131</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaCountBitsSet(uint32_t v)</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;    uint32_t c = v - ((v &gt;&gt; 1) &amp; 0x55555555);</div><div class="line"><a name="l03134"></a><span class="lineno"> 3134</span>&#160;    c = ((c &gt;&gt;  2) &amp; 0x33333333) + (c &amp; 0x33333333);</div><div class="line"><a name="l03135"></a><span class="lineno"> 3135</span>&#160;    c = ((c &gt;&gt;  4) + c) &amp; 0x0F0F0F0F;</div><div class="line"><a name="l03136"></a><span class="lineno"> 3136</span>&#160;    c = ((c &gt;&gt;  8) + c) &amp; 0x00FF00FF;</div><div class="line"><a name="l03137"></a><span class="lineno"> 3137</span>&#160;    c = ((c &gt;&gt; 16) + c) &amp; 0x0000FFFF;</div><div class="line"><a name="l03138"></a><span class="lineno"> 3138</span>&#160;    <span class="keywordflow">return</span> c;</div><div class="line"><a name="l03139"></a><span class="lineno"> 3139</span>&#160;}</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">// Aligns given value up to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 16.</span></div><div class="line"><a name="l03142"></a><span class="lineno"> 3142</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l03143"></a><span class="lineno"> 3143</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03144"></a><span class="lineno"> 3144</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignUp(T val, T align)</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="keywordflow">return</span> (val + align - 1) / align * align;</div><div class="line"><a name="l03147"></a><span class="lineno"> 3147</span>&#160;}</div><div class="line"><a name="l03148"></a><span class="lineno"> 3148</span>&#160;<span class="comment">// Aligns given value down to nearest multiply of align value. For example: VmaAlignUp(11, 8) = 8.</span></div><div class="line"><a name="l03149"></a><span class="lineno"> 3149</span>&#160;<span class="comment">// Use types like uint32_t, uint64_t as T.</span></div><div class="line"><a name="l03150"></a><span class="lineno"> 3150</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03151"></a><span class="lineno"> 3151</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> T VmaAlignDown(T val, T align)</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="keywordflow">return</span> val / align * align;</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;</div><div class="line"><a name="l03156"></a><span class="lineno"> 3156</span>&#160;<span class="comment">// Division with mathematical rounding to nearest number.</span></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">static</span> <span class="keyword">inline</span> T VmaRoundDiv(T x, T y)</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;    <span class="keywordflow">return</span> (x + (y / (T)2)) / y;</div><div class="line"><a name="l03161"></a><span class="lineno"> 3161</span>&#160;}</div><div class="line"><a name="l03162"></a><span class="lineno"> 3162</span>&#160;</div><div class="line"><a name="l03163"></a><span class="lineno"> 3163</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03164"></a><span class="lineno"> 3164</span>&#160;<span class="comment">Returns true if given number is a power of two.</span></div><div class="line"><a name="l03165"></a><span class="lineno"> 3165</span>&#160;<span class="comment">T must be unsigned integer number or signed integer but always nonnegative.</span></div><div class="line"><a name="l03166"></a><span class="lineno"> 3166</span>&#160;<span class="comment">For 0 returns true.</span></div><div class="line"><a name="l03167"></a><span class="lineno"> 3167</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03168"></a><span class="lineno"> 3168</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03169"></a><span class="lineno"> 3169</span>&#160;<span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsPow2(T x)</div><div class="line"><a name="l03170"></a><span class="lineno"> 3170</span>&#160;{</div><div class="line"><a name="l03171"></a><span class="lineno"> 3171</span>&#160;    <span class="keywordflow">return</span> (x &amp; (x-1)) == 0;</div><div class="line"><a name="l03172"></a><span class="lineno"> 3172</span>&#160;}</div><div class="line"><a name="l03173"></a><span class="lineno"> 3173</span>&#160;</div><div class="line"><a name="l03174"></a><span class="lineno"> 3174</span>&#160;<span class="comment">// Returns smallest power of 2 greater or equal to v.</span></div><div class="line"><a name="l03175"></a><span class="lineno"> 3175</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaNextPow2(uint32_t v)</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;    v--;</div><div class="line"><a name="l03178"></a><span class="lineno"> 3178</span>&#160;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03179"></a><span class="lineno"> 3179</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03180"></a><span class="lineno"> 3180</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03181"></a><span class="lineno"> 3181</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03182"></a><span class="lineno"> 3182</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03183"></a><span class="lineno"> 3183</span>&#160;    v++;</div><div class="line"><a name="l03184"></a><span class="lineno"> 3184</span>&#160;    <span class="keywordflow">return</span> v;</div><div class="line"><a name="l03185"></a><span class="lineno"> 3185</span>&#160;}</div><div class="line"><a name="l03186"></a><span class="lineno"> 3186</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaNextPow2(uint64_t v)</div><div class="line"><a name="l03187"></a><span class="lineno"> 3187</span>&#160;{</div><div class="line"><a name="l03188"></a><span class="lineno"> 3188</span>&#160;    v--;</div><div class="line"><a name="l03189"></a><span class="lineno"> 3189</span>&#160;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03190"></a><span class="lineno"> 3190</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03191"></a><span class="lineno"> 3191</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03192"></a><span class="lineno"> 3192</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03193"></a><span class="lineno"> 3193</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03194"></a><span class="lineno"> 3194</span>&#160;    v |= v &gt;&gt; 32;</div><div class="line"><a name="l03195"></a><span class="lineno"> 3195</span>&#160;    v++;</div><div class="line"><a name="l03196"></a><span class="lineno"> 3196</span>&#160;    <span class="keywordflow">return</span> v;</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;</div><div class="line"><a name="l03199"></a><span class="lineno"> 3199</span>&#160;<span class="comment">// Returns largest power of 2 less or equal to v.</span></div><div class="line"><a name="l03200"></a><span class="lineno"> 3200</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> uint32_t VmaPrevPow2(uint32_t v)</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;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03203"></a><span class="lineno"> 3203</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03204"></a><span class="lineno"> 3204</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03205"></a><span class="lineno"> 3205</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03206"></a><span class="lineno"> 3206</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03207"></a><span class="lineno"> 3207</span>&#160;    v = v ^ (v &gt;&gt; 1);</div><div class="line"><a name="l03208"></a><span class="lineno"> 3208</span>&#160;    <span class="keywordflow">return</span> v;</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;<span class="keyword">static</span> <span class="keyword">inline</span> uint64_t VmaPrevPow2(uint64_t v)</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;    v |= v &gt;&gt; 1;</div><div class="line"><a name="l03213"></a><span class="lineno"> 3213</span>&#160;    v |= v &gt;&gt; 2;</div><div class="line"><a name="l03214"></a><span class="lineno"> 3214</span>&#160;    v |= v &gt;&gt; 4;</div><div class="line"><a name="l03215"></a><span class="lineno"> 3215</span>&#160;    v |= v &gt;&gt; 8;</div><div class="line"><a name="l03216"></a><span class="lineno"> 3216</span>&#160;    v |= v &gt;&gt; 16;</div><div class="line"><a name="l03217"></a><span class="lineno"> 3217</span>&#160;    v |= v &gt;&gt; 32;</div><div class="line"><a name="l03218"></a><span class="lineno"> 3218</span>&#160;    v = v ^ (v &gt;&gt; 1);</div><div class="line"><a name="l03219"></a><span class="lineno"> 3219</span>&#160;    <span class="keywordflow">return</span> v;</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;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaStrIsEmpty(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</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;    <span class="keywordflow">return</span> pStr == VMA_NULL || *pStr == <span class="charliteral">&#39;\0&#39;</span>;</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;</div><div class="line"><a name="l03227"></a><span class="lineno"> 3227</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span>* VmaAlgorithmToStr(uint32_t algorithm)</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="keywordflow">switch</span>(algorithm)</div><div class="line"><a name="l03230"></a><span class="lineno"> 3230</span>&#160;    {</div><div class="line"><a name="l03231"></a><span class="lineno"> 3231</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div><div class="line"><a name="l03232"></a><span class="lineno"> 3232</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Linear&quot;</span>;</div><div class="line"><a name="l03233"></a><span class="lineno"> 3233</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div><div class="line"><a name="l03234"></a><span class="lineno"> 3234</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Buddy&quot;</span>;</div><div class="line"><a name="l03235"></a><span class="lineno"> 3235</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l03236"></a><span class="lineno"> 3236</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;Default&quot;</span>;</div><div class="line"><a name="l03237"></a><span class="lineno"> 3237</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l03238"></a><span class="lineno"> 3238</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l03239"></a><span class="lineno"> 3239</span>&#160;        <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l03240"></a><span class="lineno"> 3240</span>&#160;    }</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;</div><div class="line"><a name="l03243"></a><span class="lineno"> 3243</span>&#160;<span class="preprocessor">#ifndef VMA_SORT</span></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;<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="l03246"></a><span class="lineno"> 3246</span>&#160;Iterator VmaQuickSortPartition(Iterator beg, Iterator end, Compare cmp)</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;    Iterator centerValue = end; --centerValue;</div><div class="line"><a name="l03249"></a><span class="lineno"> 3249</span>&#160;    Iterator insertIndex = beg;</div><div class="line"><a name="l03250"></a><span class="lineno"> 3250</span>&#160;    <span class="keywordflow">for</span>(Iterator memTypeIndex = beg; memTypeIndex &lt; centerValue; ++memTypeIndex)</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;        <span class="keywordflow">if</span>(cmp(*memTypeIndex, *centerValue))</div><div class="line"><a name="l03253"></a><span class="lineno"> 3253</span>&#160;        {</div><div class="line"><a name="l03254"></a><span class="lineno"> 3254</span>&#160;            <span class="keywordflow">if</span>(insertIndex != memTypeIndex)</div><div class="line"><a name="l03255"></a><span class="lineno"> 3255</span>&#160;            {</div><div class="line"><a name="l03256"></a><span class="lineno"> 3256</span>&#160;                VMA_SWAP(*memTypeIndex, *insertIndex);</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;            ++insertIndex;</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;    }</div><div class="line"><a name="l03261"></a><span class="lineno"> 3261</span>&#160;    <span class="keywordflow">if</span>(insertIndex != centerValue)</div><div class="line"><a name="l03262"></a><span class="lineno"> 3262</span>&#160;    {</div><div class="line"><a name="l03263"></a><span class="lineno"> 3263</span>&#160;        VMA_SWAP(*insertIndex, *centerValue);</div><div class="line"><a name="l03264"></a><span class="lineno"> 3264</span>&#160;    }</div><div class="line"><a name="l03265"></a><span class="lineno"> 3265</span>&#160;    <span class="keywordflow">return</span> insertIndex;</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;</div><div class="line"><a name="l03268"></a><span class="lineno"> 3268</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="l03269"></a><span class="lineno"> 3269</span>&#160;<span class="keywordtype">void</span> VmaQuickSort(Iterator beg, Iterator end, Compare cmp)</div><div class="line"><a name="l03270"></a><span class="lineno"> 3270</span>&#160;{</div><div class="line"><a name="l03271"></a><span class="lineno"> 3271</span>&#160;    <span class="keywordflow">if</span>(beg &lt; end)</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;        Iterator it = VmaQuickSortPartition&lt;Iterator, Compare&gt;(beg, end, cmp);</div><div class="line"><a name="l03274"></a><span class="lineno"> 3274</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(beg, it, cmp);</div><div class="line"><a name="l03275"></a><span class="lineno"> 3275</span>&#160;        VmaQuickSort&lt;Iterator, Compare&gt;(it + 1, end, cmp);</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;}</div><div class="line"><a name="l03278"></a><span class="lineno"> 3278</span>&#160;</div><div class="line"><a name="l03279"></a><span class="lineno"> 3279</span>&#160;<span class="preprocessor">#define VMA_SORT(beg, end, cmp) VmaQuickSort(beg, end, cmp)</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">#endif // #ifndef VMA_SORT</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="comment">/*</span></div><div class="line"><a name="l03284"></a><span class="lineno"> 3284</span>&#160;<span class="comment">Returns true if two memory blocks occupy overlapping pages.</span></div><div class="line"><a name="l03285"></a><span class="lineno"> 3285</span>&#160;<span class="comment">ResourceA must be in less memory offset than ResourceB.</span></div><div class="line"><a name="l03286"></a><span class="lineno"> 3286</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03287"></a><span class="lineno"> 3287</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="l03288"></a><span class="lineno"> 3288</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="l03289"></a><span class="lineno"> 3289</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03290"></a><span class="lineno"> 3290</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaBlocksOnSamePage(</div><div class="line"><a name="l03291"></a><span class="lineno"> 3291</span>&#160;    VkDeviceSize resourceAOffset,</div><div class="line"><a name="l03292"></a><span class="lineno"> 3292</span>&#160;    VkDeviceSize resourceASize,</div><div class="line"><a name="l03293"></a><span class="lineno"> 3293</span>&#160;    VkDeviceSize resourceBOffset,</div><div class="line"><a name="l03294"></a><span class="lineno"> 3294</span>&#160;    VkDeviceSize pageSize)</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;    VMA_ASSERT(resourceAOffset + resourceASize &lt;= resourceBOffset &amp;&amp; resourceASize &gt; 0 &amp;&amp; pageSize &gt; 0);</div><div class="line"><a name="l03297"></a><span class="lineno"> 3297</span>&#160;    VkDeviceSize resourceAEnd = resourceAOffset + resourceASize - 1;</div><div class="line"><a name="l03298"></a><span class="lineno"> 3298</span>&#160;    VkDeviceSize resourceAEndPage = resourceAEnd &amp; ~(pageSize - 1);</div><div class="line"><a name="l03299"></a><span class="lineno"> 3299</span>&#160;    VkDeviceSize resourceBStart = resourceBOffset;</div><div class="line"><a name="l03300"></a><span class="lineno"> 3300</span>&#160;    VkDeviceSize resourceBStartPage = resourceBStart &amp; ~(pageSize - 1);</div><div class="line"><a name="l03301"></a><span class="lineno"> 3301</span>&#160;    <span class="keywordflow">return</span> resourceAEndPage == resourceBStartPage;</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;</div><div class="line"><a name="l03304"></a><span class="lineno"> 3304</span>&#160;<span class="keyword">enum</span> VmaSuballocationType</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;    VMA_SUBALLOCATION_TYPE_FREE = 0,</div><div class="line"><a name="l03307"></a><span class="lineno"> 3307</span>&#160;    VMA_SUBALLOCATION_TYPE_UNKNOWN = 1,</div><div class="line"><a name="l03308"></a><span class="lineno"> 3308</span>&#160;    VMA_SUBALLOCATION_TYPE_BUFFER = 2,</div><div class="line"><a name="l03309"></a><span class="lineno"> 3309</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN = 3,</div><div class="line"><a name="l03310"></a><span class="lineno"> 3310</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR = 4,</div><div class="line"><a name="l03311"></a><span class="lineno"> 3311</span>&#160;    VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL = 5,</div><div class="line"><a name="l03312"></a><span class="lineno"> 3312</span>&#160;    VMA_SUBALLOCATION_TYPE_MAX_ENUM = 0x7FFFFFFF</div><div class="line"><a name="l03313"></a><span class="lineno"> 3313</span>&#160;};</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="comment">/*</span></div><div class="line"><a name="l03316"></a><span class="lineno"> 3316</span>&#160;<span class="comment">Returns true if given suballocation types could conflict and must respect</span></div><div class="line"><a name="l03317"></a><span class="lineno"> 3317</span>&#160;<span class="comment">VkPhysicalDeviceLimits::bufferImageGranularity. They conflict if one is buffer</span></div><div class="line"><a name="l03318"></a><span class="lineno"> 3318</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="l03319"></a><span class="lineno"> 3319</span>&#160;<span class="comment">conservatively.</span></div><div class="line"><a name="l03320"></a><span class="lineno"> 3320</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03321"></a><span class="lineno"> 3321</span>&#160;<span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> VmaIsBufferImageGranularityConflict(</div><div class="line"><a name="l03322"></a><span class="lineno"> 3322</span>&#160;    VmaSuballocationType suballocType1,</div><div class="line"><a name="l03323"></a><span class="lineno"> 3323</span>&#160;    VmaSuballocationType suballocType2)</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="keywordflow">if</span>(suballocType1 &gt; suballocType2)</div><div class="line"><a name="l03326"></a><span class="lineno"> 3326</span>&#160;    {</div><div class="line"><a name="l03327"></a><span class="lineno"> 3327</span>&#160;        VMA_SWAP(suballocType1, suballocType2);</div><div class="line"><a name="l03328"></a><span class="lineno"> 3328</span>&#160;    }</div><div class="line"><a name="l03329"></a><span class="lineno"> 3329</span>&#160;    </div><div class="line"><a name="l03330"></a><span class="lineno"> 3330</span>&#160;    <span class="keywordflow">switch</span>(suballocType1)</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="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_FREE:</div><div class="line"><a name="l03333"></a><span class="lineno"> 3333</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03334"></a><span class="lineno"> 3334</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_UNKNOWN:</div><div class="line"><a name="l03335"></a><span class="lineno"> 3335</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03336"></a><span class="lineno"> 3336</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_BUFFER:</div><div class="line"><a name="l03337"></a><span class="lineno"> 3337</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03338"></a><span class="lineno"> 3338</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l03339"></a><span class="lineno"> 3339</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03340"></a><span class="lineno"> 3340</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN:</div><div class="line"><a name="l03341"></a><span class="lineno"> 3341</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03342"></a><span class="lineno"> 3342</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l03343"></a><span class="lineno"> 3343</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR ||</div><div class="line"><a name="l03344"></a><span class="lineno"> 3344</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03345"></a><span class="lineno"> 3345</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR:</div><div class="line"><a name="l03346"></a><span class="lineno"> 3346</span>&#160;        <span class="keywordflow">return</span></div><div class="line"><a name="l03347"></a><span class="lineno"> 3347</span>&#160;            suballocType2 == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL;</div><div class="line"><a name="l03348"></a><span class="lineno"> 3348</span>&#160;    <span class="keywordflow">case</span> VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL:</div><div class="line"><a name="l03349"></a><span class="lineno"> 3349</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03350"></a><span class="lineno"> 3350</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l03351"></a><span class="lineno"> 3351</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l03352"></a><span class="lineno"> 3352</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;}</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;<span class="keyword">static</span> <span class="keywordtype">void</span> VmaWriteMagicValue(<span class="keywordtype">void</span>* pData, VkDeviceSize offset)</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;    uint32_t* pDst = (uint32_t*)((<span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l03359"></a><span class="lineno"> 3359</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l03360"></a><span class="lineno"> 3360</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pDst)</div><div class="line"><a name="l03361"></a><span class="lineno"> 3361</span>&#160;    {</div><div class="line"><a name="l03362"></a><span class="lineno"> 3362</span>&#160;        *pDst = VMA_CORRUPTION_DETECTION_MAGIC_VALUE;</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;}</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;<span class="keyword">static</span> <span class="keywordtype">bool</span> VmaValidateMagicValue(<span class="keyword">const</span> <span class="keywordtype">void</span>* pData, VkDeviceSize offset)</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">const</span> uint32_t* pSrc = (<span class="keyword">const</span> uint32_t*)((<span class="keyword">const</span> <span class="keywordtype">char</span>*)pData + offset);</div><div class="line"><a name="l03369"></a><span class="lineno"> 3369</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> numberCount = VMA_DEBUG_MARGIN / <span class="keyword">sizeof</span>(uint32_t);</div><div class="line"><a name="l03370"></a><span class="lineno"> 3370</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; numberCount; ++i, ++pSrc)</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;        <span class="keywordflow">if</span>(*pSrc != VMA_CORRUPTION_DETECTION_MAGIC_VALUE)</div><div class="line"><a name="l03373"></a><span class="lineno"> 3373</span>&#160;        {</div><div class="line"><a name="l03374"></a><span class="lineno"> 3374</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03375"></a><span class="lineno"> 3375</span>&#160;        }</div><div class="line"><a name="l03376"></a><span class="lineno"> 3376</span>&#160;    }</div><div class="line"><a name="l03377"></a><span class="lineno"> 3377</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l03380"></a><span class="lineno"> 3380</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="l03381"></a><span class="lineno"> 3381</span>&#160;<span class="keyword">struct </span>VmaMutexLock</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;    VMA_CLASS_NO_COPY(VmaMutexLock)</div><div class="line"><a name="l03384"></a><span class="lineno"> 3384</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03385"></a><span class="lineno"> 3385</span>&#160;    VmaMutexLock(VMA_MUTEX&amp; mutex, <span class="keywordtype">bool</span> useMutex) :</div><div class="line"><a name="l03386"></a><span class="lineno"> 3386</span>&#160;        m_pMutex(useMutex ? &amp;mutex : VMA_NULL)</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;        <span class="keywordflow">if</span>(m_pMutex)</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;            m_pMutex-&gt;Lock();</div><div class="line"><a name="l03391"></a><span class="lineno"> 3391</span>&#160;        }</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;    ~VmaMutexLock()</div><div class="line"><a name="l03395"></a><span class="lineno"> 3395</span>&#160;    {</div><div class="line"><a name="l03396"></a><span class="lineno"> 3396</span>&#160;        <span class="keywordflow">if</span>(m_pMutex)</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;            m_pMutex-&gt;Unlock();</div><div class="line"><a name="l03399"></a><span class="lineno"> 3399</span>&#160;        }</div><div class="line"><a name="l03400"></a><span class="lineno"> 3400</span>&#160;    }</div><div class="line"><a name="l03401"></a><span class="lineno"> 3401</span>&#160;</div><div class="line"><a name="l03402"></a><span class="lineno"> 3402</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l03403"></a><span class="lineno"> 3403</span>&#160;    VMA_MUTEX* m_pMutex;</div><div class="line"><a name="l03404"></a><span class="lineno"> 3404</span>&#160;};</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;<span class="preprocessor">#if VMA_DEBUG_GLOBAL_MUTEX</span></div><div class="line"><a name="l03407"></a><span class="lineno"> 3407</span>&#160;    <span class="keyword">static</span> VMA_MUTEX gDebugGlobalMutex;</div><div class="line"><a name="l03408"></a><span class="lineno"> 3408</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);</span></div><div class="line"><a name="l03409"></a><span class="lineno"> 3409</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l03410"></a><span class="lineno"> 3410</span>&#160;<span class="preprocessor">    #define VMA_DEBUG_GLOBAL_MUTEX_LOCK</span></div><div class="line"><a name="l03411"></a><span class="lineno"> 3411</span>&#160;<span class="preprocessor">#endif</span></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;<span class="comment">// Minimum size of a free suballocation to register it in the free suballocation collection.</span></div><div class="line"><a name="l03414"></a><span class="lineno"> 3414</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="l03415"></a><span class="lineno"> 3415</span>&#160;</div><div class="line"><a name="l03416"></a><span class="lineno"> 3416</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03417"></a><span class="lineno"> 3417</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="l03418"></a><span class="lineno"> 3418</span>&#160;<span class="comment">equal to (key), according to comparison (cmp).</span></div><div class="line"><a name="l03419"></a><span class="lineno"> 3419</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03420"></a><span class="lineno"> 3420</span>&#160;<span class="comment">Cmp should return true if first argument is less than second argument.</span></div><div class="line"><a name="l03421"></a><span class="lineno"> 3421</span>&#160;<span class="comment"></span></div><div class="line"><a name="l03422"></a><span class="lineno"> 3422</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="l03423"></a><span class="lineno"> 3423</span>&#160;<span class="comment">new element with value (key) should be inserted.</span></div><div class="line"><a name="l03424"></a><span class="lineno"> 3424</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03425"></a><span class="lineno"> 3425</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT&gt;</div><div class="line"><a name="l03426"></a><span class="lineno"> 3426</span>&#160;<span class="keyword">static</span> IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, <span class="keyword">const</span> KeyT &amp;key, CmpLess cmp)</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="keywordtype">size_t</span> down = 0, up = (end - beg);</div><div class="line"><a name="l03429"></a><span class="lineno"> 3429</span>&#160;    <span class="keywordflow">while</span>(down &lt; up)</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;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> mid = (down + up) / 2;</div><div class="line"><a name="l03432"></a><span class="lineno"> 3432</span>&#160;        <span class="keywordflow">if</span>(cmp(*(beg+mid), key))</div><div class="line"><a name="l03433"></a><span class="lineno"> 3433</span>&#160;        {</div><div class="line"><a name="l03434"></a><span class="lineno"> 3434</span>&#160;            down = mid + 1;</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="keywordflow">else</span></div><div class="line"><a name="l03437"></a><span class="lineno"> 3437</span>&#160;        {</div><div class="line"><a name="l03438"></a><span class="lineno"> 3438</span>&#160;            up = mid;</div><div class="line"><a name="l03439"></a><span class="lineno"> 3439</span>&#160;        }</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;    <span class="keywordflow">return</span> beg + down;</div><div class="line"><a name="l03442"></a><span class="lineno"> 3442</span>&#160;}</div><div class="line"><a name="l03443"></a><span class="lineno"> 3443</span>&#160;</div><div class="line"><a name="l03445"></a><span class="lineno"> 3445</span>&#160;<span class="comment">// Memory allocation</span></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;<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="l03448"></a><span class="lineno"> 3448</span>&#160;{</div><div class="line"><a name="l03449"></a><span class="lineno"> 3449</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l03450"></a><span class="lineno"> 3450</span>&#160;        (pAllocationCallbacks-&gt;pfnAllocation != VMA_NULL))</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;        <span class="keywordflow">return</span> (*pAllocationCallbacks-&gt;pfnAllocation)(</div><div class="line"><a name="l03453"></a><span class="lineno"> 3453</span>&#160;            pAllocationCallbacks-&gt;pUserData,</div><div class="line"><a name="l03454"></a><span class="lineno"> 3454</span>&#160;            size,</div><div class="line"><a name="l03455"></a><span class="lineno"> 3455</span>&#160;            alignment,</div><div class="line"><a name="l03456"></a><span class="lineno"> 3456</span>&#160;            VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);</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="keywordflow">else</span></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;        <span class="keywordflow">return</span> VMA_SYSTEM_ALIGNED_MALLOC(size, alignment);</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;}</div><div class="line"><a name="l03463"></a><span class="lineno"> 3463</span>&#160;</div><div class="line"><a name="l03464"></a><span class="lineno"> 3464</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="l03465"></a><span class="lineno"> 3465</span>&#160;{</div><div class="line"><a name="l03466"></a><span class="lineno"> 3466</span>&#160;    <span class="keywordflow">if</span>((pAllocationCallbacks != VMA_NULL) &amp;&amp;</div><div class="line"><a name="l03467"></a><span class="lineno"> 3467</span>&#160;        (pAllocationCallbacks-&gt;pfnFree != VMA_NULL))</div><div class="line"><a name="l03468"></a><span class="lineno"> 3468</span>&#160;    {</div><div class="line"><a name="l03469"></a><span class="lineno"> 3469</span>&#160;        (*pAllocationCallbacks-&gt;pfnFree)(pAllocationCallbacks-&gt;pUserData, ptr);</div><div class="line"><a name="l03470"></a><span class="lineno"> 3470</span>&#160;    }</div><div class="line"><a name="l03471"></a><span class="lineno"> 3471</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l03472"></a><span class="lineno"> 3472</span>&#160;    {</div><div class="line"><a name="l03473"></a><span class="lineno"> 3473</span>&#160;        VMA_SYSTEM_FREE(ptr);</div><div class="line"><a name="l03474"></a><span class="lineno"> 3474</span>&#160;    }</div><div class="line"><a name="l03475"></a><span class="lineno"> 3475</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03478"></a><span class="lineno"> 3478</span>&#160;<span class="keyword">static</span> T* VmaAllocate(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks)</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;    <span class="keywordflow">return</span> (T*)VmaMalloc(pAllocationCallbacks, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</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;</div><div class="line"><a name="l03483"></a><span class="lineno"> 3483</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03484"></a><span class="lineno"> 3484</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="l03485"></a><span class="lineno"> 3485</span>&#160;{</div><div class="line"><a name="l03486"></a><span class="lineno"> 3486</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="l03487"></a><span class="lineno"> 3487</span>&#160;}</div><div class="line"><a name="l03488"></a><span class="lineno"> 3488</span>&#160;</div><div class="line"><a name="l03489"></a><span class="lineno"> 3489</span>&#160;<span class="preprocessor">#define vma_new(allocator, type)   new(VmaAllocate&lt;type&gt;(allocator))(type)</span></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;<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="l03492"></a><span class="lineno"> 3492</span>&#160;</div><div class="line"><a name="l03493"></a><span class="lineno"> 3493</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03494"></a><span class="lineno"> 3494</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="l03495"></a><span class="lineno"> 3495</span>&#160;{</div><div class="line"><a name="l03496"></a><span class="lineno"> 3496</span>&#160;    ptr-&gt;~T();</div><div class="line"><a name="l03497"></a><span class="lineno"> 3497</span>&#160;    VmaFree(pAllocationCallbacks, ptr);</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;</div><div class="line"><a name="l03500"></a><span class="lineno"> 3500</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03501"></a><span class="lineno"> 3501</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="l03502"></a><span class="lineno"> 3502</span>&#160;{</div><div class="line"><a name="l03503"></a><span class="lineno"> 3503</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</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">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</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;            ptr[i].~T();</div><div class="line"><a name="l03508"></a><span class="lineno"> 3508</span>&#160;        }</div><div class="line"><a name="l03509"></a><span class="lineno"> 3509</span>&#160;        VmaFree(pAllocationCallbacks, ptr);</div><div class="line"><a name="l03510"></a><span class="lineno"> 3510</span>&#160;    }</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;<span class="comment">// STL-compatible allocator.</span></div><div class="line"><a name="l03514"></a><span class="lineno"> 3514</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03515"></a><span class="lineno"> 3515</span>&#160;<span class="keyword">class </span>VmaStlAllocator</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">public</span>:</div><div class="line"><a name="l03518"></a><span class="lineno"> 3518</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pCallbacks;</div><div class="line"><a name="l03519"></a><span class="lineno"> 3519</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l03520"></a><span class="lineno"> 3520</span>&#160;    </div><div class="line"><a name="l03521"></a><span class="lineno"> 3521</span>&#160;    VmaStlAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pCallbacks) : m_pCallbacks(pCallbacks) { }</div><div class="line"><a name="l03522"></a><span class="lineno"> 3522</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="l03523"></a><span class="lineno"> 3523</span>&#160;</div><div class="line"><a name="l03524"></a><span class="lineno"> 3524</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="l03525"></a><span class="lineno"> 3525</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="l03526"></a><span class="lineno"> 3526</span>&#160;</div><div class="line"><a name="l03527"></a><span class="lineno"> 3527</span>&#160;    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l03528"></a><span class="lineno"> 3528</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="l03529"></a><span class="lineno"> 3529</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03530"></a><span class="lineno"> 3530</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks == rhs.m_pCallbacks;</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">template</span>&lt;<span class="keyword">typename</span> U&gt;</div><div class="line"><a name="l03533"></a><span class="lineno"> 3533</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="l03534"></a><span class="lineno"> 3534</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03535"></a><span class="lineno"> 3535</span>&#160;        <span class="keywordflow">return</span> m_pCallbacks != rhs.m_pCallbacks;</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;</div><div class="line"><a name="l03538"></a><span class="lineno"> 3538</span>&#160;    VmaStlAllocator&amp; operator=(<span class="keyword">const</span> VmaStlAllocator&amp; x) = <span class="keyword">delete</span>;</div><div class="line"><a name="l03539"></a><span class="lineno"> 3539</span>&#160;};</div><div class="line"><a name="l03540"></a><span class="lineno"> 3540</span>&#160;</div><div class="line"><a name="l03541"></a><span class="lineno"> 3541</span>&#160;<span class="preprocessor">#if VMA_USE_STL_VECTOR</span></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;<span class="preprocessor">#define VmaVector std::vector</span></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;<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="l03546"></a><span class="lineno"> 3546</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="l03547"></a><span class="lineno"> 3547</span>&#160;{</div><div class="line"><a name="l03548"></a><span class="lineno"> 3548</span>&#160;    vec.insert(vec.begin() + index, item);</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;</div><div class="line"><a name="l03551"></a><span class="lineno"> 3551</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="l03552"></a><span class="lineno"> 3552</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="l03553"></a><span class="lineno"> 3553</span>&#160;{</div><div class="line"><a name="l03554"></a><span class="lineno"> 3554</span>&#160;    vec.erase(vec.begin() + index);</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;</div><div class="line"><a name="l03557"></a><span class="lineno"> 3557</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_VECTOR</span></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;<span class="comment">/* Class with interface compatible with subset of std::vector.</span></div><div class="line"><a name="l03560"></a><span class="lineno"> 3560</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="l03561"></a><span class="lineno"> 3561</span>&#160;<span class="comment">used for these objects. */</span></div><div class="line"><a name="l03562"></a><span class="lineno"> 3562</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="l03563"></a><span class="lineno"> 3563</span>&#160;<span class="keyword">class </span>VmaVector</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;<span class="keyword">public</span>:</div><div class="line"><a name="l03566"></a><span class="lineno"> 3566</span>&#160;    <span class="keyword">typedef</span> T value_type;</div><div class="line"><a name="l03567"></a><span class="lineno"> 3567</span>&#160;</div><div class="line"><a name="l03568"></a><span class="lineno"> 3568</span>&#160;    VmaVector(<span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l03569"></a><span class="lineno"> 3569</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l03570"></a><span class="lineno"> 3570</span>&#160;        m_pArray(VMA_NULL),</div><div class="line"><a name="l03571"></a><span class="lineno"> 3571</span>&#160;        m_Count(0),</div><div class="line"><a name="l03572"></a><span class="lineno"> 3572</span>&#160;        m_Capacity(0)</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;</div><div class="line"><a name="l03576"></a><span class="lineno"> 3576</span>&#160;    VmaVector(<span class="keywordtype">size_t</span> count, <span class="keyword">const</span> AllocatorT&amp; allocator) :</div><div class="line"><a name="l03577"></a><span class="lineno"> 3577</span>&#160;        m_Allocator(allocator),</div><div class="line"><a name="l03578"></a><span class="lineno"> 3578</span>&#160;        m_pArray(count ? (T*)VmaAllocateArray&lt;T&gt;(allocator.m_pCallbacks, count) : VMA_NULL),</div><div class="line"><a name="l03579"></a><span class="lineno"> 3579</span>&#160;        m_Count(count),</div><div class="line"><a name="l03580"></a><span class="lineno"> 3580</span>&#160;        m_Capacity(count)</div><div class="line"><a name="l03581"></a><span class="lineno"> 3581</span>&#160;    {</div><div class="line"><a name="l03582"></a><span class="lineno"> 3582</span>&#160;    }</div><div class="line"><a name="l03583"></a><span class="lineno"> 3583</span>&#160;    </div><div class="line"><a name="l03584"></a><span class="lineno"> 3584</span>&#160;    VmaVector(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; src) :</div><div class="line"><a name="l03585"></a><span class="lineno"> 3585</span>&#160;        m_Allocator(src.m_Allocator),</div><div class="line"><a name="l03586"></a><span class="lineno"> 3586</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="l03587"></a><span class="lineno"> 3587</span>&#160;        m_Count(src.m_Count),</div><div class="line"><a name="l03588"></a><span class="lineno"> 3588</span>&#160;        m_Capacity(src.m_Count)</div><div class="line"><a name="l03589"></a><span class="lineno"> 3589</span>&#160;    {</div><div class="line"><a name="l03590"></a><span class="lineno"> 3590</span>&#160;        <span class="keywordflow">if</span>(m_Count != 0)</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;            memcpy(m_pArray, src.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</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;    }</div><div class="line"><a name="l03595"></a><span class="lineno"> 3595</span>&#160;    </div><div class="line"><a name="l03596"></a><span class="lineno"> 3596</span>&#160;    ~VmaVector()</div><div class="line"><a name="l03597"></a><span class="lineno"> 3597</span>&#160;    {</div><div class="line"><a name="l03598"></a><span class="lineno"> 3598</span>&#160;        VmaFree(m_Allocator.m_pCallbacks, m_pArray);</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;</div><div class="line"><a name="l03601"></a><span class="lineno"> 3601</span>&#160;    VmaVector&amp; operator=(<span class="keyword">const</span> VmaVector&lt;T, AllocatorT&gt;&amp; rhs)</div><div class="line"><a name="l03602"></a><span class="lineno"> 3602</span>&#160;    {</div><div class="line"><a name="l03603"></a><span class="lineno"> 3603</span>&#160;        <span class="keywordflow">if</span>(&amp;rhs != <span class="keyword">this</span>)</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;            resize(rhs.m_Count);</div><div class="line"><a name="l03606"></a><span class="lineno"> 3606</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</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;                memcpy(m_pArray, rhs.m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03609"></a><span class="lineno"> 3609</span>&#160;            }</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="keywordflow">return</span> *<span class="keyword">this</span>;</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;    </div><div class="line"><a name="l03614"></a><span class="lineno"> 3614</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="l03615"></a><span class="lineno"> 3615</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="l03616"></a><span class="lineno"> 3616</span>&#160;    T* data() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03617"></a><span class="lineno"> 3617</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="l03618"></a><span class="lineno"> 3618</span>&#160;    </div><div class="line"><a name="l03619"></a><span class="lineno"> 3619</span>&#160;    T&amp; operator[](<span class="keywordtype">size_t</span> index)</div><div class="line"><a name="l03620"></a><span class="lineno"> 3620</span>&#160;    {</div><div class="line"><a name="l03621"></a><span class="lineno"> 3621</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03622"></a><span class="lineno"> 3622</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l03623"></a><span class="lineno"> 3623</span>&#160;    }</div><div class="line"><a name="l03624"></a><span class="lineno"> 3624</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="l03625"></a><span class="lineno"> 3625</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03626"></a><span class="lineno"> 3626</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03627"></a><span class="lineno"> 3627</span>&#160;        <span class="keywordflow">return</span> m_pArray[index];</div><div class="line"><a name="l03628"></a><span class="lineno"> 3628</span>&#160;    }</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;    T&amp; front()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03633"></a><span class="lineno"> 3633</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</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="keyword">const</span> T&amp; front()<span class="keyword"> const</span></div><div class="line"><a name="l03636"></a><span class="lineno"> 3636</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03637"></a><span class="lineno"> 3637</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03638"></a><span class="lineno"> 3638</span>&#160;        <span class="keywordflow">return</span> m_pArray[0];</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;    T&amp; back()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03643"></a><span class="lineno"> 3643</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l03644"></a><span class="lineno"> 3644</span>&#160;    }</div><div class="line"><a name="l03645"></a><span class="lineno"> 3645</span>&#160;    <span class="keyword">const</span> T&amp; back()<span class="keyword"> const</span></div><div class="line"><a name="l03646"></a><span class="lineno"> 3646</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l03647"></a><span class="lineno"> 3647</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03648"></a><span class="lineno"> 3648</span>&#160;        <span class="keywordflow">return</span> m_pArray[m_Count - 1];</div><div class="line"><a name="l03649"></a><span class="lineno"> 3649</span>&#160;    }</div><div class="line"><a name="l03650"></a><span class="lineno"> 3650</span>&#160;</div><div class="line"><a name="l03651"></a><span class="lineno"> 3651</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="l03652"></a><span class="lineno"> 3652</span>&#160;    {</div><div class="line"><a name="l03653"></a><span class="lineno"> 3653</span>&#160;        newCapacity = VMA_MAX(newCapacity, m_Count);</div><div class="line"><a name="l03654"></a><span class="lineno"> 3654</span>&#160;        </div><div class="line"><a name="l03655"></a><span class="lineno"> 3655</span>&#160;        <span class="keywordflow">if</span>((newCapacity &lt; m_Capacity) &amp;&amp; !freeMemory)</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;            newCapacity = m_Capacity;</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;        </div><div class="line"><a name="l03660"></a><span class="lineno"> 3660</span>&#160;        <span class="keywordflow">if</span>(newCapacity != m_Capacity)</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;            T* <span class="keyword">const</span> newArray = newCapacity ? VmaAllocateArray&lt;T&gt;(m_Allocator, newCapacity) : VMA_NULL;</div><div class="line"><a name="l03663"></a><span class="lineno"> 3663</span>&#160;            <span class="keywordflow">if</span>(m_Count != 0)</div><div class="line"><a name="l03664"></a><span class="lineno"> 3664</span>&#160;            {</div><div class="line"><a name="l03665"></a><span class="lineno"> 3665</span>&#160;                memcpy(newArray, m_pArray, m_Count * <span class="keyword">sizeof</span>(T));</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;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03668"></a><span class="lineno"> 3668</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l03669"></a><span class="lineno"> 3669</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l03670"></a><span class="lineno"> 3670</span>&#160;        }</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;</div><div class="line"><a name="l03673"></a><span class="lineno"> 3673</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="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">size_t</span> newCapacity = m_Capacity;</div><div class="line"><a name="l03676"></a><span class="lineno"> 3676</span>&#160;        <span class="keywordflow">if</span>(newCount &gt; m_Capacity)</div><div class="line"><a name="l03677"></a><span class="lineno"> 3677</span>&#160;        {</div><div class="line"><a name="l03678"></a><span class="lineno"> 3678</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="l03679"></a><span class="lineno"> 3679</span>&#160;        }</div><div class="line"><a name="l03680"></a><span class="lineno"> 3680</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(freeMemory)</div><div class="line"><a name="l03681"></a><span class="lineno"> 3681</span>&#160;        {</div><div class="line"><a name="l03682"></a><span class="lineno"> 3682</span>&#160;            newCapacity = newCount;</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="keywordflow">if</span>(newCapacity != m_Capacity)</div><div class="line"><a name="l03686"></a><span class="lineno"> 3686</span>&#160;        {</div><div class="line"><a name="l03687"></a><span class="lineno"> 3687</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="l03688"></a><span class="lineno"> 3688</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="l03689"></a><span class="lineno"> 3689</span>&#160;            <span class="keywordflow">if</span>(elementsToCopy != 0)</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;                memcpy(newArray, m_pArray, elementsToCopy * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03692"></a><span class="lineno"> 3692</span>&#160;            }</div><div class="line"><a name="l03693"></a><span class="lineno"> 3693</span>&#160;            VmaFree(m_Allocator.m_pCallbacks, m_pArray);</div><div class="line"><a name="l03694"></a><span class="lineno"> 3694</span>&#160;            m_Capacity = newCapacity;</div><div class="line"><a name="l03695"></a><span class="lineno"> 3695</span>&#160;            m_pArray = newArray;</div><div class="line"><a name="l03696"></a><span class="lineno"> 3696</span>&#160;        }</div><div class="line"><a name="l03697"></a><span class="lineno"> 3697</span>&#160;</div><div class="line"><a name="l03698"></a><span class="lineno"> 3698</span>&#160;        m_Count = newCount;</div><div class="line"><a name="l03699"></a><span class="lineno"> 3699</span>&#160;    }</div><div class="line"><a name="l03700"></a><span class="lineno"> 3700</span>&#160;</div><div class="line"><a name="l03701"></a><span class="lineno"> 3701</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="l03702"></a><span class="lineno"> 3702</span>&#160;    {</div><div class="line"><a name="l03703"></a><span class="lineno"> 3703</span>&#160;        resize(0, freeMemory);</div><div class="line"><a name="l03704"></a><span class="lineno"> 3704</span>&#160;    }</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="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="l03707"></a><span class="lineno"> 3707</span>&#160;    {</div><div class="line"><a name="l03708"></a><span class="lineno"> 3708</span>&#160;        VMA_HEAVY_ASSERT(index &lt;= m_Count);</div><div class="line"><a name="l03709"></a><span class="lineno"> 3709</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l03710"></a><span class="lineno"> 3710</span>&#160;        resize(oldCount + 1);</div><div class="line"><a name="l03711"></a><span class="lineno"> 3711</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount)</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;            memmove(m_pArray + (index + 1), m_pArray + index, (oldCount - index) * <span class="keyword">sizeof</span>(T));</div><div class="line"><a name="l03714"></a><span class="lineno"> 3714</span>&#160;        }</div><div class="line"><a name="l03715"></a><span class="lineno"> 3715</span>&#160;        m_pArray[index] = src;</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;</div><div class="line"><a name="l03718"></a><span class="lineno"> 3718</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="l03719"></a><span class="lineno"> 3719</span>&#160;    {</div><div class="line"><a name="l03720"></a><span class="lineno"> 3720</span>&#160;        VMA_HEAVY_ASSERT(index &lt; m_Count);</div><div class="line"><a name="l03721"></a><span class="lineno"> 3721</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = size();</div><div class="line"><a name="l03722"></a><span class="lineno"> 3722</span>&#160;        <span class="keywordflow">if</span>(index &lt; oldCount - 1)</div><div class="line"><a name="l03723"></a><span class="lineno"> 3723</span>&#160;        {</div><div class="line"><a name="l03724"></a><span class="lineno"> 3724</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="l03725"></a><span class="lineno"> 3725</span>&#160;        }</div><div class="line"><a name="l03726"></a><span class="lineno"> 3726</span>&#160;        resize(oldCount - 1);</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;</div><div class="line"><a name="l03729"></a><span class="lineno"> 3729</span>&#160;    <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l03730"></a><span class="lineno"> 3730</span>&#160;    {</div><div class="line"><a name="l03731"></a><span class="lineno"> 3731</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> newIndex = size();</div><div class="line"><a name="l03732"></a><span class="lineno"> 3732</span>&#160;        resize(newIndex + 1);</div><div class="line"><a name="l03733"></a><span class="lineno"> 3733</span>&#160;        m_pArray[newIndex] = src;</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;</div><div class="line"><a name="l03736"></a><span class="lineno"> 3736</span>&#160;    <span class="keywordtype">void</span> pop_back()</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;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03739"></a><span class="lineno"> 3739</span>&#160;        resize(size() - 1);</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;</div><div class="line"><a name="l03742"></a><span class="lineno"> 3742</span>&#160;    <span class="keywordtype">void</span> push_front(<span class="keyword">const</span> T&amp; src)</div><div class="line"><a name="l03743"></a><span class="lineno"> 3743</span>&#160;    {</div><div class="line"><a name="l03744"></a><span class="lineno"> 3744</span>&#160;        insert(0, src);</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;</div><div class="line"><a name="l03747"></a><span class="lineno"> 3747</span>&#160;    <span class="keywordtype">void</span> pop_front()</div><div class="line"><a name="l03748"></a><span class="lineno"> 3748</span>&#160;    {</div><div class="line"><a name="l03749"></a><span class="lineno"> 3749</span>&#160;        VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l03750"></a><span class="lineno"> 3750</span>&#160;        <span class="keyword">remove</span>(0);</div><div class="line"><a name="l03751"></a><span class="lineno"> 3751</span>&#160;    }</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;    <span class="keyword">typedef</span> T* iterator;</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;    iterator begin() { <span class="keywordflow">return</span> m_pArray; }</div><div class="line"><a name="l03756"></a><span class="lineno"> 3756</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_pArray + m_Count; }</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;<span class="keyword">private</span>:</div><div class="line"><a name="l03759"></a><span class="lineno"> 3759</span>&#160;    AllocatorT m_Allocator;</div><div class="line"><a name="l03760"></a><span class="lineno"> 3760</span>&#160;    T* m_pArray;</div><div class="line"><a name="l03761"></a><span class="lineno"> 3761</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l03762"></a><span class="lineno"> 3762</span>&#160;    <span class="keywordtype">size_t</span> m_Capacity;</div><div class="line"><a name="l03763"></a><span class="lineno"> 3763</span>&#160;};</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;<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="l03766"></a><span class="lineno"> 3766</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="l03767"></a><span class="lineno"> 3767</span>&#160;{</div><div class="line"><a name="l03768"></a><span class="lineno"> 3768</span>&#160;    vec.insert(index, item);</div><div class="line"><a name="l03769"></a><span class="lineno"> 3769</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> allocatorT&gt;</div><div class="line"><a name="l03772"></a><span class="lineno"> 3772</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="l03773"></a><span class="lineno"> 3773</span>&#160;{</div><div class="line"><a name="l03774"></a><span class="lineno"> 3774</span>&#160;    vec.remove(index);</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;</div><div class="line"><a name="l03777"></a><span class="lineno"> 3777</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_VECTOR</span></div><div class="line"><a name="l03778"></a><span class="lineno"> 3778</span>&#160;</div><div class="line"><a name="l03779"></a><span class="lineno"> 3779</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="l03780"></a><span class="lineno"> 3780</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="l03781"></a><span class="lineno"> 3781</span>&#160;{</div><div class="line"><a name="l03782"></a><span class="lineno"> 3782</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03783"></a><span class="lineno"> 3783</span>&#160;        vector.data(),</div><div class="line"><a name="l03784"></a><span class="lineno"> 3784</span>&#160;        vector.data() + vector.size(),</div><div class="line"><a name="l03785"></a><span class="lineno"> 3785</span>&#160;        value,</div><div class="line"><a name="l03786"></a><span class="lineno"> 3786</span>&#160;        CmpLess()) - vector.data();</div><div class="line"><a name="l03787"></a><span class="lineno"> 3787</span>&#160;    VmaVectorInsert(vector, indexToInsert, value);</div><div class="line"><a name="l03788"></a><span class="lineno"> 3788</span>&#160;    <span class="keywordflow">return</span> indexToInsert;</div><div class="line"><a name="l03789"></a><span class="lineno"> 3789</span>&#160;}</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;<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="l03792"></a><span class="lineno"> 3792</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="l03793"></a><span class="lineno"> 3793</span>&#160;{</div><div class="line"><a name="l03794"></a><span class="lineno"> 3794</span>&#160;    CmpLess comparator;</div><div class="line"><a name="l03795"></a><span class="lineno"> 3795</span>&#160;    <span class="keyword">typename</span> VectorT::iterator it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l03796"></a><span class="lineno"> 3796</span>&#160;        vector.begin(),</div><div class="line"><a name="l03797"></a><span class="lineno"> 3797</span>&#160;        vector.end(),</div><div class="line"><a name="l03798"></a><span class="lineno"> 3798</span>&#160;        value,</div><div class="line"><a name="l03799"></a><span class="lineno"> 3799</span>&#160;        comparator);</div><div class="line"><a name="l03800"></a><span class="lineno"> 3800</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="l03801"></a><span class="lineno"> 3801</span>&#160;    {</div><div class="line"><a name="l03802"></a><span class="lineno"> 3802</span>&#160;        <span class="keywordtype">size_t</span> indexToRemove = it - vector.begin();</div><div class="line"><a name="l03803"></a><span class="lineno"> 3803</span>&#160;        VmaVectorRemove(vector, indexToRemove);</div><div class="line"><a name="l03804"></a><span class="lineno"> 3804</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l03805"></a><span class="lineno"> 3805</span>&#160;    }</div><div class="line"><a name="l03806"></a><span class="lineno"> 3806</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l03807"></a><span class="lineno"> 3807</span>&#160;}</div><div class="line"><a name="l03808"></a><span class="lineno"> 3808</span>&#160;</div><div class="line"><a name="l03809"></a><span class="lineno"> 3809</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> CmpLess, <span class="keyword">typename</span> IterT, <span class="keyword">typename</span> KeyT&gt;</div><div class="line"><a name="l03810"></a><span class="lineno"> 3810</span>&#160;IterT VmaVectorFindSorted(<span class="keyword">const</span> IterT&amp; beg, <span class="keyword">const</span> IterT&amp; end, <span class="keyword">const</span> KeyT&amp; value)</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;    CmpLess comparator;</div><div class="line"><a name="l03813"></a><span class="lineno"> 3813</span>&#160;    IterT it = VmaBinaryFindFirstNotLess&lt;CmpLess, IterT, KeyT&gt;(</div><div class="line"><a name="l03814"></a><span class="lineno"> 3814</span>&#160;        beg, end, value, comparator);</div><div class="line"><a name="l03815"></a><span class="lineno"> 3815</span>&#160;    <span class="keywordflow">if</span>(it == end ||</div><div class="line"><a name="l03816"></a><span class="lineno"> 3816</span>&#160;        (!comparator(*it, value) &amp;&amp; !comparator(value, *it)))</div><div class="line"><a name="l03817"></a><span class="lineno"> 3817</span>&#160;    {</div><div class="line"><a name="l03818"></a><span class="lineno"> 3818</span>&#160;        <span class="keywordflow">return</span> it;</div><div class="line"><a name="l03819"></a><span class="lineno"> 3819</span>&#160;    }</div><div class="line"><a name="l03820"></a><span class="lineno"> 3820</span>&#160;    <span class="keywordflow">return</span> end;</div><div class="line"><a name="l03821"></a><span class="lineno"> 3821</span>&#160;}</div><div class="line"><a name="l03822"></a><span class="lineno"> 3822</span>&#160;</div><div class="line"><a name="l03824"></a><span class="lineno"> 3824</span>&#160;<span class="comment">// class VmaPoolAllocator</span></div><div class="line"><a name="l03825"></a><span class="lineno"> 3825</span>&#160;</div><div class="line"><a name="l03826"></a><span class="lineno"> 3826</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l03827"></a><span class="lineno"> 3827</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="l03828"></a><span class="lineno"> 3828</span>&#160;<span class="comment">allocation. Number of elements that can be allocated is not bounded because</span></div><div class="line"><a name="l03829"></a><span class="lineno"> 3829</span>&#160;<span class="comment">allocator can create multiple blocks.</span></div><div class="line"><a name="l03830"></a><span class="lineno"> 3830</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l03831"></a><span class="lineno"> 3831</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03832"></a><span class="lineno"> 3832</span>&#160;<span class="keyword">class </span>VmaPoolAllocator</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;    VMA_CLASS_NO_COPY(VmaPoolAllocator)</div><div class="line"><a name="l03835"></a><span class="lineno"> 3835</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03836"></a><span class="lineno"> 3836</span>&#160;    VmaPoolAllocator(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, <span class="keywordtype">size_t</span> itemsPerBlock);</div><div class="line"><a name="l03837"></a><span class="lineno"> 3837</span>&#160;    ~VmaPoolAllocator();</div><div class="line"><a name="l03838"></a><span class="lineno"> 3838</span>&#160;    <span class="keywordtype">void</span> Clear();</div><div class="line"><a name="l03839"></a><span class="lineno"> 3839</span>&#160;    T* Alloc();</div><div class="line"><a name="l03840"></a><span class="lineno"> 3840</span>&#160;    <span class="keywordtype">void</span> Free(T* ptr);</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;<span class="keyword">private</span>:</div><div class="line"><a name="l03843"></a><span class="lineno"> 3843</span>&#160;    <span class="keyword">union </span>Item</div><div class="line"><a name="l03844"></a><span class="lineno"> 3844</span>&#160;    {</div><div class="line"><a name="l03845"></a><span class="lineno"> 3845</span>&#160;        uint32_t NextFreeIndex;</div><div class="line"><a name="l03846"></a><span class="lineno"> 3846</span>&#160;        T Value;</div><div class="line"><a name="l03847"></a><span class="lineno"> 3847</span>&#160;    };</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">struct </span>ItemBlock</div><div class="line"><a name="l03850"></a><span class="lineno"> 3850</span>&#160;    {</div><div class="line"><a name="l03851"></a><span class="lineno"> 3851</span>&#160;        Item* pItems;</div><div class="line"><a name="l03852"></a><span class="lineno"> 3852</span>&#160;        uint32_t FirstFreeIndex;</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;    </div><div class="line"><a name="l03855"></a><span class="lineno"> 3855</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l03856"></a><span class="lineno"> 3856</span>&#160;    <span class="keywordtype">size_t</span> m_ItemsPerBlock;</div><div class="line"><a name="l03857"></a><span class="lineno"> 3857</span>&#160;    VmaVector&lt; ItemBlock, VmaStlAllocator&lt;ItemBlock&gt; &gt; m_ItemBlocks;</div><div class="line"><a name="l03858"></a><span class="lineno"> 3858</span>&#160;</div><div class="line"><a name="l03859"></a><span class="lineno"> 3859</span>&#160;    ItemBlock&amp; CreateNewBlock();</div><div class="line"><a name="l03860"></a><span class="lineno"> 3860</span>&#160;};</div><div class="line"><a name="l03861"></a><span class="lineno"> 3861</span>&#160;</div><div class="line"><a name="l03862"></a><span class="lineno"> 3862</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03863"></a><span class="lineno"> 3863</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="l03864"></a><span class="lineno"> 3864</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l03865"></a><span class="lineno"> 3865</span>&#160;    m_ItemsPerBlock(itemsPerBlock),</div><div class="line"><a name="l03866"></a><span class="lineno"> 3866</span>&#160;    m_ItemBlocks(VmaStlAllocator&lt;ItemBlock&gt;(pAllocationCallbacks))</div><div class="line"><a name="l03867"></a><span class="lineno"> 3867</span>&#160;{</div><div class="line"><a name="l03868"></a><span class="lineno"> 3868</span>&#160;    VMA_ASSERT(itemsPerBlock &gt; 0);</div><div class="line"><a name="l03869"></a><span class="lineno"> 3869</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03872"></a><span class="lineno"> 3872</span>&#160;VmaPoolAllocator&lt;T&gt;::~VmaPoolAllocator()</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;    Clear();</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03878"></a><span class="lineno"> 3878</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Clear()</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;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03881"></a><span class="lineno"> 3881</span>&#160;        vma_delete_array(m_pAllocationCallbacks, m_ItemBlocks[i].pItems, m_ItemsPerBlock);</div><div class="line"><a name="l03882"></a><span class="lineno"> 3882</span>&#160;    m_ItemBlocks.clear();</div><div class="line"><a name="l03883"></a><span class="lineno"> 3883</span>&#160;}</div><div class="line"><a name="l03884"></a><span class="lineno"> 3884</span>&#160;</div><div class="line"><a name="l03885"></a><span class="lineno"> 3885</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03886"></a><span class="lineno"> 3886</span>&#160;T* VmaPoolAllocator&lt;T&gt;::Alloc()</div><div class="line"><a name="l03887"></a><span class="lineno"> 3887</span>&#160;{</div><div class="line"><a name="l03888"></a><span class="lineno"> 3888</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_ItemBlocks.size(); i--; )</div><div class="line"><a name="l03889"></a><span class="lineno"> 3889</span>&#160;    {</div><div class="line"><a name="l03890"></a><span class="lineno"> 3890</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03891"></a><span class="lineno"> 3891</span>&#160;        <span class="comment">// This block has some free items: Use first one.</span></div><div class="line"><a name="l03892"></a><span class="lineno"> 3892</span>&#160;        <span class="keywordflow">if</span>(block.FirstFreeIndex != UINT32_MAX)</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;            Item* <span class="keyword">const</span> pItem = &amp;block.pItems[block.FirstFreeIndex];</div><div class="line"><a name="l03895"></a><span class="lineno"> 3895</span>&#160;            block.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03896"></a><span class="lineno"> 3896</span>&#160;            <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</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;</div><div class="line"><a name="l03900"></a><span class="lineno"> 3900</span>&#160;    <span class="comment">// No block has free item: Create new one and use it.</span></div><div class="line"><a name="l03901"></a><span class="lineno"> 3901</span>&#160;    ItemBlock&amp; newBlock = CreateNewBlock();</div><div class="line"><a name="l03902"></a><span class="lineno"> 3902</span>&#160;    Item* <span class="keyword">const</span> pItem = &amp;newBlock.pItems[0];</div><div class="line"><a name="l03903"></a><span class="lineno"> 3903</span>&#160;    newBlock.FirstFreeIndex = pItem-&gt;NextFreeIndex;</div><div class="line"><a name="l03904"></a><span class="lineno"> 3904</span>&#160;    <span class="keywordflow">return</span> &amp;pItem-&gt;Value;</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;</div><div class="line"><a name="l03907"></a><span class="lineno"> 3907</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03908"></a><span class="lineno"> 3908</span>&#160;<span class="keywordtype">void</span> VmaPoolAllocator&lt;T&gt;::Free(T* ptr)</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;    <span class="comment">// Search all memory blocks to find ptr.</span></div><div class="line"><a name="l03911"></a><span class="lineno"> 3911</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="l03912"></a><span class="lineno"> 3912</span>&#160;    {</div><div class="line"><a name="l03913"></a><span class="lineno"> 3913</span>&#160;        ItemBlock&amp; block = m_ItemBlocks[i];</div><div class="line"><a name="l03914"></a><span class="lineno"> 3914</span>&#160;        </div><div class="line"><a name="l03915"></a><span class="lineno"> 3915</span>&#160;        <span class="comment">// Casting to union.</span></div><div class="line"><a name="l03916"></a><span class="lineno"> 3916</span>&#160;        Item* pItemPtr;</div><div class="line"><a name="l03917"></a><span class="lineno"> 3917</span>&#160;        memcpy(&amp;pItemPtr, &amp;ptr, <span class="keyword">sizeof</span>(pItemPtr));</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="comment">// Check if pItemPtr is in address range of this block.</span></div><div class="line"><a name="l03920"></a><span class="lineno"> 3920</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="l03921"></a><span class="lineno"> 3921</span>&#160;        {</div><div class="line"><a name="l03922"></a><span class="lineno"> 3922</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="l03923"></a><span class="lineno"> 3923</span>&#160;            pItemPtr-&gt;NextFreeIndex = block.FirstFreeIndex;</div><div class="line"><a name="l03924"></a><span class="lineno"> 3924</span>&#160;            block.FirstFreeIndex = index;</div><div class="line"><a name="l03925"></a><span class="lineno"> 3925</span>&#160;            <span class="keywordflow">return</span>;</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;    }</div><div class="line"><a name="l03928"></a><span class="lineno"> 3928</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="l03929"></a><span class="lineno"> 3929</span>&#160;}</div><div class="line"><a name="l03930"></a><span class="lineno"> 3930</span>&#160;</div><div class="line"><a name="l03931"></a><span class="lineno"> 3931</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03932"></a><span class="lineno"> 3932</span>&#160;<span class="keyword">typename</span> VmaPoolAllocator&lt;T&gt;::ItemBlock&amp; VmaPoolAllocator&lt;T&gt;::CreateNewBlock()</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;    ItemBlock newBlock = {</div><div class="line"><a name="l03935"></a><span class="lineno"> 3935</span>&#160;        vma_new_array(m_pAllocationCallbacks, Item, m_ItemsPerBlock), 0 };</div><div class="line"><a name="l03936"></a><span class="lineno"> 3936</span>&#160;</div><div class="line"><a name="l03937"></a><span class="lineno"> 3937</span>&#160;    m_ItemBlocks.push_back(newBlock);</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">// Setup singly-linked list of all free items in this block.</span></div><div class="line"><a name="l03940"></a><span class="lineno"> 3940</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; m_ItemsPerBlock - 1; ++i)</div><div class="line"><a name="l03941"></a><span class="lineno"> 3941</span>&#160;        newBlock.pItems[i].NextFreeIndex = i + 1;</div><div class="line"><a name="l03942"></a><span class="lineno"> 3942</span>&#160;    newBlock.pItems[m_ItemsPerBlock - 1].NextFreeIndex = UINT32_MAX;</div><div class="line"><a name="l03943"></a><span class="lineno"> 3943</span>&#160;    <span class="keywordflow">return</span> m_ItemBlocks.back();</div><div class="line"><a name="l03944"></a><span class="lineno"> 3944</span>&#160;}</div><div class="line"><a name="l03945"></a><span class="lineno"> 3945</span>&#160;</div><div class="line"><a name="l03947"></a><span class="lineno"> 3947</span>&#160;<span class="comment">// class VmaRawList, VmaList</span></div><div class="line"><a name="l03948"></a><span class="lineno"> 3948</span>&#160;</div><div class="line"><a name="l03949"></a><span class="lineno"> 3949</span>&#160;<span class="preprocessor">#if VMA_USE_STL_LIST</span></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="preprocessor">#define VmaList std::list</span></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;<span class="preprocessor">#else // #if VMA_USE_STL_LIST</span></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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03956"></a><span class="lineno"> 3956</span>&#160;<span class="keyword">struct </span>VmaListItem</div><div class="line"><a name="l03957"></a><span class="lineno"> 3957</span>&#160;{</div><div class="line"><a name="l03958"></a><span class="lineno"> 3958</span>&#160;    VmaListItem* pPrev;</div><div class="line"><a name="l03959"></a><span class="lineno"> 3959</span>&#160;    VmaListItem* pNext;</div><div class="line"><a name="l03960"></a><span class="lineno"> 3960</span>&#160;    T Value;</div><div class="line"><a name="l03961"></a><span class="lineno"> 3961</span>&#160;};</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;<span class="comment">// Doubly linked list.</span></div><div class="line"><a name="l03964"></a><span class="lineno"> 3964</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l03965"></a><span class="lineno"> 3965</span>&#160;<span class="keyword">class </span>VmaRawList</div><div class="line"><a name="l03966"></a><span class="lineno"> 3966</span>&#160;{</div><div class="line"><a name="l03967"></a><span class="lineno"> 3967</span>&#160;    VMA_CLASS_NO_COPY(VmaRawList)</div><div class="line"><a name="l03968"></a><span class="lineno"> 3968</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l03969"></a><span class="lineno"> 3969</span>&#160;    <span class="keyword">typedef</span> VmaListItem&lt;T&gt; ItemType;</div><div class="line"><a name="l03970"></a><span class="lineno"> 3970</span>&#160;</div><div class="line"><a name="l03971"></a><span class="lineno"> 3971</span>&#160;    VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks);</div><div class="line"><a name="l03972"></a><span class="lineno"> 3972</span>&#160;    ~VmaRawList();</div><div class="line"><a name="l03973"></a><span class="lineno"> 3973</span>&#160;    <span class="keywordtype">void</span> Clear();</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;    <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="l03976"></a><span class="lineno"> 3976</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="l03977"></a><span class="lineno"> 3977</span>&#160;</div><div class="line"><a name="l03978"></a><span class="lineno"> 3978</span>&#160;    ItemType* Front() { <span class="keywordflow">return</span> m_pFront; }</div><div class="line"><a name="l03979"></a><span class="lineno"> 3979</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="l03980"></a><span class="lineno"> 3980</span>&#160;    ItemType* Back() { <span class="keywordflow">return</span> m_pBack; }</div><div class="line"><a name="l03981"></a><span class="lineno"> 3981</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="l03982"></a><span class="lineno"> 3982</span>&#160;</div><div class="line"><a name="l03983"></a><span class="lineno"> 3983</span>&#160;    ItemType* PushBack();</div><div class="line"><a name="l03984"></a><span class="lineno"> 3984</span>&#160;    ItemType* PushFront();</div><div class="line"><a name="l03985"></a><span class="lineno"> 3985</span>&#160;    ItemType* PushBack(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03986"></a><span class="lineno"> 3986</span>&#160;    ItemType* PushFront(<span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03987"></a><span class="lineno"> 3987</span>&#160;    <span class="keywordtype">void</span> PopBack();</div><div class="line"><a name="l03988"></a><span class="lineno"> 3988</span>&#160;    <span class="keywordtype">void</span> PopFront();</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="comment">// Item can be null - it means PushBack.</span></div><div class="line"><a name="l03991"></a><span class="lineno"> 3991</span>&#160;    ItemType* InsertBefore(ItemType* pItem);</div><div class="line"><a name="l03992"></a><span class="lineno"> 3992</span>&#160;    <span class="comment">// Item can be null - it means PushFront.</span></div><div class="line"><a name="l03993"></a><span class="lineno"> 3993</span>&#160;    ItemType* InsertAfter(ItemType* pItem);</div><div class="line"><a name="l03994"></a><span class="lineno"> 3994</span>&#160;</div><div class="line"><a name="l03995"></a><span class="lineno"> 3995</span>&#160;    ItemType* InsertBefore(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</div><div class="line"><a name="l03996"></a><span class="lineno"> 3996</span>&#160;    ItemType* InsertAfter(ItemType* pItem, <span class="keyword">const</span> T&amp; value);</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="keywordtype">void</span> Remove(ItemType* pItem);</div><div class="line"><a name="l03999"></a><span class="lineno"> 3999</span>&#160;</div><div class="line"><a name="l04000"></a><span class="lineno"> 4000</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04001"></a><span class="lineno"> 4001</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* <span class="keyword">const</span> m_pAllocationCallbacks;</div><div class="line"><a name="l04002"></a><span class="lineno"> 4002</span>&#160;    VmaPoolAllocator&lt;ItemType&gt; m_ItemAllocator;</div><div class="line"><a name="l04003"></a><span class="lineno"> 4003</span>&#160;    ItemType* m_pFront;</div><div class="line"><a name="l04004"></a><span class="lineno"> 4004</span>&#160;    ItemType* m_pBack;</div><div class="line"><a name="l04005"></a><span class="lineno"> 4005</span>&#160;    <span class="keywordtype">size_t</span> m_Count;</div><div class="line"><a name="l04006"></a><span class="lineno"> 4006</span>&#160;};</div><div class="line"><a name="l04007"></a><span class="lineno"> 4007</span>&#160;</div><div class="line"><a name="l04008"></a><span class="lineno"> 4008</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04009"></a><span class="lineno"> 4009</span>&#160;VmaRawList&lt;T&gt;::VmaRawList(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l04010"></a><span class="lineno"> 4010</span>&#160;    m_pAllocationCallbacks(pAllocationCallbacks),</div><div class="line"><a name="l04011"></a><span class="lineno"> 4011</span>&#160;    m_ItemAllocator(pAllocationCallbacks, 128),</div><div class="line"><a name="l04012"></a><span class="lineno"> 4012</span>&#160;    m_pFront(VMA_NULL),</div><div class="line"><a name="l04013"></a><span class="lineno"> 4013</span>&#160;    m_pBack(VMA_NULL),</div><div class="line"><a name="l04014"></a><span class="lineno"> 4014</span>&#160;    m_Count(0)</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;}</div><div class="line"><a name="l04017"></a><span class="lineno"> 4017</span>&#160;</div><div class="line"><a name="l04018"></a><span class="lineno"> 4018</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04019"></a><span class="lineno"> 4019</span>&#160;VmaRawList&lt;T&gt;::~VmaRawList()</div><div class="line"><a name="l04020"></a><span class="lineno"> 4020</span>&#160;{</div><div class="line"><a name="l04021"></a><span class="lineno"> 4021</span>&#160;    <span class="comment">// Intentionally not calling Clear, because that would be unnecessary</span></div><div class="line"><a name="l04022"></a><span class="lineno"> 4022</span>&#160;    <span class="comment">// computations to return all items to m_ItemAllocator as free.</span></div><div class="line"><a name="l04023"></a><span class="lineno"> 4023</span>&#160;}</div><div class="line"><a name="l04024"></a><span class="lineno"> 4024</span>&#160;</div><div class="line"><a name="l04025"></a><span class="lineno"> 4025</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04026"></a><span class="lineno"> 4026</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Clear()</div><div class="line"><a name="l04027"></a><span class="lineno"> 4027</span>&#160;{</div><div class="line"><a name="l04028"></a><span class="lineno"> 4028</span>&#160;    <span class="keywordflow">if</span>(IsEmpty() == <span class="keyword">false</span>)</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;        ItemType* pItem = m_pBack;</div><div class="line"><a name="l04031"></a><span class="lineno"> 4031</span>&#160;        <span class="keywordflow">while</span>(pItem != VMA_NULL)</div><div class="line"><a name="l04032"></a><span class="lineno"> 4032</span>&#160;        {</div><div class="line"><a name="l04033"></a><span class="lineno"> 4033</span>&#160;            ItemType* <span class="keyword">const</span> pPrevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l04034"></a><span class="lineno"> 4034</span>&#160;            m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l04035"></a><span class="lineno"> 4035</span>&#160;            pItem = pPrevItem;</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;        m_pFront = VMA_NULL;</div><div class="line"><a name="l04038"></a><span class="lineno"> 4038</span>&#160;        m_pBack = VMA_NULL;</div><div class="line"><a name="l04039"></a><span class="lineno"> 4039</span>&#160;        m_Count = 0;</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;}</div><div class="line"><a name="l04042"></a><span class="lineno"> 4042</span>&#160;</div><div class="line"><a name="l04043"></a><span class="lineno"> 4043</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04044"></a><span class="lineno"> 4044</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushBack()</div><div class="line"><a name="l04045"></a><span class="lineno"> 4045</span>&#160;{</div><div class="line"><a name="l04046"></a><span class="lineno"> 4046</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04047"></a><span class="lineno"> 4047</span>&#160;    pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l04048"></a><span class="lineno"> 4048</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l04049"></a><span class="lineno"> 4049</span>&#160;    {</div><div class="line"><a name="l04050"></a><span class="lineno"> 4050</span>&#160;        pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l04051"></a><span class="lineno"> 4051</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l04052"></a><span class="lineno"> 4052</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l04053"></a><span class="lineno"> 4053</span>&#160;        m_Count = 1;</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="keywordflow">else</span></div><div class="line"><a name="l04056"></a><span class="lineno"> 4056</span>&#160;    {</div><div class="line"><a name="l04057"></a><span class="lineno"> 4057</span>&#160;        pNewItem-&gt;pPrev = m_pBack;</div><div class="line"><a name="l04058"></a><span class="lineno"> 4058</span>&#160;        m_pBack-&gt;pNext = pNewItem;</div><div class="line"><a name="l04059"></a><span class="lineno"> 4059</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l04060"></a><span class="lineno"> 4060</span>&#160;        ++m_Count;</div><div class="line"><a name="l04061"></a><span class="lineno"> 4061</span>&#160;    }</div><div class="line"><a name="l04062"></a><span class="lineno"> 4062</span>&#160;    <span class="keywordflow">return</span> pNewItem;</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;</div><div class="line"><a name="l04065"></a><span class="lineno"> 4065</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04066"></a><span class="lineno"> 4066</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::PushFront()</div><div class="line"><a name="l04067"></a><span class="lineno"> 4067</span>&#160;{</div><div class="line"><a name="l04068"></a><span class="lineno"> 4068</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04069"></a><span class="lineno"> 4069</span>&#160;    pNewItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l04070"></a><span class="lineno"> 4070</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l04071"></a><span class="lineno"> 4071</span>&#160;    {</div><div class="line"><a name="l04072"></a><span class="lineno"> 4072</span>&#160;        pNewItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l04073"></a><span class="lineno"> 4073</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l04074"></a><span class="lineno"> 4074</span>&#160;        m_pBack = pNewItem;</div><div class="line"><a name="l04075"></a><span class="lineno"> 4075</span>&#160;        m_Count = 1;</div><div class="line"><a name="l04076"></a><span class="lineno"> 4076</span>&#160;    }</div><div class="line"><a name="l04077"></a><span class="lineno"> 4077</span>&#160;    <span class="keywordflow">else</span></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;        pNewItem-&gt;pNext = m_pFront;</div><div class="line"><a name="l04080"></a><span class="lineno"> 4080</span>&#160;        m_pFront-&gt;pPrev = pNewItem;</div><div class="line"><a name="l04081"></a><span class="lineno"> 4081</span>&#160;        m_pFront = pNewItem;</div><div class="line"><a name="l04082"></a><span class="lineno"> 4082</span>&#160;        ++m_Count;</div><div class="line"><a name="l04083"></a><span class="lineno"> 4083</span>&#160;    }</div><div class="line"><a name="l04084"></a><span class="lineno"> 4084</span>&#160;    <span class="keywordflow">return</span> pNewItem;</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;</div><div class="line"><a name="l04087"></a><span class="lineno"> 4087</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04088"></a><span class="lineno"> 4088</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="l04089"></a><span class="lineno"> 4089</span>&#160;{</div><div class="line"><a name="l04090"></a><span class="lineno"> 4090</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushBack();</div><div class="line"><a name="l04091"></a><span class="lineno"> 4091</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l04092"></a><span class="lineno"> 4092</span>&#160;    <span class="keywordflow">return</span> pNewItem;</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;</div><div class="line"><a name="l04095"></a><span class="lineno"> 4095</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04096"></a><span class="lineno"> 4096</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="l04097"></a><span class="lineno"> 4097</span>&#160;{</div><div class="line"><a name="l04098"></a><span class="lineno"> 4098</span>&#160;    ItemType* <span class="keyword">const</span> pNewItem = PushFront();</div><div class="line"><a name="l04099"></a><span class="lineno"> 4099</span>&#160;    pNewItem-&gt;Value = value;</div><div class="line"><a name="l04100"></a><span class="lineno"> 4100</span>&#160;    <span class="keywordflow">return</span> pNewItem;</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;</div><div class="line"><a name="l04103"></a><span class="lineno"> 4103</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04104"></a><span class="lineno"> 4104</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopBack()</div><div class="line"><a name="l04105"></a><span class="lineno"> 4105</span>&#160;{</div><div class="line"><a name="l04106"></a><span class="lineno"> 4106</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04107"></a><span class="lineno"> 4107</span>&#160;    ItemType* <span class="keyword">const</span> pBackItem = m_pBack;</div><div class="line"><a name="l04108"></a><span class="lineno"> 4108</span>&#160;    ItemType* <span class="keyword">const</span> pPrevItem = pBackItem-&gt;pPrev;</div><div class="line"><a name="l04109"></a><span class="lineno"> 4109</span>&#160;    <span class="keywordflow">if</span>(pPrevItem != VMA_NULL)</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;        pPrevItem-&gt;pNext = VMA_NULL;</div><div class="line"><a name="l04112"></a><span class="lineno"> 4112</span>&#160;    }</div><div class="line"><a name="l04113"></a><span class="lineno"> 4113</span>&#160;    m_pBack = pPrevItem;</div><div class="line"><a name="l04114"></a><span class="lineno"> 4114</span>&#160;    m_ItemAllocator.Free(pBackItem);</div><div class="line"><a name="l04115"></a><span class="lineno"> 4115</span>&#160;    --m_Count;</div><div class="line"><a name="l04116"></a><span class="lineno"> 4116</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04119"></a><span class="lineno"> 4119</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::PopFront()</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;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</div><div class="line"><a name="l04122"></a><span class="lineno"> 4122</span>&#160;    ItemType* <span class="keyword">const</span> pFrontItem = m_pFront;</div><div class="line"><a name="l04123"></a><span class="lineno"> 4123</span>&#160;    ItemType* <span class="keyword">const</span> pNextItem = pFrontItem-&gt;pNext;</div><div class="line"><a name="l04124"></a><span class="lineno"> 4124</span>&#160;    <span class="keywordflow">if</span>(pNextItem != VMA_NULL)</div><div class="line"><a name="l04125"></a><span class="lineno"> 4125</span>&#160;    {</div><div class="line"><a name="l04126"></a><span class="lineno"> 4126</span>&#160;        pNextItem-&gt;pPrev = VMA_NULL;</div><div class="line"><a name="l04127"></a><span class="lineno"> 4127</span>&#160;    }</div><div class="line"><a name="l04128"></a><span class="lineno"> 4128</span>&#160;    m_pFront = pNextItem;</div><div class="line"><a name="l04129"></a><span class="lineno"> 4129</span>&#160;    m_ItemAllocator.Free(pFrontItem);</div><div class="line"><a name="l04130"></a><span class="lineno"> 4130</span>&#160;    --m_Count;</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">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04134"></a><span class="lineno"> 4134</span>&#160;<span class="keywordtype">void</span> VmaRawList&lt;T&gt;::Remove(ItemType* pItem)</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;    VMA_HEAVY_ASSERT(pItem != VMA_NULL);</div><div class="line"><a name="l04137"></a><span class="lineno"> 4137</span>&#160;    VMA_HEAVY_ASSERT(m_Count &gt; 0);</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="keywordflow">if</span>(pItem-&gt;pPrev != VMA_NULL)</div><div class="line"><a name="l04140"></a><span class="lineno"> 4140</span>&#160;    {</div><div class="line"><a name="l04141"></a><span class="lineno"> 4141</span>&#160;        pItem-&gt;pPrev-&gt;pNext = pItem-&gt;pNext;</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;    <span class="keywordflow">else</span></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_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l04146"></a><span class="lineno"> 4146</span>&#160;        m_pFront = pItem-&gt;pNext;</div><div class="line"><a name="l04147"></a><span class="lineno"> 4147</span>&#160;    }</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;    <span class="keywordflow">if</span>(pItem-&gt;pNext != VMA_NULL)</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;        pItem-&gt;pNext-&gt;pPrev = pItem-&gt;pPrev;</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;    <span class="keywordflow">else</span></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;        VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l04156"></a><span class="lineno"> 4156</span>&#160;        m_pBack = pItem-&gt;pPrev;</div><div class="line"><a name="l04157"></a><span class="lineno"> 4157</span>&#160;    }</div><div class="line"><a name="l04158"></a><span class="lineno"> 4158</span>&#160;</div><div class="line"><a name="l04159"></a><span class="lineno"> 4159</span>&#160;    m_ItemAllocator.Free(pItem);</div><div class="line"><a name="l04160"></a><span class="lineno"> 4160</span>&#160;    --m_Count;</div><div class="line"><a name="l04161"></a><span class="lineno"> 4161</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04164"></a><span class="lineno"> 4164</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertBefore(ItemType* pItem)</div><div class="line"><a name="l04165"></a><span class="lineno"> 4165</span>&#160;{</div><div class="line"><a name="l04166"></a><span class="lineno"> 4166</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</div><div class="line"><a name="l04167"></a><span class="lineno"> 4167</span>&#160;    {</div><div class="line"><a name="l04168"></a><span class="lineno"> 4168</span>&#160;        ItemType* <span class="keyword">const</span> prevItem = pItem-&gt;pPrev;</div><div class="line"><a name="l04169"></a><span class="lineno"> 4169</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04170"></a><span class="lineno"> 4170</span>&#160;        newItem-&gt;pPrev = prevItem;</div><div class="line"><a name="l04171"></a><span class="lineno"> 4171</span>&#160;        newItem-&gt;pNext = pItem;</div><div class="line"><a name="l04172"></a><span class="lineno"> 4172</span>&#160;        pItem-&gt;pPrev = newItem;</div><div class="line"><a name="l04173"></a><span class="lineno"> 4173</span>&#160;        <span class="keywordflow">if</span>(prevItem != VMA_NULL)</div><div class="line"><a name="l04174"></a><span class="lineno"> 4174</span>&#160;        {</div><div class="line"><a name="l04175"></a><span class="lineno"> 4175</span>&#160;            prevItem-&gt;pNext = newItem;</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="keywordflow">else</span></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;            VMA_HEAVY_ASSERT(m_pFront == pItem);</div><div class="line"><a name="l04180"></a><span class="lineno"> 4180</span>&#160;            m_pFront = newItem;</div><div class="line"><a name="l04181"></a><span class="lineno"> 4181</span>&#160;        }</div><div class="line"><a name="l04182"></a><span class="lineno"> 4182</span>&#160;        ++m_Count;</div><div class="line"><a name="l04183"></a><span class="lineno"> 4183</span>&#160;        <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l04184"></a><span class="lineno"> 4184</span>&#160;    }</div><div class="line"><a name="l04185"></a><span class="lineno"> 4185</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04186"></a><span class="lineno"> 4186</span>&#160;        <span class="keywordflow">return</span> PushBack();</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">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04190"></a><span class="lineno"> 4190</span>&#160;VmaListItem&lt;T&gt;* VmaRawList&lt;T&gt;::InsertAfter(ItemType* pItem)</div><div class="line"><a name="l04191"></a><span class="lineno"> 4191</span>&#160;{</div><div class="line"><a name="l04192"></a><span class="lineno"> 4192</span>&#160;    <span class="keywordflow">if</span>(pItem != VMA_NULL)</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;        ItemType* <span class="keyword">const</span> nextItem = pItem-&gt;pNext;</div><div class="line"><a name="l04195"></a><span class="lineno"> 4195</span>&#160;        ItemType* <span class="keyword">const</span> newItem = m_ItemAllocator.Alloc();</div><div class="line"><a name="l04196"></a><span class="lineno"> 4196</span>&#160;        newItem-&gt;pNext = nextItem;</div><div class="line"><a name="l04197"></a><span class="lineno"> 4197</span>&#160;        newItem-&gt;pPrev = pItem;</div><div class="line"><a name="l04198"></a><span class="lineno"> 4198</span>&#160;        pItem-&gt;pNext = newItem;</div><div class="line"><a name="l04199"></a><span class="lineno"> 4199</span>&#160;        <span class="keywordflow">if</span>(nextItem != VMA_NULL)</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;            nextItem-&gt;pPrev = newItem;</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">else</span></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;            VMA_HEAVY_ASSERT(m_pBack == pItem);</div><div class="line"><a name="l04206"></a><span class="lineno"> 4206</span>&#160;            m_pBack = newItem;</div><div class="line"><a name="l04207"></a><span class="lineno"> 4207</span>&#160;        }</div><div class="line"><a name="l04208"></a><span class="lineno"> 4208</span>&#160;        ++m_Count;</div><div class="line"><a name="l04209"></a><span class="lineno"> 4209</span>&#160;        <span class="keywordflow">return</span> newItem;</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l04212"></a><span class="lineno"> 4212</span>&#160;        <span class="keywordflow">return</span> PushFront();</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;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04216"></a><span class="lineno"> 4216</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="l04217"></a><span class="lineno"> 4217</span>&#160;{</div><div class="line"><a name="l04218"></a><span class="lineno"> 4218</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertBefore(pItem);</div><div class="line"><a name="l04219"></a><span class="lineno"> 4219</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l04220"></a><span class="lineno"> 4220</span>&#160;    <span class="keywordflow">return</span> newItem;</div><div class="line"><a name="l04221"></a><span class="lineno"> 4221</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l04224"></a><span class="lineno"> 4224</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="l04225"></a><span class="lineno"> 4225</span>&#160;{</div><div class="line"><a name="l04226"></a><span class="lineno"> 4226</span>&#160;    ItemType* <span class="keyword">const</span> newItem = InsertAfter(pItem);</div><div class="line"><a name="l04227"></a><span class="lineno"> 4227</span>&#160;    newItem-&gt;Value = value;</div><div class="line"><a name="l04228"></a><span class="lineno"> 4228</span>&#160;    <span class="keywordflow">return</span> newItem;</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;</div><div class="line"><a name="l04231"></a><span class="lineno"> 4231</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="l04232"></a><span class="lineno"> 4232</span>&#160;<span class="keyword">class </span>VmaList</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;    VMA_CLASS_NO_COPY(VmaList)</div><div class="line"><a name="l04235"></a><span class="lineno"> 4235</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04236"></a><span class="lineno"> 4236</span>&#160;    <span class="keyword">class </span>iterator</div><div class="line"><a name="l04237"></a><span class="lineno"> 4237</span>&#160;    {</div><div class="line"><a name="l04238"></a><span class="lineno"> 4238</span>&#160;    <span class="keyword">public</span>:</div><div class="line"><a name="l04239"></a><span class="lineno"> 4239</span>&#160;        iterator() :</div><div class="line"><a name="l04240"></a><span class="lineno"> 4240</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l04241"></a><span class="lineno"> 4241</span>&#160;            m_pItem(VMA_NULL)</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;        }</div><div class="line"><a name="l04244"></a><span class="lineno"> 4244</span>&#160;</div><div class="line"><a name="l04245"></a><span class="lineno"> 4245</span>&#160;        T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l04246"></a><span class="lineno"> 4246</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04247"></a><span class="lineno"> 4247</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04248"></a><span class="lineno"> 4248</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</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;        T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l04251"></a><span class="lineno"> 4251</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04252"></a><span class="lineno"> 4252</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04253"></a><span class="lineno"> 4253</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</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;</div><div class="line"><a name="l04256"></a><span class="lineno"> 4256</span>&#160;        iterator&amp; operator++()</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;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04259"></a><span class="lineno"> 4259</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l04260"></a><span class="lineno"> 4260</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</div><div class="line"><a name="l04261"></a><span class="lineno"> 4261</span>&#160;        }</div><div class="line"><a name="l04262"></a><span class="lineno"> 4262</span>&#160;        iterator&amp; operator--()</div><div class="line"><a name="l04263"></a><span class="lineno"> 4263</span>&#160;        {</div><div class="line"><a name="l04264"></a><span class="lineno"> 4264</span>&#160;            <span class="keywordflow">if</span>(m_pItem != VMA_NULL)</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;                m_pItem = m_pItem-&gt;pPrev;</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="keywordflow">else</span></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;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l04271"></a><span class="lineno"> 4271</span>&#160;                m_pItem = m_pList-&gt;Back();</div><div class="line"><a name="l04272"></a><span class="lineno"> 4272</span>&#160;            }</div><div class="line"><a name="l04273"></a><span class="lineno"> 4273</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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;        iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l04277"></a><span class="lineno"> 4277</span>&#160;        {</div><div class="line"><a name="l04278"></a><span class="lineno"> 4278</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04279"></a><span class="lineno"> 4279</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l04280"></a><span class="lineno"> 4280</span>&#160;            <span class="keywordflow">return</span> result;</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;        iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l04283"></a><span class="lineno"> 4283</span>&#160;        {</div><div class="line"><a name="l04284"></a><span class="lineno"> 4284</span>&#160;            iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04285"></a><span class="lineno"> 4285</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l04286"></a><span class="lineno"> 4286</span>&#160;            <span class="keywordflow">return</span> result;</div><div class="line"><a name="l04287"></a><span class="lineno"> 4287</span>&#160;        }</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="keywordtype">bool</span> operator==(<span class="keyword">const</span> iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04290"></a><span class="lineno"> 4290</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04291"></a><span class="lineno"> 4291</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04292"></a><span class="lineno"> 4292</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</div><div class="line"><a name="l04293"></a><span class="lineno"> 4293</span>&#160;        }</div><div class="line"><a name="l04294"></a><span class="lineno"> 4294</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="l04295"></a><span class="lineno"> 4295</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04296"></a><span class="lineno"> 4296</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04297"></a><span class="lineno"> 4297</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</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="keyword">private</span>:</div><div class="line"><a name="l04301"></a><span class="lineno"> 4301</span>&#160;        VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l04302"></a><span class="lineno"> 4302</span>&#160;        VmaListItem&lt;T&gt;* m_pItem;</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;        iterator(VmaRawList&lt;T&gt;* pList, VmaListItem&lt;T&gt;* pItem) :</div><div class="line"><a name="l04305"></a><span class="lineno"> 4305</span>&#160;            m_pList(pList),</div><div class="line"><a name="l04306"></a><span class="lineno"> 4306</span>&#160;            m_pItem(pItem)</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;        }</div><div class="line"><a name="l04309"></a><span class="lineno"> 4309</span>&#160;</div><div class="line"><a name="l04310"></a><span class="lineno"> 4310</span>&#160;        <span class="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</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">class </span>const_iterator</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="keyword">public</span>:</div><div class="line"><a name="l04316"></a><span class="lineno"> 4316</span>&#160;        const_iterator() :</div><div class="line"><a name="l04317"></a><span class="lineno"> 4317</span>&#160;            m_pList(VMA_NULL),</div><div class="line"><a name="l04318"></a><span class="lineno"> 4318</span>&#160;            m_pItem(VMA_NULL)</div><div class="line"><a name="l04319"></a><span class="lineno"> 4319</span>&#160;        {</div><div class="line"><a name="l04320"></a><span class="lineno"> 4320</span>&#160;        }</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;        const_iterator(<span class="keyword">const</span> iterator&amp; src) :</div><div class="line"><a name="l04323"></a><span class="lineno"> 4323</span>&#160;            m_pList(src.m_pList),</div><div class="line"><a name="l04324"></a><span class="lineno"> 4324</span>&#160;            m_pItem(src.m_pItem)</div><div class="line"><a name="l04325"></a><span class="lineno"> 4325</span>&#160;        {</div><div class="line"><a name="l04326"></a><span class="lineno"> 4326</span>&#160;        }</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;        <span class="keyword">const</span> T&amp; operator*()<span class="keyword"> const</span></div><div class="line"><a name="l04329"></a><span class="lineno"> 4329</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04330"></a><span class="lineno"> 4330</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04331"></a><span class="lineno"> 4331</span>&#160;            <span class="keywordflow">return</span> m_pItem-&gt;Value;</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="keyword">const</span> T* operator-&gt;()<span class="keyword"> const</span></div><div class="line"><a name="l04334"></a><span class="lineno"> 4334</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04335"></a><span class="lineno"> 4335</span>&#160;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04336"></a><span class="lineno"> 4336</span>&#160;            <span class="keywordflow">return</span> &amp;m_pItem-&gt;Value;</div><div class="line"><a name="l04337"></a><span class="lineno"> 4337</span>&#160;        }</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;        const_iterator&amp; operator++()</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;            VMA_HEAVY_ASSERT(m_pItem != VMA_NULL);</div><div class="line"><a name="l04342"></a><span class="lineno"> 4342</span>&#160;            m_pItem = m_pItem-&gt;pNext;</div><div class="line"><a name="l04343"></a><span class="lineno"> 4343</span>&#160;            <span class="keywordflow">return</span> *<span class="keyword">this</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;        const_iterator&amp; operator--()</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="keywordflow">if</span>(m_pItem != VMA_NULL)</div><div class="line"><a name="l04348"></a><span class="lineno"> 4348</span>&#160;            {</div><div class="line"><a name="l04349"></a><span class="lineno"> 4349</span>&#160;                m_pItem = m_pItem-&gt;pPrev;</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;            <span class="keywordflow">else</span></div><div class="line"><a name="l04352"></a><span class="lineno"> 4352</span>&#160;            {</div><div class="line"><a name="l04353"></a><span class="lineno"> 4353</span>&#160;                VMA_HEAVY_ASSERT(!m_pList-&gt;IsEmpty());</div><div class="line"><a name="l04354"></a><span class="lineno"> 4354</span>&#160;                m_pItem = m_pList-&gt;Back();</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;            <span class="keywordflow">return</span> *<span class="keyword">this</span>;</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;</div><div class="line"><a name="l04359"></a><span class="lineno"> 4359</span>&#160;        const_iterator operator++(<span class="keywordtype">int</span>)</div><div class="line"><a name="l04360"></a><span class="lineno"> 4360</span>&#160;        {</div><div class="line"><a name="l04361"></a><span class="lineno"> 4361</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04362"></a><span class="lineno"> 4362</span>&#160;            ++*<span class="keyword">this</span>;</div><div class="line"><a name="l04363"></a><span class="lineno"> 4363</span>&#160;            <span class="keywordflow">return</span> result;</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;        const_iterator operator--(<span class="keywordtype">int</span>)</div><div class="line"><a name="l04366"></a><span class="lineno"> 4366</span>&#160;        {</div><div class="line"><a name="l04367"></a><span class="lineno"> 4367</span>&#160;            const_iterator result = *<span class="keyword">this</span>;</div><div class="line"><a name="l04368"></a><span class="lineno"> 4368</span>&#160;            --*<span class="keyword">this</span>;</div><div class="line"><a name="l04369"></a><span class="lineno"> 4369</span>&#160;            <span class="keywordflow">return</span> result;</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;</div><div class="line"><a name="l04372"></a><span class="lineno"> 4372</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="l04373"></a><span class="lineno"> 4373</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04374"></a><span class="lineno"> 4374</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04375"></a><span class="lineno"> 4375</span>&#160;            <span class="keywordflow">return</span> m_pItem == rhs.m_pItem;</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">bool</span> operator!=(<span class="keyword">const</span> const_iterator&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04378"></a><span class="lineno"> 4378</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l04379"></a><span class="lineno"> 4379</span>&#160;            VMA_HEAVY_ASSERT(m_pList == rhs.m_pList);</div><div class="line"><a name="l04380"></a><span class="lineno"> 4380</span>&#160;            <span class="keywordflow">return</span> m_pItem != rhs.m_pItem;</div><div class="line"><a name="l04381"></a><span class="lineno"> 4381</span>&#160;        }</div><div class="line"><a name="l04382"></a><span class="lineno"> 4382</span>&#160;        </div><div class="line"><a name="l04383"></a><span class="lineno"> 4383</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l04384"></a><span class="lineno"> 4384</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="l04385"></a><span class="lineno"> 4385</span>&#160;            m_pList(pList),</div><div class="line"><a name="l04386"></a><span class="lineno"> 4386</span>&#160;            m_pItem(pItem)</div><div class="line"><a name="l04387"></a><span class="lineno"> 4387</span>&#160;        {</div><div class="line"><a name="l04388"></a><span class="lineno"> 4388</span>&#160;        }</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;        <span class="keyword">const</span> VmaRawList&lt;T&gt;* m_pList;</div><div class="line"><a name="l04391"></a><span class="lineno"> 4391</span>&#160;        <span class="keyword">const</span> VmaListItem&lt;T&gt;* m_pItem;</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="keyword">friend</span> <span class="keyword">class </span>VmaList&lt;T, AllocatorT&gt;;</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;</div><div class="line"><a name="l04396"></a><span class="lineno"> 4396</span>&#160;    VmaList(<span class="keyword">const</span> AllocatorT&amp; allocator) : m_RawList(allocator.m_pCallbacks) { }</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;    <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="l04399"></a><span class="lineno"> 4399</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="l04400"></a><span class="lineno"> 4400</span>&#160;</div><div class="line"><a name="l04401"></a><span class="lineno"> 4401</span>&#160;    iterator begin() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, m_RawList.Front()); }</div><div class="line"><a name="l04402"></a><span class="lineno"> 4402</span>&#160;    iterator end() { <span class="keywordflow">return</span> iterator(&amp;m_RawList, VMA_NULL); }</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;    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="l04405"></a><span class="lineno"> 4405</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="l04406"></a><span class="lineno"> 4406</span>&#160;</div><div class="line"><a name="l04407"></a><span class="lineno"> 4407</span>&#160;    <span class="keywordtype">void</span> clear() { m_RawList.Clear(); }</div><div class="line"><a name="l04408"></a><span class="lineno"> 4408</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="l04409"></a><span class="lineno"> 4409</span>&#160;    <span class="keywordtype">void</span> erase(iterator it) { m_RawList.Remove(it.m_pItem); }</div><div class="line"><a name="l04410"></a><span class="lineno"> 4410</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="l04411"></a><span class="lineno"> 4411</span>&#160;</div><div class="line"><a name="l04412"></a><span class="lineno"> 4412</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04413"></a><span class="lineno"> 4413</span>&#160;    VmaRawList&lt;T&gt; m_RawList;</div><div class="line"><a name="l04414"></a><span class="lineno"> 4414</span>&#160;};</div><div class="line"><a name="l04415"></a><span class="lineno"> 4415</span>&#160;</div><div class="line"><a name="l04416"></a><span class="lineno"> 4416</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_LIST</span></div><div class="line"><a name="l04417"></a><span class="lineno"> 4417</span>&#160;</div><div class="line"><a name="l04419"></a><span class="lineno"> 4419</span>&#160;<span class="comment">// class VmaMap</span></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="comment">// Unused in this version.</span></div><div class="line"><a name="l04422"></a><span class="lineno"> 4422</span>&#160;<span class="preprocessor">#if 0</span></div><div class="line"><a name="l04423"></a><span class="lineno"> 4423</span>&#160;</div><div class="line"><a name="l04424"></a><span class="lineno"> 4424</span>&#160;<span class="preprocessor">#if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04425"></a><span class="lineno"> 4425</span>&#160;</div><div class="line"><a name="l04426"></a><span class="lineno"> 4426</span>&#160;<span class="preprocessor">#define VmaPair std::pair</span></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="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) \</span></div><div class="line"><a name="l04429"></a><span class="lineno"> 4429</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="l04430"></a><span class="lineno"> 4430</span>&#160;</div><div class="line"><a name="l04431"></a><span class="lineno"> 4431</span>&#160;<span class="preprocessor">#else // #if VMA_USE_STL_UNORDERED_MAP</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="keyword">template</span>&lt;<span class="keyword">typename</span> T1, <span class="keyword">typename</span> T2&gt;</div><div class="line"><a name="l04434"></a><span class="lineno"> 4434</span>&#160;<span class="keyword">struct </span>VmaPair</div><div class="line"><a name="l04435"></a><span class="lineno"> 4435</span>&#160;{</div><div class="line"><a name="l04436"></a><span class="lineno"> 4436</span>&#160;    T1 first;</div><div class="line"><a name="l04437"></a><span class="lineno"> 4437</span>&#160;    T2 second;</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;    VmaPair() : first(), second() { }</div><div class="line"><a name="l04440"></a><span class="lineno"> 4440</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="l04441"></a><span class="lineno"> 4441</span>&#160;};</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="comment">/* Class compatible with subset of interface of std::unordered_map.</span></div><div class="line"><a name="l04444"></a><span class="lineno"> 4444</span>&#160;<span class="comment">KeyT, ValueT must be POD because they will be stored in VmaVector.</span></div><div class="line"><a name="l04445"></a><span class="lineno"> 4445</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04446"></a><span class="lineno"> 4446</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="l04447"></a><span class="lineno"> 4447</span>&#160;<span class="keyword">class </span>VmaMap</div><div class="line"><a name="l04448"></a><span class="lineno"> 4448</span>&#160;{</div><div class="line"><a name="l04449"></a><span class="lineno"> 4449</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04450"></a><span class="lineno"> 4450</span>&#160;    <span class="keyword">typedef</span> VmaPair&lt;KeyT, ValueT&gt; PairType;</div><div class="line"><a name="l04451"></a><span class="lineno"> 4451</span>&#160;    <span class="keyword">typedef</span> PairType* iterator;</div><div class="line"><a name="l04452"></a><span class="lineno"> 4452</span>&#160;</div><div class="line"><a name="l04453"></a><span class="lineno"> 4453</span>&#160;    VmaMap(<span class="keyword">const</span> VmaStlAllocator&lt;PairType&gt;&amp; allocator) : m_Vector(allocator) { }</div><div class="line"><a name="l04454"></a><span class="lineno"> 4454</span>&#160;</div><div class="line"><a name="l04455"></a><span class="lineno"> 4455</span>&#160;    iterator begin() { <span class="keywordflow">return</span> m_Vector.begin(); }</div><div class="line"><a name="l04456"></a><span class="lineno"> 4456</span>&#160;    iterator end() { <span class="keywordflow">return</span> m_Vector.end(); }</div><div class="line"><a name="l04457"></a><span class="lineno"> 4457</span>&#160;</div><div class="line"><a name="l04458"></a><span class="lineno"> 4458</span>&#160;    <span class="keywordtype">void</span> insert(<span class="keyword">const</span> PairType&amp; pair);</div><div class="line"><a name="l04459"></a><span class="lineno"> 4459</span>&#160;    iterator find(<span class="keyword">const</span> KeyT&amp; key);</div><div class="line"><a name="l04460"></a><span class="lineno"> 4460</span>&#160;    <span class="keywordtype">void</span> erase(iterator it);</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;<span class="keyword">private</span>:</div><div class="line"><a name="l04463"></a><span class="lineno"> 4463</span>&#160;    VmaVector&lt; PairType, VmaStlAllocator&lt;PairType&gt; &gt; m_Vector;</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;</div><div class="line"><a name="l04466"></a><span class="lineno"> 4466</span>&#160;<span class="preprocessor">#define VMA_MAP_TYPE(KeyT, ValueT) VmaMap&lt;KeyT, ValueT&gt;</span></div><div class="line"><a name="l04467"></a><span class="lineno"> 4467</span>&#160;</div><div class="line"><a name="l04468"></a><span class="lineno"> 4468</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="l04469"></a><span class="lineno"> 4469</span>&#160;<span class="keyword">struct </span>VmaPairFirstLess</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">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="l04472"></a><span class="lineno"> 4472</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04473"></a><span class="lineno"> 4473</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhs.first;</div><div class="line"><a name="l04474"></a><span class="lineno"> 4474</span>&#160;    }</div><div class="line"><a name="l04475"></a><span class="lineno"> 4475</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="l04476"></a><span class="lineno"> 4476</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04477"></a><span class="lineno"> 4477</span>&#160;        <span class="keywordflow">return</span> lhs.first &lt; rhsFirst;</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;};</div><div class="line"><a name="l04480"></a><span class="lineno"> 4480</span>&#160;</div><div class="line"><a name="l04481"></a><span class="lineno"> 4481</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="l04482"></a><span class="lineno"> 4482</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="l04483"></a><span class="lineno"> 4483</span>&#160;{</div><div class="line"><a name="l04484"></a><span class="lineno"> 4484</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> indexToInsert = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04485"></a><span class="lineno"> 4485</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l04486"></a><span class="lineno"> 4486</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l04487"></a><span class="lineno"> 4487</span>&#160;        pair,</div><div class="line"><a name="l04488"></a><span class="lineno"> 4488</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;()) - m_Vector.data();</div><div class="line"><a name="l04489"></a><span class="lineno"> 4489</span>&#160;    VmaVectorInsert(m_Vector, indexToInsert, pair);</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;</div><div class="line"><a name="l04492"></a><span class="lineno"> 4492</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="l04493"></a><span class="lineno"> 4493</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="l04494"></a><span class="lineno"> 4494</span>&#160;{</div><div class="line"><a name="l04495"></a><span class="lineno"> 4495</span>&#160;    PairType* it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l04496"></a><span class="lineno"> 4496</span>&#160;        m_Vector.data(),</div><div class="line"><a name="l04497"></a><span class="lineno"> 4497</span>&#160;        m_Vector.data() + m_Vector.size(),</div><div class="line"><a name="l04498"></a><span class="lineno"> 4498</span>&#160;        key,</div><div class="line"><a name="l04499"></a><span class="lineno"> 4499</span>&#160;        VmaPairFirstLess&lt;KeyT, ValueT&gt;());</div><div class="line"><a name="l04500"></a><span class="lineno"> 4500</span>&#160;    <span class="keywordflow">if</span>((it != m_Vector.end()) &amp;&amp; (it-&gt;first == key))</div><div class="line"><a name="l04501"></a><span class="lineno"> 4501</span>&#160;    {</div><div class="line"><a name="l04502"></a><span class="lineno"> 4502</span>&#160;        <span class="keywordflow">return</span> it;</div><div class="line"><a name="l04503"></a><span class="lineno"> 4503</span>&#160;    }</div><div class="line"><a name="l04504"></a><span class="lineno"> 4504</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l04505"></a><span class="lineno"> 4505</span>&#160;    {</div><div class="line"><a name="l04506"></a><span class="lineno"> 4506</span>&#160;        <span class="keywordflow">return</span> m_Vector.end();</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;}</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;<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="l04511"></a><span class="lineno"> 4511</span>&#160;<span class="keywordtype">void</span> VmaMap&lt;KeyT, ValueT&gt;::erase(iterator it)</div><div class="line"><a name="l04512"></a><span class="lineno"> 4512</span>&#160;{</div><div class="line"><a name="l04513"></a><span class="lineno"> 4513</span>&#160;    VmaVectorRemove(m_Vector, it - m_Vector.begin());</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;</div><div class="line"><a name="l04516"></a><span class="lineno"> 4516</span>&#160;<span class="preprocessor">#endif // #if VMA_USE_STL_UNORDERED_MAP</span></div><div class="line"><a name="l04517"></a><span class="lineno"> 4517</span>&#160;</div><div class="line"><a name="l04518"></a><span class="lineno"> 4518</span>&#160;<span class="preprocessor">#endif // #if 0</span></div><div class="line"><a name="l04519"></a><span class="lineno"> 4519</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="keyword">class </span>VmaDeviceMemoryBlock;</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="keyword">enum</span> VMA_CACHE_OPERATION { VMA_CACHE_FLUSH, VMA_CACHE_INVALIDATE };</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;<span class="keyword">struct </span>VmaAllocation_T</div><div class="line"><a name="l04527"></a><span class="lineno"> 4527</span>&#160;{</div><div class="line"><a name="l04528"></a><span class="lineno"> 4528</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocation_T)</div><div class="line"><a name="l04529"></a><span class="lineno"> 4529</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l04530"></a><span class="lineno"> 4530</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="l04531"></a><span class="lineno"> 4531</span>&#160;</div><div class="line"><a name="l04532"></a><span class="lineno"> 4532</span>&#160;    <span class="keyword">enum</span> FLAGS</div><div class="line"><a name="l04533"></a><span class="lineno"> 4533</span>&#160;    {</div><div class="line"><a name="l04534"></a><span class="lineno"> 4534</span>&#160;        FLAG_USER_DATA_STRING = 0x01,</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;</div><div class="line"><a name="l04537"></a><span class="lineno"> 4537</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04538"></a><span class="lineno"> 4538</span>&#160;    <span class="keyword">enum</span> ALLOCATION_TYPE</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;        ALLOCATION_TYPE_NONE,</div><div class="line"><a name="l04541"></a><span class="lineno"> 4541</span>&#160;        ALLOCATION_TYPE_BLOCK,</div><div class="line"><a name="l04542"></a><span class="lineno"> 4542</span>&#160;        ALLOCATION_TYPE_DEDICATED,</div><div class="line"><a name="l04543"></a><span class="lineno"> 4543</span>&#160;    };</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;    VmaAllocation_T(uint32_t currentFrameIndex, <span class="keywordtype">bool</span> userDataString) :</div><div class="line"><a name="l04546"></a><span class="lineno"> 4546</span>&#160;        m_Alignment(1),</div><div class="line"><a name="l04547"></a><span class="lineno"> 4547</span>&#160;        m_Size(0),</div><div class="line"><a name="l04548"></a><span class="lineno"> 4548</span>&#160;        m_pUserData(VMA_NULL),</div><div class="line"><a name="l04549"></a><span class="lineno"> 4549</span>&#160;        m_LastUseFrameIndex(currentFrameIndex),</div><div class="line"><a name="l04550"></a><span class="lineno"> 4550</span>&#160;        m_Type((uint8_t)ALLOCATION_TYPE_NONE),</div><div class="line"><a name="l04551"></a><span class="lineno"> 4551</span>&#160;        m_SuballocationType((uint8_t)VMA_SUBALLOCATION_TYPE_UNKNOWN),</div><div class="line"><a name="l04552"></a><span class="lineno"> 4552</span>&#160;        m_MapCount(0),</div><div class="line"><a name="l04553"></a><span class="lineno"> 4553</span>&#160;        m_Flags(userDataString ? (uint8_t)FLAG_USER_DATA_STRING : 0)</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04556"></a><span class="lineno"> 4556</span>&#160;        m_CreationFrameIndex = currentFrameIndex;</div><div class="line"><a name="l04557"></a><span class="lineno"> 4557</span>&#160;        m_BufferImageUsage = 0;</div><div class="line"><a name="l04558"></a><span class="lineno"> 4558</span>&#160;<span class="preprocessor">#endif</span></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;</div><div class="line"><a name="l04561"></a><span class="lineno"> 4561</span>&#160;    ~VmaAllocation_T()</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;        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="l04564"></a><span class="lineno"> 4564</span>&#160;</div><div class="line"><a name="l04565"></a><span class="lineno"> 4565</span>&#160;        <span class="comment">// Check if owned string was freed.</span></div><div class="line"><a name="l04566"></a><span class="lineno"> 4566</span>&#160;        VMA_ASSERT(m_pUserData == VMA_NULL);</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="keywordtype">void</span> InitBlockAllocation(</div><div class="line"><a name="l04570"></a><span class="lineno"> 4570</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l04571"></a><span class="lineno"> 4571</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04572"></a><span class="lineno"> 4572</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l04573"></a><span class="lineno"> 4573</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l04574"></a><span class="lineno"> 4574</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l04575"></a><span class="lineno"> 4575</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l04576"></a><span class="lineno"> 4576</span>&#160;        <span class="keywordtype">bool</span> mapped,</div><div class="line"><a name="l04577"></a><span class="lineno"> 4577</span>&#160;        <span class="keywordtype">bool</span> canBecomeLost)</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;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04580"></a><span class="lineno"> 4580</span>&#160;        VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l04581"></a><span class="lineno"> 4581</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l04582"></a><span class="lineno"> 4582</span>&#160;        m_Alignment = alignment;</div><div class="line"><a name="l04583"></a><span class="lineno"> 4583</span>&#160;        m_Size = size;</div><div class="line"><a name="l04584"></a><span class="lineno"> 4584</span>&#160;        m_MapCount = mapped ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l04585"></a><span class="lineno"> 4585</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l04586"></a><span class="lineno"> 4586</span>&#160;        m_BlockAllocation.m_hPool = hPool;</div><div class="line"><a name="l04587"></a><span class="lineno"> 4587</span>&#160;        m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l04588"></a><span class="lineno"> 4588</span>&#160;        m_BlockAllocation.m_Offset = offset;</div><div class="line"><a name="l04589"></a><span class="lineno"> 4589</span>&#160;        m_BlockAllocation.m_CanBecomeLost = canBecomeLost;</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;</div><div class="line"><a name="l04592"></a><span class="lineno"> 4592</span>&#160;    <span class="keywordtype">void</span> InitLost()</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;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04595"></a><span class="lineno"> 4595</span>&#160;        VMA_ASSERT(m_LastUseFrameIndex.load() == VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l04596"></a><span class="lineno"> 4596</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_BLOCK;</div><div class="line"><a name="l04597"></a><span class="lineno"> 4597</span>&#160;        m_BlockAllocation.m_hPool = VK_NULL_HANDLE;</div><div class="line"><a name="l04598"></a><span class="lineno"> 4598</span>&#160;        m_BlockAllocation.m_Block = VMA_NULL;</div><div class="line"><a name="l04599"></a><span class="lineno"> 4599</span>&#160;        m_BlockAllocation.m_Offset = 0;</div><div class="line"><a name="l04600"></a><span class="lineno"> 4600</span>&#160;        m_BlockAllocation.m_CanBecomeLost = <span class="keyword">true</span>;</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;</div><div class="line"><a name="l04603"></a><span class="lineno"> 4603</span>&#160;    <span class="keywordtype">void</span> ChangeBlockAllocation(</div><div class="line"><a name="l04604"></a><span class="lineno"> 4604</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l04605"></a><span class="lineno"> 4605</span>&#160;        VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l04606"></a><span class="lineno"> 4606</span>&#160;        VkDeviceSize offset);</div><div class="line"><a name="l04607"></a><span class="lineno"> 4607</span>&#160;</div><div class="line"><a name="l04608"></a><span class="lineno"> 4608</span>&#160;    <span class="comment">// pMappedData not null means allocation is created with MAPPED flag.</span></div><div class="line"><a name="l04609"></a><span class="lineno"> 4609</span>&#160;    <span class="keywordtype">void</span> InitDedicatedAllocation(</div><div class="line"><a name="l04610"></a><span class="lineno"> 4610</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l04611"></a><span class="lineno"> 4611</span>&#160;        VkDeviceMemory hMemory,</div><div class="line"><a name="l04612"></a><span class="lineno"> 4612</span>&#160;        VmaSuballocationType suballocationType,</div><div class="line"><a name="l04613"></a><span class="lineno"> 4613</span>&#160;        <span class="keywordtype">void</span>* pMappedData,</div><div class="line"><a name="l04614"></a><span class="lineno"> 4614</span>&#160;        VkDeviceSize size)</div><div class="line"><a name="l04615"></a><span class="lineno"> 4615</span>&#160;    {</div><div class="line"><a name="l04616"></a><span class="lineno"> 4616</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_NONE);</div><div class="line"><a name="l04617"></a><span class="lineno"> 4617</span>&#160;        VMA_ASSERT(hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l04618"></a><span class="lineno"> 4618</span>&#160;        m_Type = (uint8_t)ALLOCATION_TYPE_DEDICATED;</div><div class="line"><a name="l04619"></a><span class="lineno"> 4619</span>&#160;        m_Alignment = 0;</div><div class="line"><a name="l04620"></a><span class="lineno"> 4620</span>&#160;        m_Size = size;</div><div class="line"><a name="l04621"></a><span class="lineno"> 4621</span>&#160;        m_SuballocationType = (uint8_t)suballocationType;</div><div class="line"><a name="l04622"></a><span class="lineno"> 4622</span>&#160;        m_MapCount = (pMappedData != VMA_NULL) ? MAP_COUNT_FLAG_PERSISTENT_MAP : 0;</div><div class="line"><a name="l04623"></a><span class="lineno"> 4623</span>&#160;        m_DedicatedAllocation.m_MemoryTypeIndex = memoryTypeIndex;</div><div class="line"><a name="l04624"></a><span class="lineno"> 4624</span>&#160;        m_DedicatedAllocation.m_hMemory = hMemory;</div><div class="line"><a name="l04625"></a><span class="lineno"> 4625</span>&#160;        m_DedicatedAllocation.m_pMappedData = pMappedData;</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;</div><div class="line"><a name="l04628"></a><span class="lineno"> 4628</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="l04629"></a><span class="lineno"> 4629</span>&#160;    VkDeviceSize GetAlignment()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Alignment; }</div><div class="line"><a name="l04630"></a><span class="lineno"> 4630</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l04631"></a><span class="lineno"> 4631</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="l04632"></a><span class="lineno"> 4632</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="l04633"></a><span class="lineno"> 4633</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="l04634"></a><span class="lineno"> 4634</span>&#160;    VmaSuballocationType GetSuballocationType()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> (VmaSuballocationType)m_SuballocationType; }</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;    VmaDeviceMemoryBlock* GetBlock()<span class="keyword"> const</span></div><div class="line"><a name="l04637"></a><span class="lineno"> 4637</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04638"></a><span class="lineno"> 4638</span>&#160;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l04639"></a><span class="lineno"> 4639</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block;</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;    VkDeviceSize GetOffset() <span class="keyword">const</span>;</div><div class="line"><a name="l04642"></a><span class="lineno"> 4642</span>&#160;    VkDeviceMemory GetMemory() <span class="keyword">const</span>;</div><div class="line"><a name="l04643"></a><span class="lineno"> 4643</span>&#160;    uint32_t GetMemoryTypeIndex() <span class="keyword">const</span>;</div><div class="line"><a name="l04644"></a><span class="lineno"> 4644</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="l04645"></a><span class="lineno"> 4645</span>&#160;    <span class="keywordtype">void</span>* GetMappedData() <span class="keyword">const</span>;</div><div class="line"><a name="l04646"></a><span class="lineno"> 4646</span>&#160;    <span class="keywordtype">bool</span> CanBecomeLost() <span class="keyword">const</span>;</div><div class="line"><a name="l04647"></a><span class="lineno"> 4647</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> GetPool() <span class="keyword">const</span>;</div><div class="line"><a name="l04648"></a><span class="lineno"> 4648</span>&#160;    </div><div class="line"><a name="l04649"></a><span class="lineno"> 4649</span>&#160;    uint32_t GetLastUseFrameIndex()<span class="keyword"> const</span></div><div class="line"><a name="l04650"></a><span class="lineno"> 4650</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04651"></a><span class="lineno"> 4651</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.load();</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">bool</span> CompareExchangeLastUseFrameIndex(uint32_t&amp; expected, uint32_t desired)</div><div class="line"><a name="l04654"></a><span class="lineno"> 4654</span>&#160;    {</div><div class="line"><a name="l04655"></a><span class="lineno"> 4655</span>&#160;        <span class="keywordflow">return</span> m_LastUseFrameIndex.compare_exchange_weak(expected, desired);</div><div class="line"><a name="l04656"></a><span class="lineno"> 4656</span>&#160;    }</div><div class="line"><a name="l04657"></a><span class="lineno"> 4657</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l04658"></a><span class="lineno"> 4658</span>&#160;<span class="comment">    - If hAllocation.LastUseFrameIndex + frameInUseCount &lt; allocator.CurrentFrameIndex,</span></div><div class="line"><a name="l04659"></a><span class="lineno"> 4659</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="l04660"></a><span class="lineno"> 4660</span>&#160;<span class="comment">    - Else, returns false.</span></div><div class="line"><a name="l04661"></a><span class="lineno"> 4661</span>&#160;<span class="comment">    </span></div><div class="line"><a name="l04662"></a><span class="lineno"> 4662</span>&#160;<span class="comment">    If hAllocation is already lost, assert - you should not call it then.</span></div><div class="line"><a name="l04663"></a><span class="lineno"> 4663</span>&#160;<span class="comment">    If hAllocation was not created with CAN_BECOME_LOST_BIT, assert.</span></div><div class="line"><a name="l04664"></a><span class="lineno"> 4664</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l04665"></a><span class="lineno"> 4665</span>&#160;    <span class="keywordtype">bool</span> MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</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> DedicatedAllocCalcStatsInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo)</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;        VMA_ASSERT(m_Type == ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l04670"></a><span class="lineno"> 4670</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l04671"></a><span class="lineno"> 4671</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = 1;</div><div class="line"><a name="l04672"></a><span class="lineno"> 4672</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l04673"></a><span class="lineno"> 4673</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = m_Size;</div><div class="line"><a name="l04674"></a><span class="lineno"> 4674</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l04675"></a><span class="lineno"> 4675</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="l04676"></a><span class="lineno"> 4676</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l04677"></a><span class="lineno"> 4677</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l04678"></a><span class="lineno"> 4678</span>&#160;    }</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;    <span class="keywordtype">void</span> BlockAllocMap();</div><div class="line"><a name="l04681"></a><span class="lineno"> 4681</span>&#160;    <span class="keywordtype">void</span> BlockAllocUnmap();</div><div class="line"><a name="l04682"></a><span class="lineno"> 4682</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="l04683"></a><span class="lineno"> 4683</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="l04684"></a><span class="lineno"> 4684</span>&#160;</div><div class="line"><a name="l04685"></a><span class="lineno"> 4685</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04686"></a><span class="lineno"> 4686</span>&#160;    uint32_t GetCreationFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CreationFrameIndex; }</div><div class="line"><a name="l04687"></a><span class="lineno"> 4687</span>&#160;    uint32_t GetBufferImageUsage()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageUsage; }</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="keywordtype">void</span> InitBufferImageUsage(uint32_t bufferImageUsage)</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;        VMA_ASSERT(m_BufferImageUsage == 0);</div><div class="line"><a name="l04692"></a><span class="lineno"> 4692</span>&#160;        m_BufferImageUsage = bufferImageUsage;</div><div class="line"><a name="l04693"></a><span class="lineno"> 4693</span>&#160;    }</div><div class="line"><a name="l04694"></a><span class="lineno"> 4694</span>&#160;</div><div class="line"><a name="l04695"></a><span class="lineno"> 4695</span>&#160;    <span class="keywordtype">void</span> PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l04696"></a><span class="lineno"> 4696</span>&#160;<span class="preprocessor">#endif</span></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;<span class="keyword">private</span>:</div><div class="line"><a name="l04699"></a><span class="lineno"> 4699</span>&#160;    VkDeviceSize m_Alignment;</div><div class="line"><a name="l04700"></a><span class="lineno"> 4700</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04701"></a><span class="lineno"> 4701</span>&#160;    <span class="keywordtype">void</span>* m_pUserData;</div><div class="line"><a name="l04702"></a><span class="lineno"> 4702</span>&#160;    VMA_ATOMIC_UINT32 m_LastUseFrameIndex;</div><div class="line"><a name="l04703"></a><span class="lineno"> 4703</span>&#160;    uint8_t m_Type; <span class="comment">// ALLOCATION_TYPE</span></div><div class="line"><a name="l04704"></a><span class="lineno"> 4704</span>&#160;    uint8_t m_SuballocationType; <span class="comment">// VmaSuballocationType</span></div><div class="line"><a name="l04705"></a><span class="lineno"> 4705</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="l04706"></a><span class="lineno"> 4706</span>&#160;    <span class="comment">// Bits with mask 0x7F are reference counter for vmaMapMemory()/vmaUnmapMemory().</span></div><div class="line"><a name="l04707"></a><span class="lineno"> 4707</span>&#160;    uint8_t m_MapCount;</div><div class="line"><a name="l04708"></a><span class="lineno"> 4708</span>&#160;    uint8_t m_Flags; <span class="comment">// enum FLAGS</span></div><div class="line"><a name="l04709"></a><span class="lineno"> 4709</span>&#160;</div><div class="line"><a name="l04710"></a><span class="lineno"> 4710</span>&#160;    <span class="comment">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04711"></a><span class="lineno"> 4711</span>&#160;    <span class="keyword">struct </span>BlockAllocation</div><div class="line"><a name="l04712"></a><span class="lineno"> 4712</span>&#160;    {</div><div class="line"><a name="l04713"></a><span class="lineno"> 4713</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="l04714"></a><span class="lineno"> 4714</span>&#160;        VmaDeviceMemoryBlock* m_Block;</div><div class="line"><a name="l04715"></a><span class="lineno"> 4715</span>&#160;        VkDeviceSize m_Offset;</div><div class="line"><a name="l04716"></a><span class="lineno"> 4716</span>&#160;        <span class="keywordtype">bool</span> m_CanBecomeLost;</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;</div><div class="line"><a name="l04719"></a><span class="lineno"> 4719</span>&#160;    <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l04720"></a><span class="lineno"> 4720</span>&#160;    <span class="keyword">struct </span>DedicatedAllocation</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;        uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l04723"></a><span class="lineno"> 4723</span>&#160;        VkDeviceMemory m_hMemory;</div><div class="line"><a name="l04724"></a><span class="lineno"> 4724</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="l04725"></a><span class="lineno"> 4725</span>&#160;    };</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="keyword">union</span></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">// Allocation out of VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04730"></a><span class="lineno"> 4730</span>&#160;        BlockAllocation m_BlockAllocation;</div><div class="line"><a name="l04731"></a><span class="lineno"> 4731</span>&#160;        <span class="comment">// Allocation for an object that has its own private VkDeviceMemory.</span></div><div class="line"><a name="l04732"></a><span class="lineno"> 4732</span>&#160;        DedicatedAllocation m_DedicatedAllocation;</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04736"></a><span class="lineno"> 4736</span>&#160;    uint32_t m_CreationFrameIndex;</div><div class="line"><a name="l04737"></a><span class="lineno"> 4737</span>&#160;    uint32_t m_BufferImageUsage; <span class="comment">// 0 if unknown.</span></div><div class="line"><a name="l04738"></a><span class="lineno"> 4738</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04739"></a><span class="lineno"> 4739</span>&#160;</div><div class="line"><a name="l04740"></a><span class="lineno"> 4740</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="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="comment">/*</span></div><div class="line"><a name="l04744"></a><span class="lineno"> 4744</span>&#160;<span class="comment">Represents a region of VmaDeviceMemoryBlock that is either assigned and returned as</span></div><div class="line"><a name="l04745"></a><span class="lineno"> 4745</span>&#160;<span class="comment">allocated memory block or free.</span></div><div class="line"><a name="l04746"></a><span class="lineno"> 4746</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04747"></a><span class="lineno"> 4747</span>&#160;<span class="keyword">struct </span>VmaSuballocation</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;    VkDeviceSize offset;</div><div class="line"><a name="l04750"></a><span class="lineno"> 4750</span>&#160;    VkDeviceSize size;</div><div class="line"><a name="l04751"></a><span class="lineno"> 4751</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation;</div><div class="line"><a name="l04752"></a><span class="lineno"> 4752</span>&#160;    VmaSuballocationType type;</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;</div><div class="line"><a name="l04755"></a><span class="lineno"> 4755</span>&#160;<span class="comment">// Comparator for offsets.</span></div><div class="line"><a name="l04756"></a><span class="lineno"> 4756</span>&#160;<span class="keyword">struct </span>VmaSuballocationOffsetLess</div><div class="line"><a name="l04757"></a><span class="lineno"> 4757</span>&#160;{</div><div class="line"><a name="l04758"></a><span class="lineno"> 4758</span>&#160;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation&amp; lhs, <span class="keyword">const</span> VmaSuballocation&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04759"></a><span class="lineno"> 4759</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04760"></a><span class="lineno"> 4760</span>&#160;        <span class="keywordflow">return</span> lhs.offset &lt; rhs.offset;</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="keyword">struct </span>VmaSuballocationOffsetGreater</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;    <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> VmaSuballocation&amp; lhs, <span class="keyword">const</span> VmaSuballocation&amp; rhs)<span class="keyword"> const</span></div><div class="line"><a name="l04766"></a><span class="lineno"> 4766</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04767"></a><span class="lineno"> 4767</span>&#160;        <span class="keywordflow">return</span> lhs.offset &gt; rhs.offset;</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;};</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="keyword">typedef</span> VmaList&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; VmaSuballocationList;</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="comment">// Cost of one additional allocation lost, as equivalent in bytes.</span></div><div class="line"><a name="l04774"></a><span class="lineno"> 4774</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize VMA_LOST_ALLOCATION_COST = 1048576;</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;<span class="comment">/*</span></div><div class="line"><a name="l04777"></a><span class="lineno"> 4777</span>&#160;<span class="comment">Parameters of planned allocation inside a VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l04778"></a><span class="lineno"> 4778</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04779"></a><span class="lineno"> 4779</span>&#160;<span class="comment">If canMakeOtherLost was false:</span></div><div class="line"><a name="l04780"></a><span class="lineno"> 4780</span>&#160;<span class="comment">- item points to a FREE suballocation.</span></div><div class="line"><a name="l04781"></a><span class="lineno"> 4781</span>&#160;<span class="comment">- itemsToMakeLostCount is 0.</span></div><div class="line"><a name="l04782"></a><span class="lineno"> 4782</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04783"></a><span class="lineno"> 4783</span>&#160;<span class="comment">If canMakeOtherLost was true:</span></div><div class="line"><a name="l04784"></a><span class="lineno"> 4784</span>&#160;<span class="comment">- item points to first of sequence of suballocations, which are either FREE,</span></div><div class="line"><a name="l04785"></a><span class="lineno"> 4785</span>&#160;<span class="comment">  or point to VmaAllocations that can become lost.</span></div><div class="line"><a name="l04786"></a><span class="lineno"> 4786</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="l04787"></a><span class="lineno"> 4787</span>&#160;<span class="comment">  the requested allocation to succeed.</span></div><div class="line"><a name="l04788"></a><span class="lineno"> 4788</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04789"></a><span class="lineno"> 4789</span>&#160;<span class="keyword">struct </span>VmaAllocationRequest</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;    VkDeviceSize offset;</div><div class="line"><a name="l04792"></a><span class="lineno"> 4792</span>&#160;    VkDeviceSize sumFreeSize; <span class="comment">// Sum size of free items that overlap with proposed allocation.</span></div><div class="line"><a name="l04793"></a><span class="lineno"> 4793</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="l04794"></a><span class="lineno"> 4794</span>&#160;    VmaSuballocationList::iterator item;</div><div class="line"><a name="l04795"></a><span class="lineno"> 4795</span>&#160;    <span class="keywordtype">size_t</span> itemsToMakeLostCount;</div><div class="line"><a name="l04796"></a><span class="lineno"> 4796</span>&#160;    <span class="keywordtype">void</span>* customData;</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;    VkDeviceSize CalcCost()<span class="keyword"> const</span></div><div class="line"><a name="l04799"></a><span class="lineno"> 4799</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l04800"></a><span class="lineno"> 4800</span>&#160;        <span class="keywordflow">return</span> sumItemSize + itemsToMakeLostCount * VMA_LOST_ALLOCATION_COST;</div><div class="line"><a name="l04801"></a><span class="lineno"> 4801</span>&#160;    }</div><div class="line"><a name="l04802"></a><span class="lineno"> 4802</span>&#160;};</div><div class="line"><a name="l04803"></a><span class="lineno"> 4803</span>&#160;</div><div class="line"><a name="l04804"></a><span class="lineno"> 4804</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04805"></a><span class="lineno"> 4805</span>&#160;<span class="comment">Data structure used for bookkeeping of allocations and unused ranges of memory</span></div><div class="line"><a name="l04806"></a><span class="lineno"> 4806</span>&#160;<span class="comment">in a single VkDeviceMemory block.</span></div><div class="line"><a name="l04807"></a><span class="lineno"> 4807</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l04808"></a><span class="lineno"> 4808</span>&#160;<span class="keyword">class </span>VmaBlockMetadata</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="keyword">public</span>:</div><div class="line"><a name="l04811"></a><span class="lineno"> 4811</span>&#160;    VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04812"></a><span class="lineno"> 4812</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata() { }</div><div class="line"><a name="l04813"></a><span class="lineno"> 4813</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size) { m_Size = size; }</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;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l04816"></a><span class="lineno"> 4816</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04817"></a><span class="lineno"> 4817</span>&#160;    VkDeviceSize GetSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Size; }</div><div class="line"><a name="l04818"></a><span class="lineno"> 4818</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04819"></a><span class="lineno"> 4819</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04820"></a><span class="lineno"> 4820</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04821"></a><span class="lineno"> 4821</span>&#160;    <span class="comment">// Returns true if this block is empty - contains only single free suballocation.</span></div><div class="line"><a name="l04822"></a><span class="lineno"> 4822</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04823"></a><span class="lineno"> 4823</span>&#160;</div><div class="line"><a name="l04824"></a><span class="lineno"> 4824</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalcAllocationStatInfo(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo) <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04825"></a><span class="lineno"> 4825</span>&#160;    <span class="comment">// Shouldn&#39;t modify blockCount.</span></div><div class="line"><a name="l04826"></a><span class="lineno"> 4826</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> AddPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>&amp; inoutStats) <span class="keyword">const</span> = 0;</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04829"></a><span class="lineno"> 4829</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span> = 0;</div><div class="line"><a name="l04830"></a><span class="lineno"> 4830</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l04831"></a><span class="lineno"> 4831</span>&#160;</div><div class="line"><a name="l04832"></a><span class="lineno"> 4832</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="l04833"></a><span class="lineno"> 4833</span>&#160;    <span class="comment">// If succeeded, fills pAllocationRequest and returns true.</span></div><div class="line"><a name="l04834"></a><span class="lineno"> 4834</span>&#160;    <span class="comment">// If failed, returns false.</span></div><div class="line"><a name="l04835"></a><span class="lineno"> 4835</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l04836"></a><span class="lineno"> 4836</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04837"></a><span class="lineno"> 4837</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04838"></a><span class="lineno"> 4838</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04839"></a><span class="lineno"> 4839</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04840"></a><span class="lineno"> 4840</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04841"></a><span class="lineno"> 4841</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l04842"></a><span class="lineno"> 4842</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04843"></a><span class="lineno"> 4843</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04844"></a><span class="lineno"> 4844</span>&#160;        uint32_t strategy, <span class="comment">// Always one of VMA_ALLOCATION_CREATE_STRATEGY_* flags.</span></div><div class="line"><a name="l04845"></a><span class="lineno"> 4845</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</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">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l04848"></a><span class="lineno"> 4848</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04849"></a><span class="lineno"> 4849</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04850"></a><span class="lineno"> 4850</span>&#160;        VmaAllocationRequest* pAllocationRequest) = 0;</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;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount) = 0;</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;    <span class="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) = 0;</div><div class="line"><a name="l04855"></a><span class="lineno"> 4855</span>&#160;</div><div class="line"><a name="l04856"></a><span class="lineno"> 4856</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="l04857"></a><span class="lineno"> 4857</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l04858"></a><span class="lineno"> 4858</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l04859"></a><span class="lineno"> 4859</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l04860"></a><span class="lineno"> 4860</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04861"></a><span class="lineno"> 4861</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l04862"></a><span class="lineno"> 4862</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) = 0;</div><div class="line"><a name="l04863"></a><span class="lineno"> 4863</span>&#160;</div><div class="line"><a name="l04864"></a><span class="lineno"> 4864</span>&#160;    <span class="comment">// Frees suballocation assigned to given memory region.</span></div><div class="line"><a name="l04865"></a><span class="lineno"> 4865</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) = 0;</div><div class="line"><a name="l04866"></a><span class="lineno"> 4866</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) = 0;</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;<span class="keyword">protected</span>:</div><div class="line"><a name="l04869"></a><span class="lineno"> 4869</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pAllocationCallbacks; }</div><div class="line"><a name="l04870"></a><span class="lineno"> 4870</span>&#160;</div><div class="line"><a name="l04871"></a><span class="lineno"> 4871</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04872"></a><span class="lineno"> 4872</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l04873"></a><span class="lineno"> 4873</span>&#160;        VkDeviceSize unusedBytes,</div><div class="line"><a name="l04874"></a><span class="lineno"> 4874</span>&#160;        <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l04875"></a><span class="lineno"> 4875</span>&#160;        <span class="keywordtype">size_t</span> unusedRangeCount) <span class="keyword">const</span>;</div><div class="line"><a name="l04876"></a><span class="lineno"> 4876</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l04877"></a><span class="lineno"> 4877</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l04878"></a><span class="lineno"> 4878</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l04879"></a><span class="lineno"> 4879</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l04880"></a><span class="lineno"> 4880</span>&#160;        VkDeviceSize offset,</div><div class="line"><a name="l04881"></a><span class="lineno"> 4881</span>&#160;        VkDeviceSize size) <span class="keyword">const</span>;</div><div class="line"><a name="l04882"></a><span class="lineno"> 4882</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter&amp; json) <span class="keyword">const</span>;</div><div class="line"><a name="l04883"></a><span class="lineno"> 4883</span>&#160;<span class="preprocessor">#endif</span></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="keyword">private</span>:</div><div class="line"><a name="l04886"></a><span class="lineno"> 4886</span>&#160;    VkDeviceSize m_Size;</div><div class="line"><a name="l04887"></a><span class="lineno"> 4887</span>&#160;    <span class="keyword">const</span> VkAllocationCallbacks* m_pAllocationCallbacks;</div><div class="line"><a name="l04888"></a><span class="lineno"> 4888</span>&#160;};</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="preprocessor">#define VMA_VALIDATE(cond) do { if(!(cond)) { \</span></div><div class="line"><a name="l04891"></a><span class="lineno"> 4891</span>&#160;<span class="preprocessor">        VMA_ASSERT(0 &amp;&amp; &quot;Validation failed: &quot; #cond); \</span></div><div class="line"><a name="l04892"></a><span class="lineno"> 4892</span>&#160;<span class="preprocessor">        return false; \</span></div><div class="line"><a name="l04893"></a><span class="lineno"> 4893</span>&#160;<span class="preprocessor">    } } while(false)</span></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="keyword">class </span>VmaBlockMetadata_Generic : <span class="keyword">public</span> VmaBlockMetadata</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;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Generic)</div><div class="line"><a name="l04898"></a><span class="lineno"> 4898</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l04899"></a><span class="lineno"> 4899</span>&#160;    VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l04900"></a><span class="lineno"> 4900</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Generic();</div><div class="line"><a name="l04901"></a><span class="lineno"> 4901</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</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="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l04904"></a><span class="lineno"> 4904</span>&#160;    <span class="keyword">virtual</span> <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="l04905"></a><span class="lineno"> 4905</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div><div class="line"><a name="l04906"></a><span class="lineno"> 4906</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l04907"></a><span class="lineno"> 4907</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty() <span class="keyword">const</span>;</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="keyword">virtual</span> <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="l04910"></a><span class="lineno"> 4910</span>&#160;    <span class="keyword">virtual</span> <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="l04911"></a><span class="lineno"> 4911</span>&#160;</div><div class="line"><a name="l04912"></a><span class="lineno"> 4912</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l04913"></a><span class="lineno"> 4913</span>&#160;    <span class="keyword">virtual</span> <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="l04914"></a><span class="lineno"> 4914</span>&#160;<span class="preprocessor">#endif</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;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l04917"></a><span class="lineno"> 4917</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04918"></a><span class="lineno"> 4918</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04919"></a><span class="lineno"> 4919</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04920"></a><span class="lineno"> 4920</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04921"></a><span class="lineno"> 4921</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04922"></a><span class="lineno"> 4922</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l04923"></a><span class="lineno"> 4923</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04924"></a><span class="lineno"> 4924</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04925"></a><span class="lineno"> 4925</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l04926"></a><span class="lineno"> 4926</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l04929"></a><span class="lineno"> 4929</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04930"></a><span class="lineno"> 4930</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04931"></a><span class="lineno"> 4931</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</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">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div><div class="line"><a name="l04936"></a><span class="lineno"> 4936</span>&#160;</div><div class="line"><a name="l04937"></a><span class="lineno"> 4937</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l04938"></a><span class="lineno"> 4938</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l04939"></a><span class="lineno"> 4939</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l04940"></a><span class="lineno"> 4940</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04941"></a><span class="lineno"> 4941</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l04942"></a><span class="lineno"> 4942</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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;    <span class="keyword">virtual</span> <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="l04945"></a><span class="lineno"> 4945</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</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="keyword">private</span>:</div><div class="line"><a name="l04948"></a><span class="lineno"> 4948</span>&#160;    uint32_t m_FreeCount;</div><div class="line"><a name="l04949"></a><span class="lineno"> 4949</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l04950"></a><span class="lineno"> 4950</span>&#160;    VmaSuballocationList m_Suballocations;</div><div class="line"><a name="l04951"></a><span class="lineno"> 4951</span>&#160;    <span class="comment">// Suballocations that are free and have size greater than certain threshold.</span></div><div class="line"><a name="l04952"></a><span class="lineno"> 4952</span>&#160;    <span class="comment">// Sorted by size, ascending.</span></div><div class="line"><a name="l04953"></a><span class="lineno"> 4953</span>&#160;    VmaVector&lt; VmaSuballocationList::iterator, VmaStlAllocator&lt; VmaSuballocationList::iterator &gt; &gt; m_FreeSuballocationsBySize;</div><div class="line"><a name="l04954"></a><span class="lineno"> 4954</span>&#160;</div><div class="line"><a name="l04955"></a><span class="lineno"> 4955</span>&#160;    <span class="keywordtype">bool</span> ValidateFreeSuballocationList() <span class="keyword">const</span>;</div><div class="line"><a name="l04956"></a><span class="lineno"> 4956</span>&#160;</div><div class="line"><a name="l04957"></a><span class="lineno"> 4957</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="l04958"></a><span class="lineno"> 4958</span>&#160;    <span class="comment">// If yes, fills pOffset and returns true. If no, returns false.</span></div><div class="line"><a name="l04959"></a><span class="lineno"> 4959</span>&#160;    <span class="keywordtype">bool</span> CheckAllocation(</div><div class="line"><a name="l04960"></a><span class="lineno"> 4960</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l04961"></a><span class="lineno"> 4961</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l04962"></a><span class="lineno"> 4962</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l04963"></a><span class="lineno"> 4963</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l04964"></a><span class="lineno"> 4964</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l04965"></a><span class="lineno"> 4965</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l04966"></a><span class="lineno"> 4966</span>&#160;        VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l04967"></a><span class="lineno"> 4967</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l04968"></a><span class="lineno"> 4968</span>&#160;        VkDeviceSize* pOffset,</div><div class="line"><a name="l04969"></a><span class="lineno"> 4969</span>&#160;        <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l04970"></a><span class="lineno"> 4970</span>&#160;        VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l04971"></a><span class="lineno"> 4971</span>&#160;        VkDeviceSize* pSumItemSize) <span class="keyword">const</span>;</div><div class="line"><a name="l04972"></a><span class="lineno"> 4972</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="l04973"></a><span class="lineno"> 4973</span>&#160;    <span class="keywordtype">void</span> MergeFreeWithNext(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04974"></a><span class="lineno"> 4974</span>&#160;    <span class="comment">// Releases given suballocation, making it free.</span></div><div class="line"><a name="l04975"></a><span class="lineno"> 4975</span>&#160;    <span class="comment">// Merges it with adjacent free suballocations if applicable.</span></div><div class="line"><a name="l04976"></a><span class="lineno"> 4976</span>&#160;    <span class="comment">// Returns iterator to new free suballocation at this place.</span></div><div class="line"><a name="l04977"></a><span class="lineno"> 4977</span>&#160;    VmaSuballocationList::iterator FreeSuballocation(VmaSuballocationList::iterator suballocItem);</div><div class="line"><a name="l04978"></a><span class="lineno"> 4978</span>&#160;    <span class="comment">// Given free suballocation, it inserts it into sorted list of</span></div><div class="line"><a name="l04979"></a><span class="lineno"> 4979</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04980"></a><span class="lineno"> 4980</span>&#160;    <span class="keywordtype">void</span> RegisterFreeSuballocation(VmaSuballocationList::iterator item);</div><div class="line"><a name="l04981"></a><span class="lineno"> 4981</span>&#160;    <span class="comment">// Given free suballocation, it removes it from sorted list of</span></div><div class="line"><a name="l04982"></a><span class="lineno"> 4982</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize if it&#39;s suitable.</span></div><div class="line"><a name="l04983"></a><span class="lineno"> 4983</span>&#160;    <span class="keywordtype">void</span> UnregisterFreeSuballocation(VmaSuballocationList::iterator item);</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;</div><div class="line"><a name="l04986"></a><span class="lineno"> 4986</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l04987"></a><span class="lineno"> 4987</span>&#160;<span class="comment">Allocations and their references in internal data structure look like this:</span></div><div class="line"><a name="l04988"></a><span class="lineno"> 4988</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04989"></a><span class="lineno"> 4989</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_EMPTY):</span></div><div class="line"><a name="l04990"></a><span class="lineno"> 4990</span>&#160;<span class="comment"></span></div><div class="line"><a name="l04991"></a><span class="lineno"> 4991</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l04992"></a><span class="lineno"> 4992</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04993"></a><span class="lineno"> 4993</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04994"></a><span class="lineno"> 4994</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l04995"></a><span class="lineno"> 4995</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04996"></a><span class="lineno"> 4996</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l04997"></a><span class="lineno"> 4997</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l04998"></a><span class="lineno"> 4998</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l04999"></a><span class="lineno"> 4999</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05000"></a><span class="lineno"> 5000</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05001"></a><span class="lineno"> 5001</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05002"></a><span class="lineno"> 5002</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l05003"></a><span class="lineno"> 5003</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05004"></a><span class="lineno"> 5004</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05005"></a><span class="lineno"> 5005</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05006"></a><span class="lineno"> 5006</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05007"></a><span class="lineno"> 5007</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l05008"></a><span class="lineno"> 5008</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05009"></a><span class="lineno"> 5009</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER):</span></div><div class="line"><a name="l05010"></a><span class="lineno"> 5010</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05011"></a><span class="lineno"> 5011</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l05012"></a><span class="lineno"> 5012</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div><div class="line"><a name="l05013"></a><span class="lineno"> 5013</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05014"></a><span class="lineno"> 5014</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div><div class="line"><a name="l05015"></a><span class="lineno"> 5015</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05016"></a><span class="lineno"> 5016</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05017"></a><span class="lineno"> 5017</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05018"></a><span class="lineno"> 5018</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div><div class="line"><a name="l05019"></a><span class="lineno"> 5019</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05020"></a><span class="lineno"> 5020</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05021"></a><span class="lineno"> 5021</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05022"></a><span class="lineno"> 5022</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05023"></a><span class="lineno"> 5023</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05024"></a><span class="lineno"> 5024</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l05025"></a><span class="lineno"> 5025</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05026"></a><span class="lineno"> 5026</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l05027"></a><span class="lineno"> 5027</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05028"></a><span class="lineno"> 5028</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05029"></a><span class="lineno"> 5029</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05030"></a><span class="lineno"> 5030</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l05031"></a><span class="lineno"> 5031</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05032"></a><span class="lineno"> 5032</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05033"></a><span class="lineno"> 5033</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l05034"></a><span class="lineno"> 5034</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05035"></a><span class="lineno"> 5035</span>&#160;<span class="comment">if(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK):</span></div><div class="line"><a name="l05036"></a><span class="lineno"> 5036</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05037"></a><span class="lineno"> 5037</span>&#160;<span class="comment">        0 +-------+</span></div><div class="line"><a name="l05038"></a><span class="lineno"> 5038</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05039"></a><span class="lineno"> 5039</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05040"></a><span class="lineno"> 5040</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05041"></a><span class="lineno"> 5041</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05042"></a><span class="lineno"> 5042</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount]</span></div><div class="line"><a name="l05043"></a><span class="lineno"> 5043</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05044"></a><span class="lineno"> 5044</span>&#160;<span class="comment">          | Alloc |  1st[m_1stNullItemsBeginCount + 1]</span></div><div class="line"><a name="l05045"></a><span class="lineno"> 5045</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05046"></a><span class="lineno"> 5046</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05047"></a><span class="lineno"> 5047</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05048"></a><span class="lineno"> 5048</span>&#160;<span class="comment">          | Alloc |  1st[1st.size() - 1]</span></div><div class="line"><a name="l05049"></a><span class="lineno"> 5049</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05050"></a><span class="lineno"> 5050</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05051"></a><span class="lineno"> 5051</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05052"></a><span class="lineno"> 5052</span>&#160;<span class="comment">          |       |</span></div><div class="line"><a name="l05053"></a><span class="lineno"> 5053</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05054"></a><span class="lineno"> 5054</span>&#160;<span class="comment">          | Alloc |  2nd[2nd.size() - 1]</span></div><div class="line"><a name="l05055"></a><span class="lineno"> 5055</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05056"></a><span class="lineno"> 5056</span>&#160;<span class="comment">          |  ...  |</span></div><div class="line"><a name="l05057"></a><span class="lineno"> 5057</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05058"></a><span class="lineno"> 5058</span>&#160;<span class="comment">          | Alloc |  2nd[1]</span></div><div class="line"><a name="l05059"></a><span class="lineno"> 5059</span>&#160;<span class="comment">          +-------+</span></div><div class="line"><a name="l05060"></a><span class="lineno"> 5060</span>&#160;<span class="comment">          | Alloc |  2nd[0]</span></div><div class="line"><a name="l05061"></a><span class="lineno"> 5061</span>&#160;<span class="comment">GetSize() +-------+</span></div><div class="line"><a name="l05062"></a><span class="lineno"> 5062</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05063"></a><span class="lineno"> 5063</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05064"></a><span class="lineno"> 5064</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Linear : <span class="keyword">public</span> VmaBlockMetadata</div><div class="line"><a name="l05065"></a><span class="lineno"> 5065</span>&#160;{</div><div class="line"><a name="l05066"></a><span class="lineno"> 5066</span>&#160;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Linear)</div><div class="line"><a name="l05067"></a><span class="lineno"> 5067</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05068"></a><span class="lineno"> 5068</span>&#160;    VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05069"></a><span class="lineno"> 5069</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Linear();</div><div class="line"><a name="l05070"></a><span class="lineno"> 5070</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div><div class="line"><a name="l05071"></a><span class="lineno"> 5071</span>&#160;</div><div class="line"><a name="l05072"></a><span class="lineno"> 5072</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05073"></a><span class="lineno"> 5073</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount() <span class="keyword">const</span>;</div><div class="line"><a name="l05074"></a><span class="lineno"> 5074</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize; }</div><div class="line"><a name="l05075"></a><span class="lineno"> 5075</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l05076"></a><span class="lineno"> 5076</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetAllocationCount() == 0; }</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;    <span class="keyword">virtual</span> <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="l05079"></a><span class="lineno"> 5079</span>&#160;    <span class="keyword">virtual</span> <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="l05080"></a><span class="lineno"> 5080</span>&#160;</div><div class="line"><a name="l05081"></a><span class="lineno"> 5081</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05082"></a><span class="lineno"> 5082</span>&#160;    <span class="keyword">virtual</span> <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="l05083"></a><span class="lineno"> 5083</span>&#160;<span class="preprocessor">#endif</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;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l05086"></a><span class="lineno"> 5086</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05087"></a><span class="lineno"> 5087</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05088"></a><span class="lineno"> 5088</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05089"></a><span class="lineno"> 5089</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05090"></a><span class="lineno"> 5090</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05091"></a><span class="lineno"> 5091</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05092"></a><span class="lineno"> 5092</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05093"></a><span class="lineno"> 5093</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05094"></a><span class="lineno"> 5094</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05095"></a><span class="lineno"> 5095</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l05096"></a><span class="lineno"> 5096</span>&#160;</div><div class="line"><a name="l05097"></a><span class="lineno"> 5097</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l05098"></a><span class="lineno"> 5098</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05099"></a><span class="lineno"> 5099</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05100"></a><span class="lineno"> 5100</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</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="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData);</div><div class="line"><a name="l05105"></a><span class="lineno"> 5105</span>&#160;</div><div class="line"><a name="l05106"></a><span class="lineno"> 5106</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l05107"></a><span class="lineno"> 5107</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05108"></a><span class="lineno"> 5108</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l05109"></a><span class="lineno"> 5109</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05110"></a><span class="lineno"> 5110</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05111"></a><span class="lineno"> 5111</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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;    <span class="keyword">virtual</span> <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="l05114"></a><span class="lineno"> 5114</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset);</div><div class="line"><a name="l05115"></a><span class="lineno"> 5115</span>&#160;</div><div class="line"><a name="l05116"></a><span class="lineno"> 5116</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05117"></a><span class="lineno"> 5117</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l05118"></a><span class="lineno"> 5118</span>&#160;<span class="comment">    There are two suballocation vectors, used in ping-pong way.</span></div><div class="line"><a name="l05119"></a><span class="lineno"> 5119</span>&#160;<span class="comment">    The one with index m_1stVectorIndex is called 1st.</span></div><div class="line"><a name="l05120"></a><span class="lineno"> 5120</span>&#160;<span class="comment">    The one with index (m_1stVectorIndex ^ 1) is called 2nd.</span></div><div class="line"><a name="l05121"></a><span class="lineno"> 5121</span>&#160;<span class="comment">    2nd can be non-empty only when 1st is not empty.</span></div><div class="line"><a name="l05122"></a><span class="lineno"> 5122</span>&#160;<span class="comment">    When 2nd is not empty, m_2ndVectorMode indicates its mode of operation.</span></div><div class="line"><a name="l05123"></a><span class="lineno"> 5123</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l05124"></a><span class="lineno"> 5124</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaSuballocation, VmaStlAllocator&lt;VmaSuballocation&gt; &gt; SuballocationVectorType;</div><div class="line"><a name="l05125"></a><span class="lineno"> 5125</span>&#160;</div><div class="line"><a name="l05126"></a><span class="lineno"> 5126</span>&#160;    <span class="keyword">enum</span> SECOND_VECTOR_MODE</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;        SECOND_VECTOR_EMPTY,</div><div class="line"><a name="l05129"></a><span class="lineno"> 5129</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l05130"></a><span class="lineno"> 5130</span>&#160;<span class="comment">        Suballocations in 2nd vector are created later than the ones in 1st, but they</span></div><div class="line"><a name="l05131"></a><span class="lineno"> 5131</span>&#160;<span class="comment">        all have smaller offset.</span></div><div class="line"><a name="l05132"></a><span class="lineno"> 5132</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l05133"></a><span class="lineno"> 5133</span>&#160;        SECOND_VECTOR_RING_BUFFER,</div><div class="line"><a name="l05134"></a><span class="lineno"> 5134</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l05135"></a><span class="lineno"> 5135</span>&#160;<span class="comment">        Suballocations in 2nd vector are upper side of double stack.</span></div><div class="line"><a name="l05136"></a><span class="lineno"> 5136</span>&#160;<span class="comment">        They all have offsets higher than those in 1st vector.</span></div><div class="line"><a name="l05137"></a><span class="lineno"> 5137</span>&#160;<span class="comment">        Top of this stack means smaller offsets, but higher indices in this vector.</span></div><div class="line"><a name="l05138"></a><span class="lineno"> 5138</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l05139"></a><span class="lineno"> 5139</span>&#160;        SECOND_VECTOR_DOUBLE_STACK,</div><div class="line"><a name="l05140"></a><span class="lineno"> 5140</span>&#160;    };</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;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l05143"></a><span class="lineno"> 5143</span>&#160;    SuballocationVectorType m_Suballocations0, m_Suballocations1;</div><div class="line"><a name="l05144"></a><span class="lineno"> 5144</span>&#160;    uint32_t m_1stVectorIndex;</div><div class="line"><a name="l05145"></a><span class="lineno"> 5145</span>&#160;    SECOND_VECTOR_MODE m_2ndVectorMode;</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;    SuballocationVectorType&amp; AccessSuballocations1st() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div><div class="line"><a name="l05148"></a><span class="lineno"> 5148</span>&#160;    SuballocationVectorType&amp; AccessSuballocations2nd() { <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div><div class="line"><a name="l05149"></a><span class="lineno"> 5149</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; AccessSuballocations1st()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations1 : m_Suballocations0; }</div><div class="line"><a name="l05150"></a><span class="lineno"> 5150</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; AccessSuballocations2nd()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_1stVectorIndex ? m_Suballocations0 : m_Suballocations1; }</div><div class="line"><a name="l05151"></a><span class="lineno"> 5151</span>&#160;    </div><div class="line"><a name="l05152"></a><span class="lineno"> 5152</span>&#160;    <span class="comment">// Number of items in 1st vector with hAllocation = null at the beginning.</span></div><div class="line"><a name="l05153"></a><span class="lineno"> 5153</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsBeginCount;</div><div class="line"><a name="l05154"></a><span class="lineno"> 5154</span>&#160;    <span class="comment">// Number of other items in 1st vector with hAllocation = null somewhere in the middle.</span></div><div class="line"><a name="l05155"></a><span class="lineno"> 5155</span>&#160;    <span class="keywordtype">size_t</span> m_1stNullItemsMiddleCount;</div><div class="line"><a name="l05156"></a><span class="lineno"> 5156</span>&#160;    <span class="comment">// Number of items in 2nd vector with hAllocation = null.</span></div><div class="line"><a name="l05157"></a><span class="lineno"> 5157</span>&#160;    <span class="keywordtype">size_t</span> m_2ndNullItemsCount;</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;    <span class="keywordtype">bool</span> ShouldCompact1st() <span class="keyword">const</span>;</div><div class="line"><a name="l05160"></a><span class="lineno"> 5160</span>&#160;    <span class="keywordtype">void</span> CleanupAfterFree();</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;</div><div class="line"><a name="l05163"></a><span class="lineno"> 5163</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l05164"></a><span class="lineno"> 5164</span>&#160;<span class="comment">- GetSize() is the original size of allocated memory block.</span></div><div class="line"><a name="l05165"></a><span class="lineno"> 5165</span>&#160;<span class="comment">- m_UsableSize is this size aligned down to a power of two.</span></div><div class="line"><a name="l05166"></a><span class="lineno"> 5166</span>&#160;<span class="comment">  All allocations and calculations happen relative to m_UsableSize.</span></div><div class="line"><a name="l05167"></a><span class="lineno"> 5167</span>&#160;<span class="comment">- GetUnusableSize() is the difference between them.</span></div><div class="line"><a name="l05168"></a><span class="lineno"> 5168</span>&#160;<span class="comment">  It is repoted as separate, unused range, not available for allocations.</span></div><div class="line"><a name="l05169"></a><span class="lineno"> 5169</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05170"></a><span class="lineno"> 5170</span>&#160;<span class="comment">Node at level 0 has size = m_UsableSize.</span></div><div class="line"><a name="l05171"></a><span class="lineno"> 5171</span>&#160;<span class="comment">Each next level contains nodes with size 2 times smaller than current level.</span></div><div class="line"><a name="l05172"></a><span class="lineno"> 5172</span>&#160;<span class="comment">m_LevelCount is the maximum number of levels to use in the current object.</span></div><div class="line"><a name="l05173"></a><span class="lineno"> 5173</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05174"></a><span class="lineno"> 5174</span>&#160;<span class="keyword">class </span>VmaBlockMetadata_Buddy : <span class="keyword">public</span> VmaBlockMetadata</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;    VMA_CLASS_NO_COPY(VmaBlockMetadata_Buddy)</div><div class="line"><a name="l05177"></a><span class="lineno"> 5177</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05178"></a><span class="lineno"> 5178</span>&#160;    VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</div><div class="line"><a name="l05179"></a><span class="lineno"> 5179</span>&#160;    <span class="keyword">virtual</span> ~VmaBlockMetadata_Buddy();</div><div class="line"><a name="l05180"></a><span class="lineno"> 5180</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Init(VkDeviceSize size);</div><div class="line"><a name="l05181"></a><span class="lineno"> 5181</span>&#160;</div><div class="line"><a name="l05182"></a><span class="lineno"> 5182</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</div><div class="line"><a name="l05183"></a><span class="lineno"> 5183</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetAllocationCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationCount; }</div><div class="line"><a name="l05184"></a><span class="lineno"> 5184</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetSumFreeSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_SumFreeSize + GetUnusableSize(); }</div><div class="line"><a name="l05185"></a><span class="lineno"> 5185</span>&#160;    <span class="keyword">virtual</span> VkDeviceSize GetUnusedRangeSizeMax() <span class="keyword">const</span>;</div><div class="line"><a name="l05186"></a><span class="lineno"> 5186</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsEmpty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Root-&gt;type == Node::TYPE_FREE; }</div><div class="line"><a name="l05187"></a><span class="lineno"> 5187</span>&#160;</div><div class="line"><a name="l05188"></a><span class="lineno"> 5188</span>&#160;    <span class="keyword">virtual</span> <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="l05189"></a><span class="lineno"> 5189</span>&#160;    <span class="keyword">virtual</span> <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="l05190"></a><span class="lineno"> 5190</span>&#160;</div><div class="line"><a name="l05191"></a><span class="lineno"> 5191</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05192"></a><span class="lineno"> 5192</span>&#160;    <span class="keyword">virtual</span> <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="l05193"></a><span class="lineno"> 5193</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05194"></a><span class="lineno"> 5194</span>&#160;</div><div class="line"><a name="l05195"></a><span class="lineno"> 5195</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CreateAllocationRequest(</div><div class="line"><a name="l05196"></a><span class="lineno"> 5196</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05197"></a><span class="lineno"> 5197</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05198"></a><span class="lineno"> 5198</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05199"></a><span class="lineno"> 5199</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05200"></a><span class="lineno"> 5200</span>&#160;        VkDeviceSize allocAlignment,</div><div class="line"><a name="l05201"></a><span class="lineno"> 5201</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05202"></a><span class="lineno"> 5202</span>&#160;        VmaSuballocationType allocType,</div><div class="line"><a name="l05203"></a><span class="lineno"> 5203</span>&#160;        <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l05204"></a><span class="lineno"> 5204</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05205"></a><span class="lineno"> 5205</span>&#160;        VmaAllocationRequest* pAllocationRequest);</div><div class="line"><a name="l05206"></a><span class="lineno"> 5206</span>&#160;</div><div class="line"><a name="l05207"></a><span class="lineno"> 5207</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MakeRequestedAllocationsLost(</div><div class="line"><a name="l05208"></a><span class="lineno"> 5208</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05209"></a><span class="lineno"> 5209</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05210"></a><span class="lineno"> 5210</span>&#160;        VmaAllocationRequest* pAllocationRequest);</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;    <span class="keyword">virtual</span> uint32_t MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount);</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="keyword">virtual</span> VkResult CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData) { <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT; }</div><div class="line"><a name="l05215"></a><span class="lineno"> 5215</span>&#160;</div><div class="line"><a name="l05216"></a><span class="lineno"> 5216</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Alloc(</div><div class="line"><a name="l05217"></a><span class="lineno"> 5217</span>&#160;        <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l05218"></a><span class="lineno"> 5218</span>&#160;        VmaSuballocationType type,</div><div class="line"><a name="l05219"></a><span class="lineno"> 5219</span>&#160;        VkDeviceSize allocSize,</div><div class="line"><a name="l05220"></a><span class="lineno"> 5220</span>&#160;        <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l05221"></a><span class="lineno"> 5221</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</div><div class="line"><a name="l05222"></a><span class="lineno"> 5222</span>&#160;</div><div class="line"><a name="l05223"></a><span class="lineno"> 5223</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation) { FreeAtOffset(allocation, allocation-&gt;GetOffset()); }</div><div class="line"><a name="l05224"></a><span class="lineno"> 5224</span>&#160;    <span class="keyword">virtual</span> <span class="keywordtype">void</span> FreeAtOffset(VkDeviceSize offset) { FreeAtOffset(VMA_NULL, offset); }</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="keyword">private</span>:</div><div class="line"><a name="l05227"></a><span class="lineno"> 5227</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> VkDeviceSize MIN_NODE_SIZE = 32;</div><div class="line"><a name="l05228"></a><span class="lineno"> 5228</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">size_t</span> MAX_LEVELS = 30;</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;    <span class="keyword">struct </span>ValidationContext</div><div class="line"><a name="l05231"></a><span class="lineno"> 5231</span>&#160;    {</div><div class="line"><a name="l05232"></a><span class="lineno"> 5232</span>&#160;        <span class="keywordtype">size_t</span> calculatedAllocationCount;</div><div class="line"><a name="l05233"></a><span class="lineno"> 5233</span>&#160;        <span class="keywordtype">size_t</span> calculatedFreeCount;</div><div class="line"><a name="l05234"></a><span class="lineno"> 5234</span>&#160;        VkDeviceSize calculatedSumFreeSize;</div><div class="line"><a name="l05235"></a><span class="lineno"> 5235</span>&#160;</div><div class="line"><a name="l05236"></a><span class="lineno"> 5236</span>&#160;        ValidationContext() :</div><div class="line"><a name="l05237"></a><span class="lineno"> 5237</span>&#160;            calculatedAllocationCount(0),</div><div class="line"><a name="l05238"></a><span class="lineno"> 5238</span>&#160;            calculatedFreeCount(0),</div><div class="line"><a name="l05239"></a><span class="lineno"> 5239</span>&#160;            calculatedSumFreeSize(0) { }</div><div class="line"><a name="l05240"></a><span class="lineno"> 5240</span>&#160;    };</div><div class="line"><a name="l05241"></a><span class="lineno"> 5241</span>&#160;</div><div class="line"><a name="l05242"></a><span class="lineno"> 5242</span>&#160;    <span class="keyword">struct </span>Node</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;        VkDeviceSize offset;</div><div class="line"><a name="l05245"></a><span class="lineno"> 5245</span>&#160;        <span class="keyword">enum</span> TYPE</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;            TYPE_FREE,</div><div class="line"><a name="l05248"></a><span class="lineno"> 5248</span>&#160;            TYPE_ALLOCATION,</div><div class="line"><a name="l05249"></a><span class="lineno"> 5249</span>&#160;            TYPE_SPLIT,</div><div class="line"><a name="l05250"></a><span class="lineno"> 5250</span>&#160;            TYPE_COUNT</div><div class="line"><a name="l05251"></a><span class="lineno"> 5251</span>&#160;        } type;</div><div class="line"><a name="l05252"></a><span class="lineno"> 5252</span>&#160;        Node* parent;</div><div class="line"><a name="l05253"></a><span class="lineno"> 5253</span>&#160;        Node* buddy;</div><div class="line"><a name="l05254"></a><span class="lineno"> 5254</span>&#160;</div><div class="line"><a name="l05255"></a><span class="lineno"> 5255</span>&#160;        <span class="keyword">union</span></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="keyword">struct</span></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;                Node* prev;</div><div class="line"><a name="l05260"></a><span class="lineno"> 5260</span>&#160;                Node* next;</div><div class="line"><a name="l05261"></a><span class="lineno"> 5261</span>&#160;            } free;</div><div class="line"><a name="l05262"></a><span class="lineno"> 5262</span>&#160;            <span class="keyword">struct</span></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;                <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc;</div><div class="line"><a name="l05265"></a><span class="lineno"> 5265</span>&#160;            } allocation;</div><div class="line"><a name="l05266"></a><span class="lineno"> 5266</span>&#160;            <span class="keyword">struct</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;                Node* leftChild;</div><div class="line"><a name="l05269"></a><span class="lineno"> 5269</span>&#160;            } split;</div><div class="line"><a name="l05270"></a><span class="lineno"> 5270</span>&#160;        };</div><div class="line"><a name="l05271"></a><span class="lineno"> 5271</span>&#160;    };</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;    <span class="comment">// Size of the memory block aligned down to a power of two.</span></div><div class="line"><a name="l05274"></a><span class="lineno"> 5274</span>&#160;    VkDeviceSize m_UsableSize;</div><div class="line"><a name="l05275"></a><span class="lineno"> 5275</span>&#160;    uint32_t m_LevelCount;</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;    Node* m_Root;</div><div class="line"><a name="l05278"></a><span class="lineno"> 5278</span>&#160;    <span class="keyword">struct </span>{</div><div class="line"><a name="l05279"></a><span class="lineno"> 5279</span>&#160;        Node* front;</div><div class="line"><a name="l05280"></a><span class="lineno"> 5280</span>&#160;        Node* back;</div><div class="line"><a name="l05281"></a><span class="lineno"> 5281</span>&#160;    } m_FreeList[MAX_LEVELS];</div><div class="line"><a name="l05282"></a><span class="lineno"> 5282</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_ALLOCATION.</span></div><div class="line"><a name="l05283"></a><span class="lineno"> 5283</span>&#160;    <span class="keywordtype">size_t</span> m_AllocationCount;</div><div class="line"><a name="l05284"></a><span class="lineno"> 5284</span>&#160;    <span class="comment">// Number of nodes in the tree with type == TYPE_FREE.</span></div><div class="line"><a name="l05285"></a><span class="lineno"> 5285</span>&#160;    <span class="keywordtype">size_t</span> m_FreeCount;</div><div class="line"><a name="l05286"></a><span class="lineno"> 5286</span>&#160;    <span class="comment">// This includes space wasted due to internal fragmentation. Doesn&#39;t include unusable size.</span></div><div class="line"><a name="l05287"></a><span class="lineno"> 5287</span>&#160;    VkDeviceSize m_SumFreeSize;</div><div class="line"><a name="l05288"></a><span class="lineno"> 5288</span>&#160;</div><div class="line"><a name="l05289"></a><span class="lineno"> 5289</span>&#160;    VkDeviceSize GetUnusableSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> GetSize() - m_UsableSize; }</div><div class="line"><a name="l05290"></a><span class="lineno"> 5290</span>&#160;    <span class="keywordtype">void</span> DeleteNode(Node* node);</div><div class="line"><a name="l05291"></a><span class="lineno"> 5291</span>&#160;    <span class="keywordtype">bool</span> ValidateNode(ValidationContext&amp; ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05292"></a><span class="lineno"> 5292</span>&#160;    uint32_t AllocSizeToLevel(VkDeviceSize allocSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05293"></a><span class="lineno"> 5293</span>&#160;    <span class="keyword">inline</span> VkDeviceSize LevelToNodeSize(uint32_t level)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_UsableSize &gt;&gt; level; }</div><div class="line"><a name="l05294"></a><span class="lineno"> 5294</span>&#160;    <span class="comment">// Alloc passed just for validation. Can be null.</span></div><div class="line"><a name="l05295"></a><span class="lineno"> 5295</span>&#160;    <span class="keywordtype">void</span> FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset);</div><div class="line"><a name="l05296"></a><span class="lineno"> 5296</span>&#160;    <span class="keywordtype">void</span> CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05297"></a><span class="lineno"> 5297</span>&#160;    <span class="comment">// Adds node to the front of FreeList at given level.</span></div><div class="line"><a name="l05298"></a><span class="lineno"> 5298</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div><div class="line"><a name="l05299"></a><span class="lineno"> 5299</span>&#160;    <span class="comment">// node-&gt;free.prev, next can be undefined.</span></div><div class="line"><a name="l05300"></a><span class="lineno"> 5300</span>&#160;    <span class="keywordtype">void</span> AddToFreeListFront(uint32_t level, Node* node);</div><div class="line"><a name="l05301"></a><span class="lineno"> 5301</span>&#160;    <span class="comment">// Removes node from FreeList at given level.</span></div><div class="line"><a name="l05302"></a><span class="lineno"> 5302</span>&#160;    <span class="comment">// node-&gt;type must be FREE.</span></div><div class="line"><a name="l05303"></a><span class="lineno"> 5303</span>&#160;    <span class="comment">// node-&gt;free.prev, next stay untouched.</span></div><div class="line"><a name="l05304"></a><span class="lineno"> 5304</span>&#160;    <span class="keywordtype">void</span> RemoveFromFreeList(uint32_t level, Node* node);</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05307"></a><span class="lineno"> 5307</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter&amp; json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize) <span class="keyword">const</span>;</div><div class="line"><a name="l05308"></a><span class="lineno"> 5308</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l05309"></a><span class="lineno"> 5309</span>&#160;};</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="comment">/*</span></div><div class="line"><a name="l05312"></a><span class="lineno"> 5312</span>&#160;<span class="comment">Represents a single block of device memory (`VkDeviceMemory`) with all the</span></div><div class="line"><a name="l05313"></a><span class="lineno"> 5313</span>&#160;<span class="comment">data about its regions (aka suballocations, #VmaAllocation), assigned and free.</span></div><div class="line"><a name="l05314"></a><span class="lineno"> 5314</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05315"></a><span class="lineno"> 5315</span>&#160;<span class="comment">Thread-safety: This class must be externally synchronized.</span></div><div class="line"><a name="l05316"></a><span class="lineno"> 5316</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05317"></a><span class="lineno"> 5317</span>&#160;<span class="keyword">class </span>VmaDeviceMemoryBlock</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;    VMA_CLASS_NO_COPY(VmaDeviceMemoryBlock)</div><div class="line"><a name="l05320"></a><span class="lineno"> 5320</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05321"></a><span class="lineno"> 5321</span>&#160;    VmaBlockMetadata* m_pMetadata;</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;    VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</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;    ~VmaDeviceMemoryBlock()</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;        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="l05328"></a><span class="lineno"> 5328</span>&#160;        VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</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;</div><div class="line"><a name="l05331"></a><span class="lineno"> 5331</span>&#160;    <span class="comment">// Always call after construction.</span></div><div class="line"><a name="l05332"></a><span class="lineno"> 5332</span>&#160;    <span class="keywordtype">void</span> Init(</div><div class="line"><a name="l05333"></a><span class="lineno"> 5333</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05334"></a><span class="lineno"> 5334</span>&#160;        uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l05335"></a><span class="lineno"> 5335</span>&#160;        VkDeviceMemory newMemory,</div><div class="line"><a name="l05336"></a><span class="lineno"> 5336</span>&#160;        VkDeviceSize newSize,</div><div class="line"><a name="l05337"></a><span class="lineno"> 5337</span>&#160;        uint32_t <span class="keywordtype">id</span>,</div><div class="line"><a name="l05338"></a><span class="lineno"> 5338</span>&#160;        uint32_t algorithm);</div><div class="line"><a name="l05339"></a><span class="lineno"> 5339</span>&#160;    <span class="comment">// Always call before destruction.</span></div><div class="line"><a name="l05340"></a><span class="lineno"> 5340</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="l05341"></a><span class="lineno"> 5341</span>&#160;    </div><div class="line"><a name="l05342"></a><span class="lineno"> 5342</span>&#160;    VkDeviceMemory GetDeviceMemory()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_hMemory; }</div><div class="line"><a name="l05343"></a><span class="lineno"> 5343</span>&#160;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l05344"></a><span class="lineno"> 5344</span>&#160;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l05345"></a><span class="lineno"> 5345</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="l05346"></a><span class="lineno"> 5346</span>&#160;</div><div class="line"><a name="l05347"></a><span class="lineno"> 5347</span>&#160;    <span class="comment">// Validates all data structures inside this object. If not valid, returns false.</span></div><div class="line"><a name="l05348"></a><span class="lineno"> 5348</span>&#160;    <span class="keywordtype">bool</span> Validate() <span class="keyword">const</span>;</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;    VkResult CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator);</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;    <span class="comment">// ppData can be null.</span></div><div class="line"><a name="l05353"></a><span class="lineno"> 5353</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="l05354"></a><span class="lineno"> 5354</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="l05355"></a><span class="lineno"> 5355</span>&#160;</div><div class="line"><a name="l05356"></a><span class="lineno"> 5356</span>&#160;    VkResult WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</div><div class="line"><a name="l05357"></a><span class="lineno"> 5357</span>&#160;    VkResult ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize);</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;    VkResult BindBufferMemory(</div><div class="line"><a name="l05360"></a><span class="lineno"> 5360</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05361"></a><span class="lineno"> 5361</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05362"></a><span class="lineno"> 5362</span>&#160;        VkBuffer hBuffer);</div><div class="line"><a name="l05363"></a><span class="lineno"> 5363</span>&#160;    VkResult BindImageMemory(</div><div class="line"><a name="l05364"></a><span class="lineno"> 5364</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05365"></a><span class="lineno"> 5365</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05366"></a><span class="lineno"> 5366</span>&#160;        VkImage hImage);</div><div class="line"><a name="l05367"></a><span class="lineno"> 5367</span>&#160;</div><div class="line"><a name="l05368"></a><span class="lineno"> 5368</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05369"></a><span class="lineno"> 5369</span>&#160;    uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l05370"></a><span class="lineno"> 5370</span>&#160;    uint32_t m_Id;</div><div class="line"><a name="l05371"></a><span class="lineno"> 5371</span>&#160;    VkDeviceMemory m_hMemory;</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;    <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="l05374"></a><span class="lineno"> 5374</span>&#160;    <span class="comment">// Also protects m_MapCount, m_pMappedData.</span></div><div class="line"><a name="l05375"></a><span class="lineno"> 5375</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l05376"></a><span class="lineno"> 5376</span>&#160;    uint32_t m_MapCount;</div><div class="line"><a name="l05377"></a><span class="lineno"> 5377</span>&#160;    <span class="keywordtype">void</span>* m_pMappedData;</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;</div><div class="line"><a name="l05380"></a><span class="lineno"> 5380</span>&#160;<span class="keyword">struct </span>VmaPointerLess</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="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="l05383"></a><span class="lineno"> 5383</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05384"></a><span class="lineno"> 5384</span>&#160;        <span class="keywordflow">return</span> lhs &lt; rhs;</div><div class="line"><a name="l05385"></a><span class="lineno"> 5385</span>&#160;    }</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;</div><div class="line"><a name="l05388"></a><span class="lineno"> 5388</span>&#160;<span class="keyword">class </span>VmaDefragmentator;</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;<span class="comment">/*</span></div><div class="line"><a name="l05391"></a><span class="lineno"> 5391</span>&#160;<span class="comment">Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific</span></div><div class="line"><a name="l05392"></a><span class="lineno"> 5392</span>&#160;<span class="comment">Vulkan memory type.</span></div><div class="line"><a name="l05393"></a><span class="lineno"> 5393</span>&#160;<span class="comment"></span></div><div class="line"><a name="l05394"></a><span class="lineno"> 5394</span>&#160;<span class="comment">Synchronized internally with a mutex.</span></div><div class="line"><a name="l05395"></a><span class="lineno"> 5395</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l05396"></a><span class="lineno"> 5396</span>&#160;<span class="keyword">struct </span>VmaBlockVector</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;    VMA_CLASS_NO_COPY(VmaBlockVector)</div><div class="line"><a name="l05399"></a><span class="lineno"> 5399</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05400"></a><span class="lineno"> 5400</span>&#160;    VmaBlockVector(</div><div class="line"><a name="l05401"></a><span class="lineno"> 5401</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05402"></a><span class="lineno"> 5402</span>&#160;        uint32_t memoryTypeIndex,</div><div class="line"><a name="l05403"></a><span class="lineno"> 5403</span>&#160;        VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l05404"></a><span class="lineno"> 5404</span>&#160;        <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l05405"></a><span class="lineno"> 5405</span>&#160;        <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l05406"></a><span class="lineno"> 5406</span>&#160;        VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l05407"></a><span class="lineno"> 5407</span>&#160;        uint32_t frameInUseCount,</div><div class="line"><a name="l05408"></a><span class="lineno"> 5408</span>&#160;        <span class="keywordtype">bool</span> isCustomPool,</div><div class="line"><a name="l05409"></a><span class="lineno"> 5409</span>&#160;        <span class="keywordtype">bool</span> explicitBlockSize,</div><div class="line"><a name="l05410"></a><span class="lineno"> 5410</span>&#160;        uint32_t algorithm);</div><div class="line"><a name="l05411"></a><span class="lineno"> 5411</span>&#160;    ~VmaBlockVector();</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;    VkResult CreateMinBlocks();</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;    uint32_t GetMemoryTypeIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemoryTypeIndex; }</div><div class="line"><a name="l05416"></a><span class="lineno"> 5416</span>&#160;    VkDeviceSize GetPreferredBlockSize()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_PreferredBlockSize; }</div><div class="line"><a name="l05417"></a><span class="lineno"> 5417</span>&#160;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BufferImageGranularity; }</div><div class="line"><a name="l05418"></a><span class="lineno"> 5418</span>&#160;    uint32_t GetFrameInUseCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_FrameInUseCount; }</div><div class="line"><a name="l05419"></a><span class="lineno"> 5419</span>&#160;    uint32_t GetAlgorithm()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Algorithm; }</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;    <span class="keywordtype">void</span> GetPoolStats(<a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pStats);</div><div class="line"><a name="l05422"></a><span class="lineno"> 5422</span>&#160;</div><div class="line"><a name="l05423"></a><span class="lineno"> 5423</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="l05424"></a><span class="lineno"> 5424</span>&#160;    <span class="keywordtype">bool</span> IsCorruptionDetectionEnabled() <span class="keyword">const</span>;</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;    VkResult Allocate(</div><div class="line"><a name="l05427"></a><span class="lineno"> 5427</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l05428"></a><span class="lineno"> 5428</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05429"></a><span class="lineno"> 5429</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05430"></a><span class="lineno"> 5430</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05431"></a><span class="lineno"> 5431</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="l05432"></a><span class="lineno"> 5432</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05433"></a><span class="lineno"> 5433</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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="keywordtype">void</span> Free(</div><div class="line"><a name="l05436"></a><span class="lineno"> 5436</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation);</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="comment">// Adds statistics of this BlockVector to pStats.</span></div><div class="line"><a name="l05439"></a><span class="lineno"> 5439</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="l05440"></a><span class="lineno"> 5440</span>&#160;</div><div class="line"><a name="l05441"></a><span class="lineno"> 5441</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05442"></a><span class="lineno"> 5442</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l05443"></a><span class="lineno"> 5443</span>&#160;<span class="preprocessor">#endif</span></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;    <span class="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l05446"></a><span class="lineno"> 5446</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05447"></a><span class="lineno"> 5447</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l05448"></a><span class="lineno"> 5448</span>&#160;    VkResult CheckCorruption();</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;    VmaDefragmentator* EnsureDefragmentator(</div><div class="line"><a name="l05451"></a><span class="lineno"> 5451</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05452"></a><span class="lineno"> 5452</span>&#160;        uint32_t currentFrameIndex);</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;    VkResult Defragment(</div><div class="line"><a name="l05455"></a><span class="lineno"> 5455</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l05456"></a><span class="lineno"> 5456</span>&#160;        VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l05457"></a><span class="lineno"> 5457</span>&#160;        uint32_t&amp; maxAllocationsToMove);</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> DestroyDefragmentator();</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="keyword">private</span>:</div><div class="line"><a name="l05462"></a><span class="lineno"> 5462</span>&#160;    <span class="keyword">friend</span> <span class="keyword">class </span>VmaDefragmentator;</div><div class="line"><a name="l05463"></a><span class="lineno"> 5463</span>&#160;</div><div class="line"><a name="l05464"></a><span class="lineno"> 5464</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="l05465"></a><span class="lineno"> 5465</span>&#160;    <span class="keyword">const</span> uint32_t m_MemoryTypeIndex;</div><div class="line"><a name="l05466"></a><span class="lineno"> 5466</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_PreferredBlockSize;</div><div class="line"><a name="l05467"></a><span class="lineno"> 5467</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MinBlockCount;</div><div class="line"><a name="l05468"></a><span class="lineno"> 5468</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> m_MaxBlockCount;</div><div class="line"><a name="l05469"></a><span class="lineno"> 5469</span>&#160;    <span class="keyword">const</span> VkDeviceSize m_BufferImageGranularity;</div><div class="line"><a name="l05470"></a><span class="lineno"> 5470</span>&#160;    <span class="keyword">const</span> uint32_t m_FrameInUseCount;</div><div class="line"><a name="l05471"></a><span class="lineno"> 5471</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_IsCustomPool;</div><div class="line"><a name="l05472"></a><span class="lineno"> 5472</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> m_ExplicitBlockSize;</div><div class="line"><a name="l05473"></a><span class="lineno"> 5473</span>&#160;    <span class="keyword">const</span> uint32_t m_Algorithm;</div><div class="line"><a name="l05474"></a><span class="lineno"> 5474</span>&#160;    <span class="keywordtype">bool</span> m_HasEmptyBlock;</div><div class="line"><a name="l05475"></a><span class="lineno"> 5475</span>&#160;    VMA_MUTEX m_Mutex;</div><div class="line"><a name="l05476"></a><span class="lineno"> 5476</span>&#160;    <span class="comment">// Incrementally sorted by sumFreeSize, ascending.</span></div><div class="line"><a name="l05477"></a><span class="lineno"> 5477</span>&#160;    VmaVector&lt; VmaDeviceMemoryBlock*, VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt; &gt; m_Blocks;</div><div class="line"><a name="l05478"></a><span class="lineno"> 5478</span>&#160;    <span class="comment">/* There can be at most one allocation that is completely empty - a</span></div><div class="line"><a name="l05479"></a><span class="lineno"> 5479</span>&#160;<span class="comment">    hysteresis to avoid pessimistic case of alternating creation and destruction</span></div><div class="line"><a name="l05480"></a><span class="lineno"> 5480</span>&#160;<span class="comment">    of a VkDeviceMemory. */</span></div><div class="line"><a name="l05481"></a><span class="lineno"> 5481</span>&#160;    VmaDefragmentator* m_pDefragmentator;</div><div class="line"><a name="l05482"></a><span class="lineno"> 5482</span>&#160;    uint32_t m_NextBlockId;</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;    VkDeviceSize CalcMaxBlockSize() <span class="keyword">const</span>;</div><div class="line"><a name="l05485"></a><span class="lineno"> 5485</span>&#160;</div><div class="line"><a name="l05486"></a><span class="lineno"> 5486</span>&#160;    <span class="comment">// Finds and removes given block from vector.</span></div><div class="line"><a name="l05487"></a><span class="lineno"> 5487</span>&#160;    <span class="keywordtype">void</span> Remove(VmaDeviceMemoryBlock* pBlock);</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;    <span class="comment">// Performs single step in sorting m_Blocks. They may not be fully sorted</span></div><div class="line"><a name="l05490"></a><span class="lineno"> 5490</span>&#160;    <span class="comment">// after this call.</span></div><div class="line"><a name="l05491"></a><span class="lineno"> 5491</span>&#160;    <span class="keywordtype">void</span> IncrementallySortBlocks();</div><div class="line"><a name="l05492"></a><span class="lineno"> 5492</span>&#160;</div><div class="line"><a name="l05493"></a><span class="lineno"> 5493</span>&#160;    <span class="comment">// To be used only without CAN_MAKE_OTHER_LOST flag.</span></div><div class="line"><a name="l05494"></a><span class="lineno"> 5494</span>&#160;    VkResult AllocateFromBlock(</div><div class="line"><a name="l05495"></a><span class="lineno"> 5495</span>&#160;        VmaDeviceMemoryBlock* pBlock,</div><div class="line"><a name="l05496"></a><span class="lineno"> 5496</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l05497"></a><span class="lineno"> 5497</span>&#160;        uint32_t currentFrameIndex,</div><div class="line"><a name="l05498"></a><span class="lineno"> 5498</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05499"></a><span class="lineno"> 5499</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05500"></a><span class="lineno"> 5500</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div><div class="line"><a name="l05501"></a><span class="lineno"> 5501</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l05502"></a><span class="lineno"> 5502</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05503"></a><span class="lineno"> 5503</span>&#160;        uint32_t strategy,</div><div class="line"><a name="l05504"></a><span class="lineno"> 5504</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l05505"></a><span class="lineno"> 5505</span>&#160;</div><div class="line"><a name="l05506"></a><span class="lineno"> 5506</span>&#160;    VkResult CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex);</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;</div><div class="line"><a name="l05509"></a><span class="lineno"> 5509</span>&#160;<span class="keyword">struct </span>VmaPool_T</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;    VMA_CLASS_NO_COPY(VmaPool_T)</div><div class="line"><a name="l05512"></a><span class="lineno"> 5512</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05513"></a><span class="lineno"> 5513</span>&#160;    VmaBlockVector m_BlockVector;</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;    VmaPool_T(</div><div class="line"><a name="l05516"></a><span class="lineno"> 5516</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05517"></a><span class="lineno"> 5517</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="l05518"></a><span class="lineno"> 5518</span>&#160;        VkDeviceSize preferredBlockSize);</div><div class="line"><a name="l05519"></a><span class="lineno"> 5519</span>&#160;    ~VmaPool_T();</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;    uint32_t GetId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l05522"></a><span class="lineno"> 5522</span>&#160;    <span class="keywordtype">void</span> SetId(uint32_t <span class="keywordtype">id</span>) { VMA_ASSERT(m_Id == 0); m_Id = id; }</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05525"></a><span class="lineno"> 5525</span>&#160;    <span class="comment">//void PrintDetailedMap(class VmaStringBuilder&amp; sb);</span></div><div class="line"><a name="l05526"></a><span class="lineno"> 5526</span>&#160;<span class="preprocessor">#endif</span></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="keyword">private</span>:</div><div class="line"><a name="l05529"></a><span class="lineno"> 5529</span>&#160;    uint32_t m_Id;</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;</div><div class="line"><a name="l05532"></a><span class="lineno"> 5532</span>&#160;<span class="keyword">class </span>VmaDefragmentator</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;    VMA_CLASS_NO_COPY(VmaDefragmentator)</div><div class="line"><a name="l05535"></a><span class="lineno"> 5535</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l05536"></a><span class="lineno"> 5536</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="l05537"></a><span class="lineno"> 5537</span>&#160;    VmaBlockVector* <span class="keyword">const</span> m_pBlockVector;</div><div class="line"><a name="l05538"></a><span class="lineno"> 5538</span>&#160;    uint32_t m_CurrentFrameIndex;</div><div class="line"><a name="l05539"></a><span class="lineno"> 5539</span>&#160;    VkDeviceSize m_BytesMoved;</div><div class="line"><a name="l05540"></a><span class="lineno"> 5540</span>&#160;    uint32_t m_AllocationsMoved;</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="keyword">struct </span>AllocationInfo</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;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> m_hAllocation;</div><div class="line"><a name="l05545"></a><span class="lineno"> 5545</span>&#160;        VkBool32* m_pChanged;</div><div class="line"><a name="l05546"></a><span class="lineno"> 5546</span>&#160;</div><div class="line"><a name="l05547"></a><span class="lineno"> 5547</span>&#160;        AllocationInfo() :</div><div class="line"><a name="l05548"></a><span class="lineno"> 5548</span>&#160;            m_hAllocation(VK_NULL_HANDLE),</div><div class="line"><a name="l05549"></a><span class="lineno"> 5549</span>&#160;            m_pChanged(VMA_NULL)</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;    };</div><div class="line"><a name="l05553"></a><span class="lineno"> 5553</span>&#160;</div><div class="line"><a name="l05554"></a><span class="lineno"> 5554</span>&#160;    <span class="keyword">struct </span>AllocationInfoSizeGreater</div><div class="line"><a name="l05555"></a><span class="lineno"> 5555</span>&#160;    {</div><div class="line"><a name="l05556"></a><span class="lineno"> 5556</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="l05557"></a><span class="lineno"> 5557</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l05558"></a><span class="lineno"> 5558</span>&#160;            <span class="keywordflow">return</span> lhs.m_hAllocation-&gt;GetSize() &gt; rhs.m_hAllocation-&gt;GetSize();</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;</div><div class="line"><a name="l05562"></a><span class="lineno"> 5562</span>&#160;    <span class="comment">// Used between AddAllocation and Defragment.</span></div><div class="line"><a name="l05563"></a><span class="lineno"> 5563</span>&#160;    VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</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="keyword">struct </span>BlockInfo</div><div class="line"><a name="l05566"></a><span class="lineno"> 5566</span>&#160;    {</div><div class="line"><a name="l05567"></a><span class="lineno"> 5567</span>&#160;        VmaDeviceMemoryBlock* m_pBlock;</div><div class="line"><a name="l05568"></a><span class="lineno"> 5568</span>&#160;        <span class="keywordtype">bool</span> m_HasNonMovableAllocations;</div><div class="line"><a name="l05569"></a><span class="lineno"> 5569</span>&#160;        VmaVector&lt; AllocationInfo, VmaStlAllocator&lt;AllocationInfo&gt; &gt; m_Allocations;</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;        BlockInfo(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks) :</div><div class="line"><a name="l05572"></a><span class="lineno"> 5572</span>&#160;            m_pBlock(VMA_NULL),</div><div class="line"><a name="l05573"></a><span class="lineno"> 5573</span>&#160;            m_HasNonMovableAllocations(true),</div><div class="line"><a name="l05574"></a><span class="lineno"> 5574</span>&#160;            m_Allocations(pAllocationCallbacks),</div><div class="line"><a name="l05575"></a><span class="lineno"> 5575</span>&#160;            m_pMappedDataForDefragmentation(VMA_NULL)</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;        }</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;        <span class="keywordtype">void</span> CalcHasNonMovableAllocations()</div><div class="line"><a name="l05580"></a><span class="lineno"> 5580</span>&#160;        {</div><div class="line"><a name="l05581"></a><span class="lineno"> 5581</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockAllocCount = m_pBlock-&gt;m_pMetadata-&gt;GetAllocationCount();</div><div class="line"><a name="l05582"></a><span class="lineno"> 5582</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> defragmentAllocCount = m_Allocations.size();</div><div class="line"><a name="l05583"></a><span class="lineno"> 5583</span>&#160;            m_HasNonMovableAllocations = blockAllocCount != defragmentAllocCount;</div><div class="line"><a name="l05584"></a><span class="lineno"> 5584</span>&#160;        }</div><div class="line"><a name="l05585"></a><span class="lineno"> 5585</span>&#160;</div><div class="line"><a name="l05586"></a><span class="lineno"> 5586</span>&#160;        <span class="keywordtype">void</span> SortAllocationsBySizeDescecnding()</div><div class="line"><a name="l05587"></a><span class="lineno"> 5587</span>&#160;        {</div><div class="line"><a name="l05588"></a><span class="lineno"> 5588</span>&#160;            VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());</div><div class="line"><a name="l05589"></a><span class="lineno"> 5589</span>&#160;        }</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;        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="l05592"></a><span class="lineno"> 5592</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="l05593"></a><span class="lineno"> 5593</span>&#160;</div><div class="line"><a name="l05594"></a><span class="lineno"> 5594</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l05595"></a><span class="lineno"> 5595</span>&#160;        <span class="comment">// Not null if mapped for defragmentation only, not originally mapped.</span></div><div class="line"><a name="l05596"></a><span class="lineno"> 5596</span>&#160;        <span class="keywordtype">void</span>* m_pMappedDataForDefragmentation;</div><div class="line"><a name="l05597"></a><span class="lineno"> 5597</span>&#160;    };</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;    <span class="keyword">struct </span>BlockPointerLess</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;        <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="l05602"></a><span class="lineno"> 5602</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l05603"></a><span class="lineno"> 5603</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlock;</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;        <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="l05606"></a><span class="lineno"> 5606</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l05607"></a><span class="lineno"> 5607</span>&#160;            <span class="keywordflow">return</span> pLhsBlockInfo-&gt;m_pBlock &lt; pRhsBlockInfo-&gt;m_pBlock;</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;    };</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="comment">// 1. Blocks with some non-movable allocations go first.</span></div><div class="line"><a name="l05612"></a><span class="lineno"> 5612</span>&#160;    <span class="comment">// 2. Blocks with smaller sumFreeSize go first.</span></div><div class="line"><a name="l05613"></a><span class="lineno"> 5613</span>&#160;    <span class="keyword">struct </span>BlockInfoCompareMoveDestination</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;        <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="l05616"></a><span class="lineno"> 5616</span>&#160;<span class="keyword">        </span>{</div><div class="line"><a name="l05617"></a><span class="lineno"> 5617</span>&#160;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; !pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l05618"></a><span class="lineno"> 5618</span>&#160;            {</div><div class="line"><a name="l05619"></a><span class="lineno"> 5619</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;            <span class="keywordflow">if</span>(!pLhsBlockInfo-&gt;m_HasNonMovableAllocations &amp;&amp; pRhsBlockInfo-&gt;m_HasNonMovableAllocations)</div><div class="line"><a name="l05622"></a><span class="lineno"> 5622</span>&#160;            {</div><div class="line"><a name="l05623"></a><span class="lineno"> 5623</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;            <span class="keywordflow">if</span>(pLhsBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;GetSumFreeSize() &lt; pRhsBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;GetSumFreeSize())</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">true</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">return</span> <span class="keyword">false</span>;</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;</div><div class="line"><a name="l05633"></a><span class="lineno"> 5633</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; BlockInfo*, VmaStlAllocator&lt;BlockInfo*&gt; &gt; BlockInfoVector;</div><div class="line"><a name="l05634"></a><span class="lineno"> 5634</span>&#160;    BlockInfoVector m_Blocks;</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;    VkResult DefragmentRound(</div><div class="line"><a name="l05637"></a><span class="lineno"> 5637</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l05638"></a><span class="lineno"> 5638</span>&#160;        uint32_t maxAllocationsToMove);</div><div class="line"><a name="l05639"></a><span class="lineno"> 5639</span>&#160;</div><div class="line"><a name="l05640"></a><span class="lineno"> 5640</span>&#160;    <span class="keyword">static</span> <span class="keywordtype">bool</span> MoveMakesSense(</div><div class="line"><a name="l05641"></a><span class="lineno"> 5641</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l05642"></a><span class="lineno"> 5642</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset);</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="keyword">public</span>:</div><div class="line"><a name="l05645"></a><span class="lineno"> 5645</span>&#160;    VmaDefragmentator(</div><div class="line"><a name="l05646"></a><span class="lineno"> 5646</span>&#160;        <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l05647"></a><span class="lineno"> 5647</span>&#160;        VmaBlockVector* pBlockVector,</div><div class="line"><a name="l05648"></a><span class="lineno"> 5648</span>&#160;        uint32_t currentFrameIndex);</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;    ~VmaDefragmentator();</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;    VkDeviceSize GetBytesMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_BytesMoved; }</div><div class="line"><a name="l05653"></a><span class="lineno"> 5653</span>&#160;    uint32_t GetAllocationsMoved()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_AllocationsMoved; }</div><div class="line"><a name="l05654"></a><span class="lineno"> 5654</span>&#160;</div><div class="line"><a name="l05655"></a><span class="lineno"> 5655</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="l05656"></a><span class="lineno"> 5656</span>&#160;</div><div class="line"><a name="l05657"></a><span class="lineno"> 5657</span>&#160;    VkResult Defragment(</div><div class="line"><a name="l05658"></a><span class="lineno"> 5658</span>&#160;        VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l05659"></a><span class="lineno"> 5659</span>&#160;        uint32_t maxAllocationsToMove);</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;</div><div class="line"><a name="l05662"></a><span class="lineno"> 5662</span>&#160;<span class="keyword">struct </span>VmaDefragmentationContext_T</div><div class="line"><a name="l05663"></a><span class="lineno"> 5663</span>&#160;{</div><div class="line"><a name="l05664"></a><span class="lineno"> 5664</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05665"></a><span class="lineno"> 5665</span>&#160;    VmaDefragmentationContext_T();</div><div class="line"><a name="l05666"></a><span class="lineno"> 5666</span>&#160;    ~VmaDefragmentationContext_T();</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;<span class="keyword">private</span>:</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="preprocessor">#if VMA_RECORDING_ENABLED</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="keyword">class </span>VmaRecorder</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;<span class="keyword">public</span>:</div><div class="line"><a name="l05676"></a><span class="lineno"> 5676</span>&#160;    VmaRecorder();</div><div class="line"><a name="l05677"></a><span class="lineno"> 5677</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex);</div><div class="line"><a name="l05678"></a><span class="lineno"> 5678</span>&#160;    <span class="keywordtype">void</span> WriteConfiguration(</div><div class="line"><a name="l05679"></a><span class="lineno"> 5679</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div><div class="line"><a name="l05680"></a><span class="lineno"> 5680</span>&#160;        <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div><div class="line"><a name="l05681"></a><span class="lineno"> 5681</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled);</div><div class="line"><a name="l05682"></a><span class="lineno"> 5682</span>&#160;    ~VmaRecorder();</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;    <span class="keywordtype">void</span> RecordCreateAllocator(uint32_t frameIndex);</div><div class="line"><a name="l05685"></a><span class="lineno"> 5685</span>&#160;    <span class="keywordtype">void</span> RecordDestroyAllocator(uint32_t frameIndex);</div><div class="line"><a name="l05686"></a><span class="lineno"> 5686</span>&#160;    <span class="keywordtype">void</span> RecordCreatePool(uint32_t frameIndex,</div><div class="line"><a name="l05687"></a><span class="lineno"> 5687</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="l05688"></a><span class="lineno"> 5688</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l05689"></a><span class="lineno"> 5689</span>&#160;    <span class="keywordtype">void</span> RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</div><div class="line"><a name="l05690"></a><span class="lineno"> 5690</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemory(uint32_t frameIndex,</div><div class="line"><a name="l05691"></a><span class="lineno"> 5691</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l05692"></a><span class="lineno"> 5692</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="l05693"></a><span class="lineno"> 5693</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05694"></a><span class="lineno"> 5694</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div><div class="line"><a name="l05695"></a><span class="lineno"> 5695</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l05696"></a><span class="lineno"> 5696</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l05697"></a><span class="lineno"> 5697</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l05698"></a><span class="lineno"> 5698</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="l05699"></a><span class="lineno"> 5699</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05700"></a><span class="lineno"> 5700</span>&#160;    <span class="keywordtype">void</span> RecordAllocateMemoryForImage(uint32_t frameIndex,</div><div class="line"><a name="l05701"></a><span class="lineno"> 5701</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l05702"></a><span class="lineno"> 5702</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l05703"></a><span class="lineno"> 5703</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l05704"></a><span class="lineno"> 5704</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="l05705"></a><span class="lineno"> 5705</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05706"></a><span class="lineno"> 5706</span>&#160;    <span class="keywordtype">void</span> RecordFreeMemory(uint32_t frameIndex,</div><div class="line"><a name="l05707"></a><span class="lineno"> 5707</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05708"></a><span class="lineno"> 5708</span>&#160;    <span class="keywordtype">void</span> RecordSetAllocationUserData(uint32_t frameIndex,</div><div class="line"><a name="l05709"></a><span class="lineno"> 5709</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l05710"></a><span class="lineno"> 5710</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l05711"></a><span class="lineno"> 5711</span>&#160;    <span class="keywordtype">void</span> RecordCreateLostAllocation(uint32_t frameIndex,</div><div class="line"><a name="l05712"></a><span class="lineno"> 5712</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05713"></a><span class="lineno"> 5713</span>&#160;    <span class="keywordtype">void</span> RecordMapMemory(uint32_t frameIndex,</div><div class="line"><a name="l05714"></a><span class="lineno"> 5714</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05715"></a><span class="lineno"> 5715</span>&#160;    <span class="keywordtype">void</span> RecordUnmapMemory(uint32_t frameIndex,</div><div class="line"><a name="l05716"></a><span class="lineno"> 5716</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05717"></a><span class="lineno"> 5717</span>&#160;    <span class="keywordtype">void</span> RecordFlushAllocation(uint32_t frameIndex,</div><div class="line"><a name="l05718"></a><span class="lineno"> 5718</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l05719"></a><span class="lineno"> 5719</span>&#160;    <span class="keywordtype">void</span> RecordInvalidateAllocation(uint32_t frameIndex,</div><div class="line"><a name="l05720"></a><span class="lineno"> 5720</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size);</div><div class="line"><a name="l05721"></a><span class="lineno"> 5721</span>&#160;    <span class="keywordtype">void</span> RecordCreateBuffer(uint32_t frameIndex,</div><div class="line"><a name="l05722"></a><span class="lineno"> 5722</span>&#160;        <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div><div class="line"><a name="l05723"></a><span class="lineno"> 5723</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l05724"></a><span class="lineno"> 5724</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05725"></a><span class="lineno"> 5725</span>&#160;    <span class="keywordtype">void</span> RecordCreateImage(uint32_t frameIndex,</div><div class="line"><a name="l05726"></a><span class="lineno"> 5726</span>&#160;        <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div><div class="line"><a name="l05727"></a><span class="lineno"> 5727</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l05728"></a><span class="lineno"> 5728</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05729"></a><span class="lineno"> 5729</span>&#160;    <span class="keywordtype">void</span> RecordDestroyBuffer(uint32_t frameIndex,</div><div class="line"><a name="l05730"></a><span class="lineno"> 5730</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05731"></a><span class="lineno"> 5731</span>&#160;    <span class="keywordtype">void</span> RecordDestroyImage(uint32_t frameIndex,</div><div class="line"><a name="l05732"></a><span class="lineno"> 5732</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05733"></a><span class="lineno"> 5733</span>&#160;    <span class="keywordtype">void</span> RecordTouchAllocation(uint32_t frameIndex,</div><div class="line"><a name="l05734"></a><span class="lineno"> 5734</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05735"></a><span class="lineno"> 5735</span>&#160;    <span class="keywordtype">void</span> RecordGetAllocationInfo(uint32_t frameIndex,</div><div class="line"><a name="l05736"></a><span class="lineno"> 5736</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation);</div><div class="line"><a name="l05737"></a><span class="lineno"> 5737</span>&#160;    <span class="keywordtype">void</span> RecordMakePoolAllocationsLost(uint32_t frameIndex,</div><div class="line"><a name="l05738"></a><span class="lineno"> 5738</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> pool);</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="keyword">private</span>:</div><div class="line"><a name="l05741"></a><span class="lineno"> 5741</span>&#160;    <span class="keyword">struct </span>CallParams</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;        uint32_t threadId;</div><div class="line"><a name="l05744"></a><span class="lineno"> 5744</span>&#160;        <span class="keywordtype">double</span> time;</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;</div><div class="line"><a name="l05747"></a><span class="lineno"> 5747</span>&#160;    <span class="keyword">class </span>UserDataString</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="keyword">public</span>:</div><div class="line"><a name="l05750"></a><span class="lineno"> 5750</span>&#160;        UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData);</div><div class="line"><a name="l05751"></a><span class="lineno"> 5751</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* GetString()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Str; }</div><div class="line"><a name="l05752"></a><span class="lineno"> 5752</span>&#160;</div><div class="line"><a name="l05753"></a><span class="lineno"> 5753</span>&#160;    <span class="keyword">private</span>:</div><div class="line"><a name="l05754"></a><span class="lineno"> 5754</span>&#160;        <span class="keywordtype">char</span> m_PtrStr[17];</div><div class="line"><a name="l05755"></a><span class="lineno"> 5755</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">char</span>* m_Str;</div><div class="line"><a name="l05756"></a><span class="lineno"> 5756</span>&#160;    };</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;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l05759"></a><span class="lineno"> 5759</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a> m_Flags;</div><div class="line"><a name="l05760"></a><span class="lineno"> 5760</span>&#160;    FILE* m_File;</div><div class="line"><a name="l05761"></a><span class="lineno"> 5761</span>&#160;    VMA_MUTEX m_FileMutex;</div><div class="line"><a name="l05762"></a><span class="lineno"> 5762</span>&#160;    int64_t m_Freq;</div><div class="line"><a name="l05763"></a><span class="lineno"> 5763</span>&#160;    int64_t m_StartCounter;</div><div class="line"><a name="l05764"></a><span class="lineno"> 5764</span>&#160;</div><div class="line"><a name="l05765"></a><span class="lineno"> 5765</span>&#160;    <span class="keywordtype">void</span> GetBasicParams(CallParams&amp; outParams);</div><div class="line"><a name="l05766"></a><span class="lineno"> 5766</span>&#160;    <span class="keywordtype">void</span> Flush();</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="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></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="comment">// Main allocator object.</span></div><div class="line"><a name="l05772"></a><span class="lineno"> 5772</span>&#160;<span class="keyword">struct </span>VmaAllocator_T</div><div class="line"><a name="l05773"></a><span class="lineno"> 5773</span>&#160;{</div><div class="line"><a name="l05774"></a><span class="lineno"> 5774</span>&#160;    VMA_CLASS_NO_COPY(VmaAllocator_T)</div><div class="line"><a name="l05775"></a><span class="lineno"> 5775</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l05776"></a><span class="lineno"> 5776</span>&#160;    <span class="keywordtype">bool</span> m_UseMutex;</div><div class="line"><a name="l05777"></a><span class="lineno"> 5777</span>&#160;    <span class="keywordtype">bool</span> m_UseKhrDedicatedAllocation;</div><div class="line"><a name="l05778"></a><span class="lineno"> 5778</span>&#160;    VkDevice m_hDevice;</div><div class="line"><a name="l05779"></a><span class="lineno"> 5779</span>&#160;    <span class="keywordtype">bool</span> m_AllocationCallbacksSpecified;</div><div class="line"><a name="l05780"></a><span class="lineno"> 5780</span>&#160;    VkAllocationCallbacks m_AllocationCallbacks;</div><div class="line"><a name="l05781"></a><span class="lineno"> 5781</span>&#160;    <a class="code" href="struct_vma_device_memory_callbacks.html">VmaDeviceMemoryCallbacks</a> m_DeviceMemoryCallbacks;</div><div class="line"><a name="l05782"></a><span class="lineno"> 5782</span>&#160;    </div><div class="line"><a name="l05783"></a><span class="lineno"> 5783</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="l05784"></a><span class="lineno"> 5784</span>&#160;    VkDeviceSize m_HeapSizeLimit[VK_MAX_MEMORY_HEAPS];</div><div class="line"><a name="l05785"></a><span class="lineno"> 5785</span>&#160;    VMA_MUTEX m_HeapSizeLimitMutex;</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;    VkPhysicalDeviceProperties m_PhysicalDeviceProperties;</div><div class="line"><a name="l05788"></a><span class="lineno"> 5788</span>&#160;    VkPhysicalDeviceMemoryProperties m_MemProps;</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;    <span class="comment">// Default pools.</span></div><div class="line"><a name="l05791"></a><span class="lineno"> 5791</span>&#160;    VmaBlockVector* m_pBlockVectors[VK_MAX_MEMORY_TYPES];</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;    <span class="comment">// Each vector is sorted by memory (handle value).</span></div><div class="line"><a name="l05794"></a><span class="lineno"> 5794</span>&#160;    <span class="keyword">typedef</span> VmaVector&lt; VmaAllocation, VmaStlAllocator&lt;VmaAllocation&gt; &gt; AllocationVectorType;</div><div class="line"><a name="l05795"></a><span class="lineno"> 5795</span>&#160;    AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l05796"></a><span class="lineno"> 5796</span>&#160;    VMA_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];</div><div class="line"><a name="l05797"></a><span class="lineno"> 5797</span>&#160;</div><div class="line"><a name="l05798"></a><span class="lineno"> 5798</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="l05799"></a><span class="lineno"> 5799</span>&#160;    VkResult Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo);</div><div class="line"><a name="l05800"></a><span class="lineno"> 5800</span>&#160;    ~VmaAllocator_T();</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="keyword">const</span> VkAllocationCallbacks* GetAllocationCallbacks()<span class="keyword"> const</span></div><div class="line"><a name="l05803"></a><span class="lineno"> 5803</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05804"></a><span class="lineno"> 5804</span>&#160;        <span class="keywordflow">return</span> m_AllocationCallbacksSpecified ? &amp;m_AllocationCallbacks : 0;</div><div class="line"><a name="l05805"></a><span class="lineno"> 5805</span>&#160;    }</div><div class="line"><a name="l05806"></a><span class="lineno"> 5806</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="l05807"></a><span class="lineno"> 5807</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05808"></a><span class="lineno"> 5808</span>&#160;        <span class="keywordflow">return</span> m_VulkanFunctions;</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;    VkDeviceSize GetBufferImageGranularity()<span class="keyword"> const</span></div><div class="line"><a name="l05812"></a><span class="lineno"> 5812</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05813"></a><span class="lineno"> 5813</span>&#160;        <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l05814"></a><span class="lineno"> 5814</span>&#160;            static_cast&lt;VkDeviceSize&gt;(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY),</div><div class="line"><a name="l05815"></a><span class="lineno"> 5815</span>&#160;            m_PhysicalDeviceProperties.limits.bufferImageGranularity);</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;</div><div class="line"><a name="l05818"></a><span class="lineno"> 5818</span>&#160;    uint32_t GetMemoryHeapCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryHeapCount; }</div><div class="line"><a name="l05819"></a><span class="lineno"> 5819</span>&#160;    uint32_t GetMemoryTypeCount()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_MemProps.memoryTypeCount; }</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;    uint32_t MemoryTypeIndexToHeapIndex(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l05822"></a><span class="lineno"> 5822</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05823"></a><span class="lineno"> 5823</span>&#160;        VMA_ASSERT(memTypeIndex &lt; m_MemProps.memoryTypeCount);</div><div class="line"><a name="l05824"></a><span class="lineno"> 5824</span>&#160;        <span class="keywordflow">return</span> m_MemProps.memoryTypes[memTypeIndex].heapIndex;</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;    <span class="comment">// True when specific memory type is HOST_VISIBLE but not HOST_COHERENT.</span></div><div class="line"><a name="l05827"></a><span class="lineno"> 5827</span>&#160;    <span class="keywordtype">bool</span> IsMemoryTypeNonCoherent(uint32_t memTypeIndex)<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;        <span class="keywordflow">return</span> (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) ==</div><div class="line"><a name="l05830"></a><span class="lineno"> 5830</span>&#160;            VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</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="comment">// Minimum alignment for all allocations in specific memory type.</span></div><div class="line"><a name="l05833"></a><span class="lineno"> 5833</span>&#160;    VkDeviceSize GetMemoryTypeMinAlignment(uint32_t memTypeIndex)<span class="keyword"> const</span></div><div class="line"><a name="l05834"></a><span class="lineno"> 5834</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05835"></a><span class="lineno"> 5835</span>&#160;        <span class="keywordflow">return</span> IsMemoryTypeNonCoherent(memTypeIndex) ?</div><div class="line"><a name="l05836"></a><span class="lineno"> 5836</span>&#160;            VMA_MAX((VkDeviceSize)VMA_DEBUG_ALIGNMENT, m_PhysicalDeviceProperties.limits.nonCoherentAtomSize) :</div><div class="line"><a name="l05837"></a><span class="lineno"> 5837</span>&#160;            (VkDeviceSize)VMA_DEBUG_ALIGNMENT;</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;</div><div class="line"><a name="l05840"></a><span class="lineno"> 5840</span>&#160;    <span class="keywordtype">bool</span> IsIntegratedGpu()<span class="keyword"> const</span></div><div class="line"><a name="l05841"></a><span class="lineno"> 5841</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l05842"></a><span class="lineno"> 5842</span>&#160;        <span class="keywordflow">return</span> m_PhysicalDeviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;</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;</div><div class="line"><a name="l05845"></a><span class="lineno"> 5845</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l05846"></a><span class="lineno"> 5846</span>&#160;    VmaRecorder* GetRecorder()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_pRecorder; }</div><div class="line"><a name="l05847"></a><span class="lineno"> 5847</span>&#160;<span class="preprocessor">#endif</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;    <span class="keywordtype">void</span> GetBufferMemoryRequirements(</div><div class="line"><a name="l05850"></a><span class="lineno"> 5850</span>&#160;        VkBuffer hBuffer,</div><div class="line"><a name="l05851"></a><span class="lineno"> 5851</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l05852"></a><span class="lineno"> 5852</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l05853"></a><span class="lineno"> 5853</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l05854"></a><span class="lineno"> 5854</span>&#160;    <span class="keywordtype">void</span> GetImageMemoryRequirements(</div><div class="line"><a name="l05855"></a><span class="lineno"> 5855</span>&#160;        VkImage hImage,</div><div class="line"><a name="l05856"></a><span class="lineno"> 5856</span>&#160;        VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l05857"></a><span class="lineno"> 5857</span>&#160;        <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l05858"></a><span class="lineno"> 5858</span>&#160;        <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation) <span class="keyword">const</span>;</div><div class="line"><a name="l05859"></a><span class="lineno"> 5859</span>&#160;</div><div class="line"><a name="l05860"></a><span class="lineno"> 5860</span>&#160;    <span class="comment">// Main allocation function.</span></div><div class="line"><a name="l05861"></a><span class="lineno"> 5861</span>&#160;    VkResult AllocateMemory(</div><div class="line"><a name="l05862"></a><span class="lineno"> 5862</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l05863"></a><span class="lineno"> 5863</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l05864"></a><span class="lineno"> 5864</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l05865"></a><span class="lineno"> 5865</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l05866"></a><span class="lineno"> 5866</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l05867"></a><span class="lineno"> 5867</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="l05868"></a><span class="lineno"> 5868</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05869"></a><span class="lineno"> 5869</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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;    <span class="comment">// Main deallocation function.</span></div><div class="line"><a name="l05872"></a><span class="lineno"> 5872</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="l05873"></a><span class="lineno"> 5873</span>&#160;</div><div class="line"><a name="l05874"></a><span class="lineno"> 5874</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="l05875"></a><span class="lineno"> 5875</span>&#160;</div><div class="line"><a name="l05876"></a><span class="lineno"> 5876</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l05877"></a><span class="lineno"> 5877</span>&#160;    <span class="keywordtype">void</span> PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json);</div><div class="line"><a name="l05878"></a><span class="lineno"> 5878</span>&#160;<span class="preprocessor">#endif</span></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;    VkResult DefragmentationBegin(</div><div class="line"><a name="l05881"></a><span class="lineno"> 5881</span>&#160;        <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div><div class="line"><a name="l05882"></a><span class="lineno"> 5882</span>&#160;        <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l05883"></a><span class="lineno"> 5883</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext);</div><div class="line"><a name="l05884"></a><span class="lineno"> 5884</span>&#160;    VkResult DefragmentationEnd(</div><div class="line"><a name="l05885"></a><span class="lineno"> 5885</span>&#160;        <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context);</div><div class="line"><a name="l05886"></a><span class="lineno"> 5886</span>&#160;</div><div class="line"><a name="l05887"></a><span class="lineno"> 5887</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="l05888"></a><span class="lineno"> 5888</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="l05889"></a><span class="lineno"> 5889</span>&#160;</div><div class="line"><a name="l05890"></a><span class="lineno"> 5890</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="l05891"></a><span class="lineno"> 5891</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="l05892"></a><span class="lineno"> 5892</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="l05893"></a><span class="lineno"> 5893</span>&#160;</div><div class="line"><a name="l05894"></a><span class="lineno"> 5894</span>&#160;    <span class="keywordtype">void</span> SetCurrentFrameIndex(uint32_t frameIndex);</div><div class="line"><a name="l05895"></a><span class="lineno"> 5895</span>&#160;    uint32_t GetCurrentFrameIndex()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_CurrentFrameIndex.load(); }</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="keywordtype">void</span> MakePoolAllocationsLost(</div><div class="line"><a name="l05898"></a><span class="lineno"> 5898</span>&#160;        <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l05899"></a><span class="lineno"> 5899</span>&#160;        <span class="keywordtype">size_t</span>* pLostAllocationCount);</div><div class="line"><a name="l05900"></a><span class="lineno"> 5900</span>&#160;    VkResult CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool);</div><div class="line"><a name="l05901"></a><span class="lineno"> 5901</span>&#160;    VkResult CheckCorruption(uint32_t memoryTypeBits);</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;    <span class="keywordtype">void</span> CreateLostAllocation(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</div><div class="line"><a name="l05904"></a><span class="lineno"> 5904</span>&#160;</div><div class="line"><a name="l05905"></a><span class="lineno"> 5905</span>&#160;    VkResult AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory);</div><div class="line"><a name="l05906"></a><span class="lineno"> 5906</span>&#160;    <span class="keywordtype">void</span> FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory);</div><div class="line"><a name="l05907"></a><span class="lineno"> 5907</span>&#160;</div><div class="line"><a name="l05908"></a><span class="lineno"> 5908</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="l05909"></a><span class="lineno"> 5909</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="l05910"></a><span class="lineno"> 5910</span>&#160;</div><div class="line"><a name="l05911"></a><span class="lineno"> 5911</span>&#160;    VkResult BindBufferMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkBuffer hBuffer);</div><div class="line"><a name="l05912"></a><span class="lineno"> 5912</span>&#160;    VkResult BindImageMemory(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, VkImage hImage);</div><div class="line"><a name="l05913"></a><span class="lineno"> 5913</span>&#160;</div><div class="line"><a name="l05914"></a><span class="lineno"> 5914</span>&#160;    <span class="keywordtype">void</span> FlushOrInvalidateAllocation(</div><div class="line"><a name="l05915"></a><span class="lineno"> 5915</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l05916"></a><span class="lineno"> 5916</span>&#160;        VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l05917"></a><span class="lineno"> 5917</span>&#160;        VMA_CACHE_OPERATION op);</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;    <span class="keywordtype">void</span> FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern);</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="keyword">private</span>:</div><div class="line"><a name="l05922"></a><span class="lineno"> 5922</span>&#160;    VkDeviceSize m_PreferredLargeHeapBlockSize;</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;    VkPhysicalDevice m_PhysicalDevice;</div><div class="line"><a name="l05925"></a><span class="lineno"> 5925</span>&#160;    VMA_ATOMIC_UINT32 m_CurrentFrameIndex;</div><div class="line"><a name="l05926"></a><span class="lineno"> 5926</span>&#160;    </div><div class="line"><a name="l05927"></a><span class="lineno"> 5927</span>&#160;    VMA_MUTEX m_PoolsMutex;</div><div class="line"><a name="l05928"></a><span class="lineno"> 5928</span>&#160;    <span class="comment">// Protected by m_PoolsMutex. Sorted by pointer value.</span></div><div class="line"><a name="l05929"></a><span class="lineno"> 5929</span>&#160;    VmaVector&lt;VmaPool, VmaStlAllocator&lt;VmaPool&gt; &gt; m_Pools;</div><div class="line"><a name="l05930"></a><span class="lineno"> 5930</span>&#160;    uint32_t m_NextPoolId;</div><div class="line"><a name="l05931"></a><span class="lineno"> 5931</span>&#160;</div><div class="line"><a name="l05932"></a><span class="lineno"> 5932</span>&#160;    <a class="code" href="struct_vma_vulkan_functions.html">VmaVulkanFunctions</a> m_VulkanFunctions;</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;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l05935"></a><span class="lineno"> 5935</span>&#160;    VmaRecorder* m_pRecorder;</div><div class="line"><a name="l05936"></a><span class="lineno"> 5936</span>&#160;<span class="preprocessor">#endif</span></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;    <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="l05939"></a><span class="lineno"> 5939</span>&#160;</div><div class="line"><a name="l05940"></a><span class="lineno"> 5940</span>&#160;    VkDeviceSize CalcPreferredBlockSize(uint32_t memTypeIndex);</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;    VkResult AllocateMemoryOfType(</div><div class="line"><a name="l05943"></a><span class="lineno"> 5943</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05944"></a><span class="lineno"> 5944</span>&#160;        VkDeviceSize alignment,</div><div class="line"><a name="l05945"></a><span class="lineno"> 5945</span>&#160;        <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l05946"></a><span class="lineno"> 5946</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l05947"></a><span class="lineno"> 5947</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l05948"></a><span class="lineno"> 5948</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="l05949"></a><span class="lineno"> 5949</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l05950"></a><span class="lineno"> 5950</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05951"></a><span class="lineno"> 5951</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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="comment">// Allocates and registers new VkDeviceMemory specifically for single allocation.</span></div><div class="line"><a name="l05954"></a><span class="lineno"> 5954</span>&#160;    VkResult AllocateDedicatedMemory(</div><div class="line"><a name="l05955"></a><span class="lineno"> 5955</span>&#160;        VkDeviceSize size,</div><div class="line"><a name="l05956"></a><span class="lineno"> 5956</span>&#160;        VmaSuballocationType suballocType,</div><div class="line"><a name="l05957"></a><span class="lineno"> 5957</span>&#160;        uint32_t memTypeIndex,</div><div class="line"><a name="l05958"></a><span class="lineno"> 5958</span>&#160;        <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l05959"></a><span class="lineno"> 5959</span>&#160;        <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l05960"></a><span class="lineno"> 5960</span>&#160;        <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l05961"></a><span class="lineno"> 5961</span>&#160;        VkBuffer dedicatedBuffer,</div><div class="line"><a name="l05962"></a><span class="lineno"> 5962</span>&#160;        VkImage dedicatedImage,</div><div class="line"><a name="l05963"></a><span class="lineno"> 5963</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation);</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="comment">// Tries to free pMemory as Dedicated Memory. Returns true if found and freed.</span></div><div class="line"><a name="l05966"></a><span class="lineno"> 5966</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="l05967"></a><span class="lineno"> 5967</span>&#160;};</div><div class="line"><a name="l05968"></a><span class="lineno"> 5968</span>&#160;</div><div class="line"><a name="l05970"></a><span class="lineno"> 5970</span>&#160;<span class="comment">// Memory allocation #2 after VmaAllocator_T definition</span></div><div class="line"><a name="l05971"></a><span class="lineno"> 5971</span>&#160;</div><div class="line"><a name="l05972"></a><span class="lineno"> 5972</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="l05973"></a><span class="lineno"> 5973</span>&#160;{</div><div class="line"><a name="l05974"></a><span class="lineno"> 5974</span>&#160;    <span class="keywordflow">return</span> VmaMalloc(&amp;hAllocator-&gt;m_AllocationCallbacks, size, alignment);</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;</div><div class="line"><a name="l05977"></a><span class="lineno"> 5977</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="l05978"></a><span class="lineno"> 5978</span>&#160;{</div><div class="line"><a name="l05979"></a><span class="lineno"> 5979</span>&#160;    VmaFree(&amp;hAllocator-&gt;m_AllocationCallbacks, ptr);</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;</div><div class="line"><a name="l05982"></a><span class="lineno"> 5982</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05983"></a><span class="lineno"> 5983</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="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">return</span> (T*)VmaMalloc(hAllocator, <span class="keyword">sizeof</span>(T), VMA_ALIGN_OF(T));</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;</div><div class="line"><a name="l05988"></a><span class="lineno"> 5988</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05989"></a><span class="lineno"> 5989</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="l05990"></a><span class="lineno"> 5990</span>&#160;{</div><div class="line"><a name="l05991"></a><span class="lineno"> 5991</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="l05992"></a><span class="lineno"> 5992</span>&#160;}</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l05995"></a><span class="lineno"> 5995</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="l05996"></a><span class="lineno"> 5996</span>&#160;{</div><div class="line"><a name="l05997"></a><span class="lineno"> 5997</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</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;        ptr-&gt;~T();</div><div class="line"><a name="l06000"></a><span class="lineno"> 6000</span>&#160;        VmaFree(hAllocator, ptr);</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="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div><div class="line"><a name="l06005"></a><span class="lineno"> 6005</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="l06006"></a><span class="lineno"> 6006</span>&#160;{</div><div class="line"><a name="l06007"></a><span class="lineno"> 6007</span>&#160;    <span class="keywordflow">if</span>(ptr != VMA_NULL)</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="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = count; i--; )</div><div class="line"><a name="l06010"></a><span class="lineno"> 6010</span>&#160;            ptr[i].~T();</div><div class="line"><a name="l06011"></a><span class="lineno"> 6011</span>&#160;        VmaFree(hAllocator, ptr);</div><div class="line"><a name="l06012"></a><span class="lineno"> 6012</span>&#160;    }</div><div class="line"><a name="l06013"></a><span class="lineno"> 6013</span>&#160;}</div><div class="line"><a name="l06014"></a><span class="lineno"> 6014</span>&#160;</div><div class="line"><a name="l06016"></a><span class="lineno"> 6016</span>&#160;<span class="comment">// VmaStringBuilder</span></div><div class="line"><a name="l06017"></a><span class="lineno"> 6017</span>&#160;</div><div class="line"><a name="l06018"></a><span class="lineno"> 6018</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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="keyword">class </span>VmaStringBuilder</div><div class="line"><a name="l06021"></a><span class="lineno"> 6021</span>&#160;{</div><div class="line"><a name="l06022"></a><span class="lineno"> 6022</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06023"></a><span class="lineno"> 6023</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="l06024"></a><span class="lineno"> 6024</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="l06025"></a><span class="lineno"> 6025</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="l06026"></a><span class="lineno"> 6026</span>&#160;</div><div class="line"><a name="l06027"></a><span class="lineno"> 6027</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="l06028"></a><span class="lineno"> 6028</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="l06029"></a><span class="lineno"> 6029</span>&#160;    <span class="keywordtype">void</span> AddNewLine() { Add(<span class="charliteral">&#39;\n&#39;</span>); }</div><div class="line"><a name="l06030"></a><span class="lineno"> 6030</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint32_t num);</div><div class="line"><a name="l06031"></a><span class="lineno"> 6031</span>&#160;    <span class="keywordtype">void</span> AddNumber(uint64_t num);</div><div class="line"><a name="l06032"></a><span class="lineno"> 6032</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="l06033"></a><span class="lineno"> 6033</span>&#160;</div><div class="line"><a name="l06034"></a><span class="lineno"> 6034</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l06035"></a><span class="lineno"> 6035</span>&#160;    VmaVector&lt; char, VmaStlAllocator&lt;char&gt; &gt; m_Data;</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="keywordtype">void</span> VmaStringBuilder::Add(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</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> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l06041"></a><span class="lineno"> 6041</span>&#160;    <span class="keywordflow">if</span>(strLen &gt; 0)</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;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldCount = m_Data.size();</div><div class="line"><a name="l06044"></a><span class="lineno"> 6044</span>&#160;        m_Data.resize(oldCount + strLen);</div><div class="line"><a name="l06045"></a><span class="lineno"> 6045</span>&#160;        memcpy(m_Data.data() + oldCount, pStr, strLen);</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;</div><div class="line"><a name="l06049"></a><span class="lineno"> 6049</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint32_t num)</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="keywordtype">char</span> buf[11];</div><div class="line"><a name="l06052"></a><span class="lineno"> 6052</span>&#160;    VmaUint32ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l06053"></a><span class="lineno"> 6053</span>&#160;    Add(buf);</div><div class="line"><a name="l06054"></a><span class="lineno"> 6054</span>&#160;}</div><div class="line"><a name="l06055"></a><span class="lineno"> 6055</span>&#160;</div><div class="line"><a name="l06056"></a><span class="lineno"> 6056</span>&#160;<span class="keywordtype">void</span> VmaStringBuilder::AddNumber(uint64_t num)</div><div class="line"><a name="l06057"></a><span class="lineno"> 6057</span>&#160;{</div><div class="line"><a name="l06058"></a><span class="lineno"> 6058</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l06059"></a><span class="lineno"> 6059</span>&#160;    VmaUint64ToStr(buf, <span class="keyword">sizeof</span>(buf), num);</div><div class="line"><a name="l06060"></a><span class="lineno"> 6060</span>&#160;    Add(buf);</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;</div><div class="line"><a name="l06063"></a><span class="lineno"> 6063</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="l06064"></a><span class="lineno"> 6064</span>&#160;{</div><div class="line"><a name="l06065"></a><span class="lineno"> 6065</span>&#160;    <span class="keywordtype">char</span> buf[21];</div><div class="line"><a name="l06066"></a><span class="lineno"> 6066</span>&#160;    VmaPtrToStr(buf, <span class="keyword">sizeof</span>(buf), ptr);</div><div class="line"><a name="l06067"></a><span class="lineno"> 6067</span>&#160;    Add(buf);</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;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06071"></a><span class="lineno"> 6071</span>&#160;</div><div class="line"><a name="l06073"></a><span class="lineno"> 6073</span>&#160;<span class="comment">// VmaJsonWriter</span></div><div class="line"><a name="l06074"></a><span class="lineno"> 6074</span>&#160;</div><div class="line"><a name="l06075"></a><span class="lineno"> 6075</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06076"></a><span class="lineno"> 6076</span>&#160;</div><div class="line"><a name="l06077"></a><span class="lineno"> 6077</span>&#160;<span class="keyword">class </span>VmaJsonWriter</div><div class="line"><a name="l06078"></a><span class="lineno"> 6078</span>&#160;{</div><div class="line"><a name="l06079"></a><span class="lineno"> 6079</span>&#160;    VMA_CLASS_NO_COPY(VmaJsonWriter)</div><div class="line"><a name="l06080"></a><span class="lineno"> 6080</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l06081"></a><span class="lineno"> 6081</span>&#160;    VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb);</div><div class="line"><a name="l06082"></a><span class="lineno"> 6082</span>&#160;    ~VmaJsonWriter();</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;    <span class="keywordtype">void</span> BeginObject(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l06085"></a><span class="lineno"> 6085</span>&#160;    <span class="keywordtype">void</span> EndObject();</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;    <span class="keywordtype">void</span> BeginArray(<span class="keywordtype">bool</span> singleLine = <span class="keyword">false</span>);</div><div class="line"><a name="l06088"></a><span class="lineno"> 6088</span>&#160;    <span class="keywordtype">void</span> EndArray();</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;    <span class="keywordtype">void</span> WriteString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr);</div><div class="line"><a name="l06091"></a><span class="lineno"> 6091</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="l06092"></a><span class="lineno"> 6092</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="l06093"></a><span class="lineno"> 6093</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint32_t n);</div><div class="line"><a name="l06094"></a><span class="lineno"> 6094</span>&#160;    <span class="keywordtype">void</span> ContinueString(uint64_t n);</div><div class="line"><a name="l06095"></a><span class="lineno"> 6095</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="l06096"></a><span class="lineno"> 6096</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="l06097"></a><span class="lineno"> 6097</span>&#160;    </div><div class="line"><a name="l06098"></a><span class="lineno"> 6098</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint32_t n);</div><div class="line"><a name="l06099"></a><span class="lineno"> 6099</span>&#160;    <span class="keywordtype">void</span> WriteNumber(uint64_t n);</div><div class="line"><a name="l06100"></a><span class="lineno"> 6100</span>&#160;    <span class="keywordtype">void</span> WriteBool(<span class="keywordtype">bool</span> b);</div><div class="line"><a name="l06101"></a><span class="lineno"> 6101</span>&#160;    <span class="keywordtype">void</span> WriteNull();</div><div class="line"><a name="l06102"></a><span class="lineno"> 6102</span>&#160;</div><div class="line"><a name="l06103"></a><span class="lineno"> 6103</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l06104"></a><span class="lineno"> 6104</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="l06105"></a><span class="lineno"> 6105</span>&#160;</div><div class="line"><a name="l06106"></a><span class="lineno"> 6106</span>&#160;    <span class="keyword">enum</span> COLLECTION_TYPE</div><div class="line"><a name="l06107"></a><span class="lineno"> 6107</span>&#160;    {</div><div class="line"><a name="l06108"></a><span class="lineno"> 6108</span>&#160;        COLLECTION_TYPE_OBJECT,</div><div class="line"><a name="l06109"></a><span class="lineno"> 6109</span>&#160;        COLLECTION_TYPE_ARRAY,</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;    <span class="keyword">struct </span>StackItem</div><div class="line"><a name="l06112"></a><span class="lineno"> 6112</span>&#160;    {</div><div class="line"><a name="l06113"></a><span class="lineno"> 6113</span>&#160;        COLLECTION_TYPE type;</div><div class="line"><a name="l06114"></a><span class="lineno"> 6114</span>&#160;        uint32_t valueCount;</div><div class="line"><a name="l06115"></a><span class="lineno"> 6115</span>&#160;        <span class="keywordtype">bool</span> singleLineMode;</div><div class="line"><a name="l06116"></a><span class="lineno"> 6116</span>&#160;    };</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;    VmaStringBuilder&amp; m_SB;</div><div class="line"><a name="l06119"></a><span class="lineno"> 6119</span>&#160;    VmaVector&lt; StackItem, VmaStlAllocator&lt;StackItem&gt; &gt; m_Stack;</div><div class="line"><a name="l06120"></a><span class="lineno"> 6120</span>&#160;    <span class="keywordtype">bool</span> m_InsideString;</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;    <span class="keywordtype">void</span> BeginValue(<span class="keywordtype">bool</span> isString);</div><div class="line"><a name="l06123"></a><span class="lineno"> 6123</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="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;<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="l06127"></a><span class="lineno"> 6127</span>&#160;</div><div class="line"><a name="l06128"></a><span class="lineno"> 6128</span>&#160;VmaJsonWriter::VmaJsonWriter(<span class="keyword">const</span> VkAllocationCallbacks* pAllocationCallbacks, VmaStringBuilder&amp; sb) :</div><div class="line"><a name="l06129"></a><span class="lineno"> 6129</span>&#160;    m_SB(sb),</div><div class="line"><a name="l06130"></a><span class="lineno"> 6130</span>&#160;    m_Stack(VmaStlAllocator&lt;StackItem&gt;(pAllocationCallbacks)),</div><div class="line"><a name="l06131"></a><span class="lineno"> 6131</span>&#160;    m_InsideString(false)</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;}</div><div class="line"><a name="l06134"></a><span class="lineno"> 6134</span>&#160;</div><div class="line"><a name="l06135"></a><span class="lineno"> 6135</span>&#160;VmaJsonWriter::~VmaJsonWriter()</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06138"></a><span class="lineno"> 6138</span>&#160;    VMA_ASSERT(m_Stack.empty());</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;</div><div class="line"><a name="l06141"></a><span class="lineno"> 6141</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginObject(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l06142"></a><span class="lineno"> 6142</span>&#160;{</div><div class="line"><a name="l06143"></a><span class="lineno"> 6143</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06144"></a><span class="lineno"> 6144</span>&#160;</div><div class="line"><a name="l06145"></a><span class="lineno"> 6145</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06146"></a><span class="lineno"> 6146</span>&#160;    m_SB.Add(<span class="charliteral">&#39;{&#39;</span>);</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;    StackItem item;</div><div class="line"><a name="l06149"></a><span class="lineno"> 6149</span>&#160;    item.type = COLLECTION_TYPE_OBJECT;</div><div class="line"><a name="l06150"></a><span class="lineno"> 6150</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l06151"></a><span class="lineno"> 6151</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l06152"></a><span class="lineno"> 6152</span>&#160;    m_Stack.push_back(item);</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;</div><div class="line"><a name="l06155"></a><span class="lineno"> 6155</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::EndObject()</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;    VMA_ASSERT(!m_InsideString);</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;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l06160"></a><span class="lineno"> 6160</span>&#160;    m_SB.Add(<span class="charliteral">&#39;}&#39;</span>);</div><div class="line"><a name="l06161"></a><span class="lineno"> 6161</span>&#160;</div><div class="line"><a name="l06162"></a><span class="lineno"> 6162</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_OBJECT);</div><div class="line"><a name="l06163"></a><span class="lineno"> 6163</span>&#160;    m_Stack.pop_back();</div><div class="line"><a name="l06164"></a><span class="lineno"> 6164</span>&#160;}</div><div class="line"><a name="l06165"></a><span class="lineno"> 6165</span>&#160;</div><div class="line"><a name="l06166"></a><span class="lineno"> 6166</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::BeginArray(<span class="keywordtype">bool</span> singleLine)</div><div class="line"><a name="l06167"></a><span class="lineno"> 6167</span>&#160;{</div><div class="line"><a name="l06168"></a><span class="lineno"> 6168</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06169"></a><span class="lineno"> 6169</span>&#160;</div><div class="line"><a name="l06170"></a><span class="lineno"> 6170</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06171"></a><span class="lineno"> 6171</span>&#160;    m_SB.Add(<span class="charliteral">&#39;[&#39;</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;    StackItem item;</div><div class="line"><a name="l06174"></a><span class="lineno"> 6174</span>&#160;    item.type = COLLECTION_TYPE_ARRAY;</div><div class="line"><a name="l06175"></a><span class="lineno"> 6175</span>&#160;    item.valueCount = 0;</div><div class="line"><a name="l06176"></a><span class="lineno"> 6176</span>&#160;    item.singleLineMode = singleLine;</div><div class="line"><a name="l06177"></a><span class="lineno"> 6177</span>&#160;    m_Stack.push_back(item);</div><div class="line"><a name="l06178"></a><span class="lineno"> 6178</span>&#160;}</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;<span class="keywordtype">void</span> VmaJsonWriter::EndArray()</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;    VMA_ASSERT(!m_InsideString);</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;    WriteIndent(<span class="keyword">true</span>);</div><div class="line"><a name="l06185"></a><span class="lineno"> 6185</span>&#160;    m_SB.Add(<span class="charliteral">&#39;]&#39;</span>);</div><div class="line"><a name="l06186"></a><span class="lineno"> 6186</span>&#160;</div><div class="line"><a name="l06187"></a><span class="lineno"> 6187</span>&#160;    VMA_ASSERT(!m_Stack.empty() &amp;&amp; m_Stack.back().type == COLLECTION_TYPE_ARRAY);</div><div class="line"><a name="l06188"></a><span class="lineno"> 6188</span>&#160;    m_Stack.pop_back();</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;</div><div class="line"><a name="l06191"></a><span class="lineno"> 6191</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="l06192"></a><span class="lineno"> 6192</span>&#160;{</div><div class="line"><a name="l06193"></a><span class="lineno"> 6193</span>&#160;    BeginString(pStr);</div><div class="line"><a name="l06194"></a><span class="lineno"> 6194</span>&#160;    EndString();</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;</div><div class="line"><a name="l06197"></a><span class="lineno"> 6197</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="l06198"></a><span class="lineno"> 6198</span>&#160;{</div><div class="line"><a name="l06199"></a><span class="lineno"> 6199</span>&#160;    VMA_ASSERT(!m_InsideString);</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;    BeginValue(<span class="keyword">true</span>);</div><div class="line"><a name="l06202"></a><span class="lineno"> 6202</span>&#160;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l06203"></a><span class="lineno"> 6203</span>&#160;    m_InsideString = <span class="keyword">true</span>;</div><div class="line"><a name="l06204"></a><span class="lineno"> 6204</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="l06205"></a><span class="lineno"> 6205</span>&#160;    {</div><div class="line"><a name="l06206"></a><span class="lineno"> 6206</span>&#160;        ContinueString(pStr);</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;</div><div class="line"><a name="l06210"></a><span class="lineno"> 6210</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="l06211"></a><span class="lineno"> 6211</span>&#160;{</div><div class="line"><a name="l06212"></a><span class="lineno"> 6212</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l06213"></a><span class="lineno"> 6213</span>&#160;</div><div class="line"><a name="l06214"></a><span class="lineno"> 6214</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> strLen = strlen(pStr);</div><div class="line"><a name="l06215"></a><span class="lineno"> 6215</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="l06216"></a><span class="lineno"> 6216</span>&#160;    {</div><div class="line"><a name="l06217"></a><span class="lineno"> 6217</span>&#160;        <span class="keywordtype">char</span> ch = pStr[i];</div><div class="line"><a name="l06218"></a><span class="lineno"> 6218</span>&#160;        <span class="keywordflow">if</span>(ch == <span class="charliteral">&#39;\\&#39;</span>)</div><div class="line"><a name="l06219"></a><span class="lineno"> 6219</span>&#160;        {</div><div class="line"><a name="l06220"></a><span class="lineno"> 6220</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\\&quot;</span>);</div><div class="line"><a name="l06221"></a><span class="lineno"> 6221</span>&#160;        }</div><div class="line"><a name="l06222"></a><span class="lineno"> 6222</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="l06223"></a><span class="lineno"> 6223</span>&#160;        {</div><div class="line"><a name="l06224"></a><span class="lineno"> 6224</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\\&quot;&quot;</span>);</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;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ch &gt;= 32)</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;            m_SB.Add(ch);</div><div class="line"><a name="l06229"></a><span class="lineno"> 6229</span>&#160;        }</div><div class="line"><a name="l06230"></a><span class="lineno"> 6230</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">switch</span>(ch)</div><div class="line"><a name="l06231"></a><span class="lineno"> 6231</span>&#160;        {</div><div class="line"><a name="l06232"></a><span class="lineno"> 6232</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\b&#39;</span>:</div><div class="line"><a name="l06233"></a><span class="lineno"> 6233</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\b&quot;</span>);</div><div class="line"><a name="l06234"></a><span class="lineno"> 6234</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06235"></a><span class="lineno"> 6235</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\f&#39;</span>:</div><div class="line"><a name="l06236"></a><span class="lineno"> 6236</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\f&quot;</span>);</div><div class="line"><a name="l06237"></a><span class="lineno"> 6237</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06238"></a><span class="lineno"> 6238</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\n&#39;</span>:</div><div class="line"><a name="l06239"></a><span class="lineno"> 6239</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\n&quot;</span>);</div><div class="line"><a name="l06240"></a><span class="lineno"> 6240</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06241"></a><span class="lineno"> 6241</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\r&#39;</span>:</div><div class="line"><a name="l06242"></a><span class="lineno"> 6242</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\r&quot;</span>);</div><div class="line"><a name="l06243"></a><span class="lineno"> 6243</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06244"></a><span class="lineno"> 6244</span>&#160;        <span class="keywordflow">case</span> <span class="charliteral">&#39;\t&#39;</span>:</div><div class="line"><a name="l06245"></a><span class="lineno"> 6245</span>&#160;            m_SB.Add(<span class="stringliteral">&quot;\\t&quot;</span>);</div><div class="line"><a name="l06246"></a><span class="lineno"> 6246</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l06247"></a><span class="lineno"> 6247</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l06248"></a><span class="lineno"> 6248</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Character not currently supported.&quot;</span>);</div><div class="line"><a name="l06249"></a><span class="lineno"> 6249</span>&#160;            <span class="keywordflow">break</span>;</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;    }</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;</div><div class="line"><a name="l06254"></a><span class="lineno"> 6254</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::ContinueString(uint32_t n)</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(m_InsideString);</div><div class="line"><a name="l06257"></a><span class="lineno"> 6257</span>&#160;    m_SB.AddNumber(n);</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">void</span> VmaJsonWriter::ContinueString(uint64_t n)</div><div class="line"><a name="l06261"></a><span class="lineno"> 6261</span>&#160;{</div><div class="line"><a name="l06262"></a><span class="lineno"> 6262</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l06263"></a><span class="lineno"> 6263</span>&#160;    m_SB.AddNumber(n);</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;</div><div class="line"><a name="l06266"></a><span class="lineno"> 6266</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="l06267"></a><span class="lineno"> 6267</span>&#160;{</div><div class="line"><a name="l06268"></a><span class="lineno"> 6268</span>&#160;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l06269"></a><span class="lineno"> 6269</span>&#160;    m_SB.AddPointer(ptr);</div><div class="line"><a name="l06270"></a><span class="lineno"> 6270</span>&#160;}</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;<span class="keywordtype">void</span> VmaJsonWriter::EndString(<span class="keyword">const</span> <span class="keywordtype">char</span>* pStr)</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;    VMA_ASSERT(m_InsideString);</div><div class="line"><a name="l06275"></a><span class="lineno"> 6275</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="l06276"></a><span class="lineno"> 6276</span>&#160;    {</div><div class="line"><a name="l06277"></a><span class="lineno"> 6277</span>&#160;        ContinueString(pStr);</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;    m_SB.Add(<span class="charliteral">&#39;&quot;&#39;</span>);</div><div class="line"><a name="l06280"></a><span class="lineno"> 6280</span>&#160;    m_InsideString = <span class="keyword">false</span>;</div><div class="line"><a name="l06281"></a><span class="lineno"> 6281</span>&#160;}</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;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint32_t n)</div><div class="line"><a name="l06284"></a><span class="lineno"> 6284</span>&#160;{</div><div class="line"><a name="l06285"></a><span class="lineno"> 6285</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06286"></a><span class="lineno"> 6286</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06287"></a><span class="lineno"> 6287</span>&#160;    m_SB.AddNumber(n);</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;</div><div class="line"><a name="l06290"></a><span class="lineno"> 6290</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNumber(uint64_t n)</div><div class="line"><a name="l06291"></a><span class="lineno"> 6291</span>&#160;{</div><div class="line"><a name="l06292"></a><span class="lineno"> 6292</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06293"></a><span class="lineno"> 6293</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06294"></a><span class="lineno"> 6294</span>&#160;    m_SB.AddNumber(n);</div><div class="line"><a name="l06295"></a><span class="lineno"> 6295</span>&#160;}</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;<span class="keywordtype">void</span> VmaJsonWriter::WriteBool(<span class="keywordtype">bool</span> b)</div><div class="line"><a name="l06298"></a><span class="lineno"> 6298</span>&#160;{</div><div class="line"><a name="l06299"></a><span class="lineno"> 6299</span>&#160;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06300"></a><span class="lineno"> 6300</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06301"></a><span class="lineno"> 6301</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="l06302"></a><span class="lineno"> 6302</span>&#160;}</div><div class="line"><a name="l06303"></a><span class="lineno"> 6303</span>&#160;</div><div class="line"><a name="l06304"></a><span class="lineno"> 6304</span>&#160;<span class="keywordtype">void</span> VmaJsonWriter::WriteNull()</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;    VMA_ASSERT(!m_InsideString);</div><div class="line"><a name="l06307"></a><span class="lineno"> 6307</span>&#160;    BeginValue(<span class="keyword">false</span>);</div><div class="line"><a name="l06308"></a><span class="lineno"> 6308</span>&#160;    m_SB.Add(<span class="stringliteral">&quot;null&quot;</span>);</div><div class="line"><a name="l06309"></a><span class="lineno"> 6309</span>&#160;}</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="keywordtype">void</span> VmaJsonWriter::BeginValue(<span class="keywordtype">bool</span> isString)</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">if</span>(!m_Stack.empty())</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;        StackItem&amp; currItem = m_Stack.back();</div><div class="line"><a name="l06316"></a><span class="lineno"> 6316</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l06317"></a><span class="lineno"> 6317</span>&#160;            currItem.valueCount % 2 == 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;            VMA_ASSERT(isString);</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;</div><div class="line"><a name="l06322"></a><span class="lineno"> 6322</span>&#160;        <span class="keywordflow">if</span>(currItem.type == COLLECTION_TYPE_OBJECT &amp;&amp;</div><div class="line"><a name="l06323"></a><span class="lineno"> 6323</span>&#160;            currItem.valueCount % 2 != 0)</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;            m_SB.Add(<span class="stringliteral">&quot;: &quot;</span>);</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> <span class="keywordflow">if</span>(currItem.valueCount &gt; 0)</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;            m_SB.Add(<span class="stringliteral">&quot;, &quot;</span>);</div><div class="line"><a name="l06330"></a><span class="lineno"> 6330</span>&#160;            WriteIndent();</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l06333"></a><span class="lineno"> 6333</span>&#160;        {</div><div class="line"><a name="l06334"></a><span class="lineno"> 6334</span>&#160;            WriteIndent();</div><div class="line"><a name="l06335"></a><span class="lineno"> 6335</span>&#160;        }</div><div class="line"><a name="l06336"></a><span class="lineno"> 6336</span>&#160;        ++currItem.valueCount;</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;}</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;<span class="keywordtype">void</span> VmaJsonWriter::WriteIndent(<span class="keywordtype">bool</span> oneLess)</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;    <span class="keywordflow">if</span>(!m_Stack.empty() &amp;&amp; !m_Stack.back().singleLineMode)</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;        m_SB.AddNewLine();</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;        <span class="keywordtype">size_t</span> count = m_Stack.size();</div><div class="line"><a name="l06347"></a><span class="lineno"> 6347</span>&#160;        <span class="keywordflow">if</span>(count &gt; 0 &amp;&amp; oneLess)</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;            --count;</div><div class="line"><a name="l06350"></a><span class="lineno"> 6350</span>&#160;        }</div><div class="line"><a name="l06351"></a><span class="lineno"> 6351</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="l06352"></a><span class="lineno"> 6352</span>&#160;        {</div><div class="line"><a name="l06353"></a><span class="lineno"> 6353</span>&#160;            m_SB.Add(INDENT);</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;    }</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;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06359"></a><span class="lineno"> 6359</span>&#160;</div><div class="line"><a name="l06361"></a><span class="lineno"> 6361</span>&#160;</div><div class="line"><a name="l06362"></a><span class="lineno"> 6362</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="l06363"></a><span class="lineno"> 6363</span>&#160;{</div><div class="line"><a name="l06364"></a><span class="lineno"> 6364</span>&#160;    <span class="keywordflow">if</span>(IsUserDataString())</div><div class="line"><a name="l06365"></a><span class="lineno"> 6365</span>&#160;    {</div><div class="line"><a name="l06366"></a><span class="lineno"> 6366</span>&#160;        VMA_ASSERT(pUserData == VMA_NULL || pUserData != m_pUserData);</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;        FreeUserDataString(hAllocator);</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;        <span class="keywordflow">if</span>(pUserData != VMA_NULL)</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="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="l06373"></a><span class="lineno"> 6373</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> newStrLen = strlen(newStrSrc);</div><div class="line"><a name="l06374"></a><span class="lineno"> 6374</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="l06375"></a><span class="lineno"> 6375</span>&#160;            memcpy(newStrDst, newStrSrc, newStrLen + 1);</div><div class="line"><a name="l06376"></a><span class="lineno"> 6376</span>&#160;            m_pUserData = newStrDst;</div><div class="line"><a name="l06377"></a><span class="lineno"> 6377</span>&#160;        }</div><div class="line"><a name="l06378"></a><span class="lineno"> 6378</span>&#160;    }</div><div class="line"><a name="l06379"></a><span class="lineno"> 6379</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l06380"></a><span class="lineno"> 6380</span>&#160;    {</div><div class="line"><a name="l06381"></a><span class="lineno"> 6381</span>&#160;        m_pUserData = pUserData;</div><div class="line"><a name="l06382"></a><span class="lineno"> 6382</span>&#160;    }</div><div class="line"><a name="l06383"></a><span class="lineno"> 6383</span>&#160;}</div><div class="line"><a name="l06384"></a><span class="lineno"> 6384</span>&#160;</div><div class="line"><a name="l06385"></a><span class="lineno"> 6385</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::ChangeBlockAllocation(</div><div class="line"><a name="l06386"></a><span class="lineno"> 6386</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l06387"></a><span class="lineno"> 6387</span>&#160;    VmaDeviceMemoryBlock* block,</div><div class="line"><a name="l06388"></a><span class="lineno"> 6388</span>&#160;    VkDeviceSize offset)</div><div class="line"><a name="l06389"></a><span class="lineno"> 6389</span>&#160;{</div><div class="line"><a name="l06390"></a><span class="lineno"> 6390</span>&#160;    VMA_ASSERT(block != VMA_NULL);</div><div class="line"><a name="l06391"></a><span class="lineno"> 6391</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l06392"></a><span class="lineno"> 6392</span>&#160;</div><div class="line"><a name="l06393"></a><span class="lineno"> 6393</span>&#160;    <span class="comment">// Move mapping reference counter from old block to new block.</span></div><div class="line"><a name="l06394"></a><span class="lineno"> 6394</span>&#160;    <span class="keywordflow">if</span>(block != m_BlockAllocation.m_Block)</div><div class="line"><a name="l06395"></a><span class="lineno"> 6395</span>&#160;    {</div><div class="line"><a name="l06396"></a><span class="lineno"> 6396</span>&#160;        uint32_t mapRefCount = m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP;</div><div class="line"><a name="l06397"></a><span class="lineno"> 6397</span>&#160;        <span class="keywordflow">if</span>(IsPersistentMap())</div><div class="line"><a name="l06398"></a><span class="lineno"> 6398</span>&#160;            ++mapRefCount;</div><div class="line"><a name="l06399"></a><span class="lineno"> 6399</span>&#160;        m_BlockAllocation.m_Block-&gt;Unmap(hAllocator, mapRefCount);</div><div class="line"><a name="l06400"></a><span class="lineno"> 6400</span>&#160;        block-&gt;Map(hAllocator, mapRefCount, VMA_NULL);</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;    m_BlockAllocation.m_Block = block;</div><div class="line"><a name="l06404"></a><span class="lineno"> 6404</span>&#160;    m_BlockAllocation.m_Offset = offset;</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;VkDeviceSize VmaAllocation_T::GetOffset()<span class="keyword"> const</span></div><div class="line"><a name="l06408"></a><span class="lineno"> 6408</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06409"></a><span class="lineno"> 6409</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l06410"></a><span class="lineno"> 6410</span>&#160;    {</div><div class="line"><a name="l06411"></a><span class="lineno"> 6411</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06412"></a><span class="lineno"> 6412</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Offset;</div><div class="line"><a name="l06413"></a><span class="lineno"> 6413</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06414"></a><span class="lineno"> 6414</span>&#160;        <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l06415"></a><span class="lineno"> 6415</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06416"></a><span class="lineno"> 6416</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06417"></a><span class="lineno"> 6417</span>&#160;        <span class="keywordflow">return</span> 0;</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;}</div><div class="line"><a name="l06420"></a><span class="lineno"> 6420</span>&#160;</div><div class="line"><a name="l06421"></a><span class="lineno"> 6421</span>&#160;VkDeviceMemory VmaAllocation_T::GetMemory()<span class="keyword"> const</span></div><div class="line"><a name="l06422"></a><span class="lineno"> 6422</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06423"></a><span class="lineno"> 6423</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l06424"></a><span class="lineno"> 6424</span>&#160;    {</div><div class="line"><a name="l06425"></a><span class="lineno"> 6425</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06426"></a><span class="lineno"> 6426</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetDeviceMemory();</div><div class="line"><a name="l06427"></a><span class="lineno"> 6427</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06428"></a><span class="lineno"> 6428</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_hMemory;</div><div class="line"><a name="l06429"></a><span class="lineno"> 6429</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06430"></a><span class="lineno"> 6430</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06431"></a><span class="lineno"> 6431</span>&#160;        <span class="keywordflow">return</span> VK_NULL_HANDLE;</div><div class="line"><a name="l06432"></a><span class="lineno"> 6432</span>&#160;    }</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;uint32_t VmaAllocation_T::GetMemoryTypeIndex()<span class="keyword"> const</span></div><div class="line"><a name="l06436"></a><span class="lineno"> 6436</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06437"></a><span class="lineno"> 6437</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</div><div class="line"><a name="l06438"></a><span class="lineno"> 6438</span>&#160;    {</div><div class="line"><a name="l06439"></a><span class="lineno"> 6439</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06440"></a><span class="lineno"> 6440</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_Block-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l06441"></a><span class="lineno"> 6441</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06442"></a><span class="lineno"> 6442</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_MemoryTypeIndex;</div><div class="line"><a name="l06443"></a><span class="lineno"> 6443</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06444"></a><span class="lineno"> 6444</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06445"></a><span class="lineno"> 6445</span>&#160;        <span class="keywordflow">return</span> UINT32_MAX;</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;}</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="keywordtype">void</span>* VmaAllocation_T::GetMappedData()<span class="keyword"> const</span></div><div class="line"><a name="l06450"></a><span class="lineno"> 6450</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06451"></a><span class="lineno"> 6451</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06454"></a><span class="lineno"> 6454</span>&#160;        <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l06455"></a><span class="lineno"> 6455</span>&#160;        {</div><div class="line"><a name="l06456"></a><span class="lineno"> 6456</span>&#160;            <span class="keywordtype">void</span>* pBlockData = m_BlockAllocation.m_Block-&gt;GetMappedData();</div><div class="line"><a name="l06457"></a><span class="lineno"> 6457</span>&#160;            VMA_ASSERT(pBlockData != VMA_NULL);</div><div class="line"><a name="l06458"></a><span class="lineno"> 6458</span>&#160;            <span class="keywordflow">return</span> (<span class="keywordtype">char</span>*)pBlockData + m_BlockAllocation.m_Offset;</div><div class="line"><a name="l06459"></a><span class="lineno"> 6459</span>&#160;        }</div><div class="line"><a name="l06460"></a><span class="lineno"> 6460</span>&#160;        <span class="keywordflow">else</span></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;            <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l06463"></a><span class="lineno"> 6463</span>&#160;        }</div><div class="line"><a name="l06464"></a><span class="lineno"> 6464</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l06465"></a><span class="lineno"> 6465</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06466"></a><span class="lineno"> 6466</span>&#160;        VMA_ASSERT((m_DedicatedAllocation.m_pMappedData != VMA_NULL) == (m_MapCount != 0));</div><div class="line"><a name="l06467"></a><span class="lineno"> 6467</span>&#160;        <span class="keywordflow">return</span> m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l06468"></a><span class="lineno"> 6468</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06469"></a><span class="lineno"> 6469</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06470"></a><span class="lineno"> 6470</span>&#160;        <span class="keywordflow">return</span> VMA_NULL;</div><div class="line"><a name="l06471"></a><span class="lineno"> 6471</span>&#160;    }</div><div class="line"><a name="l06472"></a><span class="lineno"> 6472</span>&#160;}</div><div class="line"><a name="l06473"></a><span class="lineno"> 6473</span>&#160;</div><div class="line"><a name="l06474"></a><span class="lineno"> 6474</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::CanBecomeLost()<span class="keyword"> const</span></div><div class="line"><a name="l06475"></a><span class="lineno"> 6475</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06476"></a><span class="lineno"> 6476</span>&#160;    <span class="keywordflow">switch</span>(m_Type)</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;    <span class="keywordflow">case</span> ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l06479"></a><span class="lineno"> 6479</span>&#160;        <span class="keywordflow">return</span> m_BlockAllocation.m_CanBecomeLost;</div><div class="line"><a name="l06480"></a><span class="lineno"> 6480</span>&#160;    <span class="keywordflow">case</span> ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l06481"></a><span class="lineno"> 6481</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l06482"></a><span class="lineno"> 6482</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l06483"></a><span class="lineno"> 6483</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l06484"></a><span class="lineno"> 6484</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;}</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;<a class="code" href="struct_vma_pool.html">VmaPool</a> VmaAllocation_T::GetPool()<span class="keyword"> const</span></div><div class="line"><a name="l06489"></a><span class="lineno"> 6489</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06490"></a><span class="lineno"> 6490</span>&#160;    VMA_ASSERT(m_Type == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l06491"></a><span class="lineno"> 6491</span>&#160;    <span class="keywordflow">return</span> m_BlockAllocation.m_hPool;</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;</div><div class="line"><a name="l06494"></a><span class="lineno"> 6494</span>&#160;<span class="keywordtype">bool</span> VmaAllocation_T::MakeLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</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;    VMA_ASSERT(CanBecomeLost());</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;    <span class="comment">/*</span></div><div class="line"><a name="l06499"></a><span class="lineno"> 6499</span>&#160;<span class="comment">    Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l06500"></a><span class="lineno"> 6500</span>&#160;<span class="comment">    Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l06501"></a><span class="lineno"> 6501</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l06502"></a><span class="lineno"> 6502</span>&#160;    uint32_t localLastUseFrameIndex = GetLastUseFrameIndex();</div><div class="line"><a name="l06503"></a><span class="lineno"> 6503</span>&#160;    <span class="keywordflow">for</span>(;;)</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;        <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</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;            VMA_ASSERT(0);</div><div class="line"><a name="l06508"></a><span class="lineno"> 6508</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex + frameInUseCount &gt;= currentFrameIndex)</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">return</span> <span class="keyword">false</span>;</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="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l06515"></a><span class="lineno"> 6515</span>&#160;        {</div><div class="line"><a name="l06516"></a><span class="lineno"> 6516</span>&#160;            <span class="keywordflow">if</span>(CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, VMA_FRAME_INDEX_LOST))</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;                <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="l06519"></a><span class="lineno"> 6519</span>&#160;                <span class="comment">// Calling code just needs to unregister this allocation in owning VmaDeviceMemoryBlock.</span></div><div class="line"><a name="l06520"></a><span class="lineno"> 6520</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l06521"></a><span class="lineno"> 6521</span>&#160;            }</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;    }</div><div class="line"><a name="l06524"></a><span class="lineno"> 6524</span>&#160;}</div><div class="line"><a name="l06525"></a><span class="lineno"> 6525</span>&#160;</div><div class="line"><a name="l06526"></a><span class="lineno"> 6526</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06527"></a><span class="lineno"> 6527</span>&#160;</div><div class="line"><a name="l06528"></a><span class="lineno"> 6528</span>&#160;<span class="comment">// Correspond to values of enum VmaSuballocationType.</span></div><div class="line"><a name="l06529"></a><span class="lineno"> 6529</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="l06530"></a><span class="lineno"> 6530</span>&#160;    <span class="stringliteral">&quot;FREE&quot;</span>,</div><div class="line"><a name="l06531"></a><span class="lineno"> 6531</span>&#160;    <span class="stringliteral">&quot;UNKNOWN&quot;</span>,</div><div class="line"><a name="l06532"></a><span class="lineno"> 6532</span>&#160;    <span class="stringliteral">&quot;BUFFER&quot;</span>,</div><div class="line"><a name="l06533"></a><span class="lineno"> 6533</span>&#160;    <span class="stringliteral">&quot;IMAGE_UNKNOWN&quot;</span>,</div><div class="line"><a name="l06534"></a><span class="lineno"> 6534</span>&#160;    <span class="stringliteral">&quot;IMAGE_LINEAR&quot;</span>,</div><div class="line"><a name="l06535"></a><span class="lineno"> 6535</span>&#160;    <span class="stringliteral">&quot;IMAGE_OPTIMAL&quot;</span>,</div><div class="line"><a name="l06536"></a><span class="lineno"> 6536</span>&#160;};</div><div class="line"><a name="l06537"></a><span class="lineno"> 6537</span>&#160;</div><div class="line"><a name="l06538"></a><span class="lineno"> 6538</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::PrintParameters(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l06539"></a><span class="lineno"> 6539</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06540"></a><span class="lineno"> 6540</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l06541"></a><span class="lineno"> 6541</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[m_SuballocationType]);</div><div class="line"><a name="l06542"></a><span class="lineno"> 6542</span>&#160;</div><div class="line"><a name="l06543"></a><span class="lineno"> 6543</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l06544"></a><span class="lineno"> 6544</span>&#160;    json.WriteNumber(m_Size);</div><div class="line"><a name="l06545"></a><span class="lineno"> 6545</span>&#160;</div><div class="line"><a name="l06546"></a><span class="lineno"> 6546</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</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;        json.WriteString(<span class="stringliteral">&quot;UserData&quot;</span>);</div><div class="line"><a name="l06549"></a><span class="lineno"> 6549</span>&#160;        <span class="keywordflow">if</span>(IsUserDataString())</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;            json.WriteString((<span class="keyword">const</span> <span class="keywordtype">char</span>*)m_pUserData);</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="keywordflow">else</span></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;            json.BeginString();</div><div class="line"><a name="l06556"></a><span class="lineno"> 6556</span>&#160;            json.ContinueString_Pointer(m_pUserData);</div><div class="line"><a name="l06557"></a><span class="lineno"> 6557</span>&#160;            json.EndString();</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;    }</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;CreationFrameIndex&quot;</span>);</div><div class="line"><a name="l06562"></a><span class="lineno"> 6562</span>&#160;    json.WriteNumber(m_CreationFrameIndex);</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;LastUseFrameIndex&quot;</span>);</div><div class="line"><a name="l06565"></a><span class="lineno"> 6565</span>&#160;    json.WriteNumber(GetLastUseFrameIndex());</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;    <span class="keywordflow">if</span>(m_BufferImageUsage != 0)</div><div class="line"><a name="l06568"></a><span class="lineno"> 6568</span>&#160;    {</div><div class="line"><a name="l06569"></a><span class="lineno"> 6569</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Usage&quot;</span>);</div><div class="line"><a name="l06570"></a><span class="lineno"> 6570</span>&#160;        json.WriteNumber(m_BufferImageUsage);</div><div class="line"><a name="l06571"></a><span class="lineno"> 6571</span>&#160;    }</div><div class="line"><a name="l06572"></a><span class="lineno"> 6572</span>&#160;}</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="preprocessor">#endif</span></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;<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="l06577"></a><span class="lineno"> 6577</span>&#160;{</div><div class="line"><a name="l06578"></a><span class="lineno"> 6578</span>&#160;    VMA_ASSERT(IsUserDataString());</div><div class="line"><a name="l06579"></a><span class="lineno"> 6579</span>&#160;    <span class="keywordflow">if</span>(m_pUserData != VMA_NULL)</div><div class="line"><a name="l06580"></a><span class="lineno"> 6580</span>&#160;    {</div><div class="line"><a name="l06581"></a><span class="lineno"> 6581</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="l06582"></a><span class="lineno"> 6582</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> oldStrLen = strlen(oldStr);</div><div class="line"><a name="l06583"></a><span class="lineno"> 6583</span>&#160;        vma_delete_array(hAllocator, oldStr, oldStrLen + 1);</div><div class="line"><a name="l06584"></a><span class="lineno"> 6584</span>&#160;        m_pUserData = VMA_NULL;</div><div class="line"><a name="l06585"></a><span class="lineno"> 6585</span>&#160;    }</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;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocMap()</div><div class="line"><a name="l06589"></a><span class="lineno"> 6589</span>&#160;{</div><div class="line"><a name="l06590"></a><span class="lineno"> 6590</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</div><div class="line"><a name="l06591"></a><span class="lineno"> 6591</span>&#160;</div><div class="line"><a name="l06592"></a><span class="lineno"> 6592</span>&#160;    <span class="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</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;        ++m_MapCount;</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="keywordflow">else</span></div><div class="line"><a name="l06597"></a><span class="lineno"> 6597</span>&#160;    {</div><div class="line"><a name="l06598"></a><span class="lineno"> 6598</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="l06599"></a><span class="lineno"> 6599</span>&#160;    }</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;</div><div class="line"><a name="l06602"></a><span class="lineno"> 6602</span>&#160;<span class="keywordtype">void</span> VmaAllocation_T::BlockAllocUnmap()</div><div class="line"><a name="l06603"></a><span class="lineno"> 6603</span>&#160;{</div><div class="line"><a name="l06604"></a><span class="lineno"> 6604</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_BLOCK);</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</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;        --m_MapCount;</div><div class="line"><a name="l06609"></a><span class="lineno"> 6609</span>&#160;    }</div><div class="line"><a name="l06610"></a><span class="lineno"> 6610</span>&#160;    <span class="keywordflow">else</span></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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping allocation not previously mapped.&quot;</span>);</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;}</div><div class="line"><a name="l06615"></a><span class="lineno"> 6615</span>&#160;</div><div class="line"><a name="l06616"></a><span class="lineno"> 6616</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="l06617"></a><span class="lineno"> 6617</span>&#160;{</div><div class="line"><a name="l06618"></a><span class="lineno"> 6618</span>&#160;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</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">if</span>(m_MapCount != 0)</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) &lt; 0x7F)</div><div class="line"><a name="l06623"></a><span class="lineno"> 6623</span>&#160;        {</div><div class="line"><a name="l06624"></a><span class="lineno"> 6624</span>&#160;            VMA_ASSERT(m_DedicatedAllocation.m_pMappedData != VMA_NULL);</div><div class="line"><a name="l06625"></a><span class="lineno"> 6625</span>&#160;            *ppData = m_DedicatedAllocation.m_pMappedData;</div><div class="line"><a name="l06626"></a><span class="lineno"> 6626</span>&#160;            ++m_MapCount;</div><div class="line"><a name="l06627"></a><span class="lineno"> 6627</span>&#160;            <span class="keywordflow">return</span> VK_SUCCESS;</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="keywordflow">else</span></div><div class="line"><a name="l06630"></a><span class="lineno"> 6630</span>&#160;        {</div><div class="line"><a name="l06631"></a><span class="lineno"> 6631</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="l06632"></a><span class="lineno"> 6632</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l06633"></a><span class="lineno"> 6633</span>&#160;        }</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="keywordflow">else</span></div><div class="line"><a name="l06636"></a><span class="lineno"> 6636</span>&#160;    {</div><div class="line"><a name="l06637"></a><span class="lineno"> 6637</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l06638"></a><span class="lineno"> 6638</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06639"></a><span class="lineno"> 6639</span>&#160;            m_DedicatedAllocation.m_hMemory,</div><div class="line"><a name="l06640"></a><span class="lineno"> 6640</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l06641"></a><span class="lineno"> 6641</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l06642"></a><span class="lineno"> 6642</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l06643"></a><span class="lineno"> 6643</span>&#160;            ppData);</div><div class="line"><a name="l06644"></a><span class="lineno"> 6644</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l06645"></a><span class="lineno"> 6645</span>&#160;        {</div><div class="line"><a name="l06646"></a><span class="lineno"> 6646</span>&#160;            m_DedicatedAllocation.m_pMappedData = *ppData;</div><div class="line"><a name="l06647"></a><span class="lineno"> 6647</span>&#160;            m_MapCount = 1;</div><div class="line"><a name="l06648"></a><span class="lineno"> 6648</span>&#160;        }</div><div class="line"><a name="l06649"></a><span class="lineno"> 6649</span>&#160;        <span class="keywordflow">return</span> result;</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;}</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="keywordtype">void</span> VmaAllocation_T::DedicatedAllocUnmap(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</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;    VMA_ASSERT(GetType() == ALLOCATION_TYPE_DEDICATED);</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="keywordflow">if</span>((m_MapCount &amp; ~MAP_COUNT_FLAG_PERSISTENT_MAP) != 0)</div><div class="line"><a name="l06658"></a><span class="lineno"> 6658</span>&#160;    {</div><div class="line"><a name="l06659"></a><span class="lineno"> 6659</span>&#160;        --m_MapCount;</div><div class="line"><a name="l06660"></a><span class="lineno"> 6660</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</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;            m_DedicatedAllocation.m_pMappedData = VMA_NULL;</div><div class="line"><a name="l06663"></a><span class="lineno"> 6663</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(</div><div class="line"><a name="l06664"></a><span class="lineno"> 6664</span>&#160;                hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l06665"></a><span class="lineno"> 6665</span>&#160;                m_DedicatedAllocation.m_hMemory);</div><div class="line"><a name="l06666"></a><span class="lineno"> 6666</span>&#160;        }</div><div class="line"><a name="l06667"></a><span class="lineno"> 6667</span>&#160;    }</div><div class="line"><a name="l06668"></a><span class="lineno"> 6668</span>&#160;    <span class="keywordflow">else</span></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;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Unmapping dedicated allocation not previously mapped.&quot;</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;}</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;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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;<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="l06677"></a><span class="lineno"> 6677</span>&#160;{</div><div class="line"><a name="l06678"></a><span class="lineno"> 6678</span>&#160;    json.BeginObject();</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;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l06681"></a><span class="lineno"> 6681</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l06684"></a><span class="lineno"> 6684</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l06687"></a><span class="lineno"> 6687</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</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;    json.WriteString(<span class="stringliteral">&quot;UsedBytes&quot;</span>);</div><div class="line"><a name="l06690"></a><span class="lineno"> 6690</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>);</div><div class="line"><a name="l06691"></a><span class="lineno"> 6691</span>&#160;</div><div class="line"><a name="l06692"></a><span class="lineno"> 6692</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l06693"></a><span class="lineno"> 6693</span>&#160;    json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>);</div><div class="line"><a name="l06694"></a><span class="lineno"> 6694</span>&#160;</div><div class="line"><a name="l06695"></a><span class="lineno"> 6695</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="l06696"></a><span class="lineno"> 6696</span>&#160;    {</div><div class="line"><a name="l06697"></a><span class="lineno"> 6697</span>&#160;        json.WriteString(<span class="stringliteral">&quot;AllocationSize&quot;</span>);</div><div class="line"><a name="l06698"></a><span class="lineno"> 6698</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06699"></a><span class="lineno"> 6699</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l06700"></a><span class="lineno"> 6700</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>);</div><div class="line"><a name="l06701"></a><span class="lineno"> 6701</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l06702"></a><span class="lineno"> 6702</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a>);</div><div class="line"><a name="l06703"></a><span class="lineno"> 6703</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l06704"></a><span class="lineno"> 6704</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>);</div><div class="line"><a name="l06705"></a><span class="lineno"> 6705</span>&#160;        json.EndObject();</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;</div><div class="line"><a name="l06708"></a><span class="lineno"> 6708</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="l06709"></a><span class="lineno"> 6709</span>&#160;    {</div><div class="line"><a name="l06710"></a><span class="lineno"> 6710</span>&#160;        json.WriteString(<span class="stringliteral">&quot;UnusedRangeSize&quot;</span>);</div><div class="line"><a name="l06711"></a><span class="lineno"> 6711</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06712"></a><span class="lineno"> 6712</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l06713"></a><span class="lineno"> 6713</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>);</div><div class="line"><a name="l06714"></a><span class="lineno"> 6714</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Avg&quot;</span>);</div><div class="line"><a name="l06715"></a><span class="lineno"> 6715</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a>);</div><div class="line"><a name="l06716"></a><span class="lineno"> 6716</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l06717"></a><span class="lineno"> 6717</span>&#160;        json.WriteNumber(stat.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>);</div><div class="line"><a name="l06718"></a><span class="lineno"> 6718</span>&#160;        json.EndObject();</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;    json.EndObject();</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;</div><div class="line"><a name="l06724"></a><span class="lineno"> 6724</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></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;<span class="keyword">struct </span>VmaSuballocationItemSizeLess</div><div class="line"><a name="l06727"></a><span class="lineno"> 6727</span>&#160;{</div><div class="line"><a name="l06728"></a><span class="lineno"> 6728</span>&#160;    <span class="keywordtype">bool</span> operator()(</div><div class="line"><a name="l06729"></a><span class="lineno"> 6729</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l06730"></a><span class="lineno"> 6730</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator rhs)<span class="keyword"> const</span></div><div class="line"><a name="l06731"></a><span class="lineno"> 6731</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06732"></a><span class="lineno"> 6732</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhs-&gt;size;</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="keywordtype">bool</span> operator()(</div><div class="line"><a name="l06735"></a><span class="lineno"> 6735</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator lhs,</div><div class="line"><a name="l06736"></a><span class="lineno"> 6736</span>&#160;        VkDeviceSize rhsSize)<span class="keyword"> const</span></div><div class="line"><a name="l06737"></a><span class="lineno"> 6737</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l06738"></a><span class="lineno"> 6738</span>&#160;        <span class="keywordflow">return</span> lhs-&gt;size &lt; rhsSize;</div><div class="line"><a name="l06739"></a><span class="lineno"> 6739</span>&#160;    }</div><div class="line"><a name="l06740"></a><span class="lineno"> 6740</span>&#160;};</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="l06744"></a><span class="lineno"> 6744</span>&#160;<span class="comment">// class VmaBlockMetadata</span></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;VmaBlockMetadata::VmaBlockMetadata(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l06747"></a><span class="lineno"> 6747</span>&#160;    m_Size(0),</div><div class="line"><a name="l06748"></a><span class="lineno"> 6748</span>&#160;    m_pAllocationCallbacks(hAllocator-&gt;GetAllocationCallbacks())</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Begin(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l06755"></a><span class="lineno"> 6755</span>&#160;    VkDeviceSize unusedBytes,</div><div class="line"><a name="l06756"></a><span class="lineno"> 6756</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l06757"></a><span class="lineno"> 6757</span>&#160;    <span class="keywordtype">size_t</span> unusedRangeCount)<span class="keyword"> const</span></div><div class="line"><a name="l06758"></a><span class="lineno"> 6758</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06759"></a><span class="lineno"> 6759</span>&#160;    json.BeginObject();</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;    json.WriteString(<span class="stringliteral">&quot;TotalBytes&quot;</span>);</div><div class="line"><a name="l06762"></a><span class="lineno"> 6762</span>&#160;    json.WriteNumber(GetSize());</div><div class="line"><a name="l06763"></a><span class="lineno"> 6763</span>&#160;</div><div class="line"><a name="l06764"></a><span class="lineno"> 6764</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedBytes&quot;</span>);</div><div class="line"><a name="l06765"></a><span class="lineno"> 6765</span>&#160;    json.WriteNumber(unusedBytes);</div><div class="line"><a name="l06766"></a><span class="lineno"> 6766</span>&#160;</div><div class="line"><a name="l06767"></a><span class="lineno"> 6767</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Allocations&quot;</span>);</div><div class="line"><a name="l06768"></a><span class="lineno"> 6768</span>&#160;    json.WriteNumber((uint64_t)allocationCount);</div><div class="line"><a name="l06769"></a><span class="lineno"> 6769</span>&#160;</div><div class="line"><a name="l06770"></a><span class="lineno"> 6770</span>&#160;    json.WriteString(<span class="stringliteral">&quot;UnusedRanges&quot;</span>);</div><div class="line"><a name="l06771"></a><span class="lineno"> 6771</span>&#160;    json.WriteNumber((uint64_t)unusedRangeCount);</div><div class="line"><a name="l06772"></a><span class="lineno"> 6772</span>&#160;</div><div class="line"><a name="l06773"></a><span class="lineno"> 6773</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Suballocations&quot;</span>);</div><div class="line"><a name="l06774"></a><span class="lineno"> 6774</span>&#160;    json.BeginArray();</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;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_Allocation(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l06778"></a><span class="lineno"> 6778</span>&#160;    VkDeviceSize offset,</div><div class="line"><a name="l06779"></a><span class="lineno"> 6779</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l06780"></a><span class="lineno"> 6780</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06781"></a><span class="lineno"> 6781</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l06782"></a><span class="lineno"> 6782</span>&#160;        </div><div class="line"><a name="l06783"></a><span class="lineno"> 6783</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l06784"></a><span class="lineno"> 6784</span>&#160;    json.WriteNumber(offset);</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;    hAllocation-&gt;PrintParameters(json);</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;    json.EndObject();</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;</div><div class="line"><a name="l06791"></a><span class="lineno"> 6791</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_UnusedRange(<span class="keyword">class</span> VmaJsonWriter&amp; json,</div><div class="line"><a name="l06792"></a><span class="lineno"> 6792</span>&#160;    VkDeviceSize offset,</div><div class="line"><a name="l06793"></a><span class="lineno"> 6793</span>&#160;    VkDeviceSize size)<span class="keyword"> const</span></div><div class="line"><a name="l06794"></a><span class="lineno"> 6794</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06795"></a><span class="lineno"> 6795</span>&#160;    json.BeginObject(<span class="keyword">true</span>);</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;    json.WriteString(<span class="stringliteral">&quot;Offset&quot;</span>);</div><div class="line"><a name="l06798"></a><span class="lineno"> 6798</span>&#160;    json.WriteNumber(offset);</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;    json.WriteString(<span class="stringliteral">&quot;Type&quot;</span>);</div><div class="line"><a name="l06801"></a><span class="lineno"> 6801</span>&#160;    json.WriteString(VMA_SUBALLOCATION_TYPE_NAMES[VMA_SUBALLOCATION_TYPE_FREE]);</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;    json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l06804"></a><span class="lineno"> 6804</span>&#160;    json.WriteNumber(size);</div><div class="line"><a name="l06805"></a><span class="lineno"> 6805</span>&#160;</div><div class="line"><a name="l06806"></a><span class="lineno"> 6806</span>&#160;    json.EndObject();</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;</div><div class="line"><a name="l06809"></a><span class="lineno"> 6809</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata::PrintDetailedMap_End(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l06810"></a><span class="lineno"> 6810</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06811"></a><span class="lineno"> 6811</span>&#160;    json.EndArray();</div><div class="line"><a name="l06812"></a><span class="lineno"> 6812</span>&#160;    json.EndObject();</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;</div><div class="line"><a name="l06815"></a><span class="lineno"> 6815</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l06816"></a><span class="lineno"> 6816</span>&#160;</div><div class="line"><a name="l06818"></a><span class="lineno"> 6818</span>&#160;<span class="comment">// class VmaBlockMetadata_Generic</span></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;VmaBlockMetadata_Generic::VmaBlockMetadata_Generic(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l06821"></a><span class="lineno"> 6821</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l06822"></a><span class="lineno"> 6822</span>&#160;    m_FreeCount(0),</div><div class="line"><a name="l06823"></a><span class="lineno"> 6823</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l06824"></a><span class="lineno"> 6824</span>&#160;    m_Suballocations(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l06825"></a><span class="lineno"> 6825</span>&#160;    m_FreeSuballocationsBySize(VmaStlAllocator&lt;VmaSuballocationList::iterator&gt;(hAllocator-&gt;GetAllocationCallbacks()))</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;}</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;VmaBlockMetadata_Generic::~VmaBlockMetadata_Generic()</div><div class="line"><a name="l06830"></a><span class="lineno"> 6830</span>&#160;{</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="keywordtype">void</span> VmaBlockMetadata_Generic::Init(VkDeviceSize size)</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;    VmaBlockMetadata::Init(size);</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;    m_FreeCount = 1;</div><div class="line"><a name="l06838"></a><span class="lineno"> 6838</span>&#160;    m_SumFreeSize = size;</div><div class="line"><a name="l06839"></a><span class="lineno"> 6839</span>&#160;</div><div class="line"><a name="l06840"></a><span class="lineno"> 6840</span>&#160;    VmaSuballocation suballoc = {};</div><div class="line"><a name="l06841"></a><span class="lineno"> 6841</span>&#160;    suballoc.offset = 0;</div><div class="line"><a name="l06842"></a><span class="lineno"> 6842</span>&#160;    suballoc.size = size;</div><div class="line"><a name="l06843"></a><span class="lineno"> 6843</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l06844"></a><span class="lineno"> 6844</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l06845"></a><span class="lineno"> 6845</span>&#160;</div><div class="line"><a name="l06846"></a><span class="lineno"> 6846</span>&#160;    VMA_ASSERT(size &gt; VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div><div class="line"><a name="l06847"></a><span class="lineno"> 6847</span>&#160;    m_Suballocations.push_back(suballoc);</div><div class="line"><a name="l06848"></a><span class="lineno"> 6848</span>&#160;    VmaSuballocationList::iterator suballocItem = m_Suballocations.end();</div><div class="line"><a name="l06849"></a><span class="lineno"> 6849</span>&#160;    --suballocItem;</div><div class="line"><a name="l06850"></a><span class="lineno"> 6850</span>&#160;    m_FreeSuballocationsBySize.push_back(suballocItem);</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;</div><div class="line"><a name="l06853"></a><span class="lineno"> 6853</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l06854"></a><span class="lineno"> 6854</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06855"></a><span class="lineno"> 6855</span>&#160;    VMA_VALIDATE(!m_Suballocations.empty());</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="comment">// Expected offset of new suballocation as calculated from previous ones.</span></div><div class="line"><a name="l06858"></a><span class="lineno"> 6858</span>&#160;    VkDeviceSize calculatedOffset = 0;</div><div class="line"><a name="l06859"></a><span class="lineno"> 6859</span>&#160;    <span class="comment">// Expected number of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l06860"></a><span class="lineno"> 6860</span>&#160;    uint32_t calculatedFreeCount = 0;</div><div class="line"><a name="l06861"></a><span class="lineno"> 6861</span>&#160;    <span class="comment">// Expected sum size of free suballocations as calculated from traversing their list.</span></div><div class="line"><a name="l06862"></a><span class="lineno"> 6862</span>&#160;    VkDeviceSize calculatedSumFreeSize = 0;</div><div class="line"><a name="l06863"></a><span class="lineno"> 6863</span>&#160;    <span class="comment">// Expected number of free suballocations that should be registered in</span></div><div class="line"><a name="l06864"></a><span class="lineno"> 6864</span>&#160;    <span class="comment">// m_FreeSuballocationsBySize calculated from traversing their list.</span></div><div class="line"><a name="l06865"></a><span class="lineno"> 6865</span>&#160;    <span class="keywordtype">size_t</span> freeSuballocationsToRegister = 0;</div><div class="line"><a name="l06866"></a><span class="lineno"> 6866</span>&#160;    <span class="comment">// True if previous visited suballocation was free.</span></div><div class="line"><a name="l06867"></a><span class="lineno"> 6867</span>&#160;    <span class="keywordtype">bool</span> prevFree = <span class="keyword">false</span>;</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;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l06870"></a><span class="lineno"> 6870</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l06871"></a><span class="lineno"> 6871</span>&#160;        ++suballocItem)</div><div class="line"><a name="l06872"></a><span class="lineno"> 6872</span>&#160;    {</div><div class="line"><a name="l06873"></a><span class="lineno"> 6873</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; subAlloc = *suballocItem;</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">// Actual offset of this suballocation doesn&#39;t match expected one.</span></div><div class="line"><a name="l06876"></a><span class="lineno"> 6876</span>&#160;        VMA_VALIDATE(subAlloc.offset == calculatedOffset);</div><div class="line"><a name="l06877"></a><span class="lineno"> 6877</span>&#160;</div><div class="line"><a name="l06878"></a><span class="lineno"> 6878</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="l06879"></a><span class="lineno"> 6879</span>&#160;        <span class="comment">// Two adjacent free suballocations are invalid. They should be merged.</span></div><div class="line"><a name="l06880"></a><span class="lineno"> 6880</span>&#160;        VMA_VALIDATE(!prevFree || !currFree);</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;        VMA_VALIDATE(currFree == (subAlloc.hAllocation == VK_NULL_HANDLE));</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;        <span class="keywordflow">if</span>(currFree)</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;            calculatedSumFreeSize += subAlloc.size;</div><div class="line"><a name="l06887"></a><span class="lineno"> 6887</span>&#160;            ++calculatedFreeCount;</div><div class="line"><a name="l06888"></a><span class="lineno"> 6888</span>&#160;            <span class="keywordflow">if</span>(subAlloc.size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</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;                ++freeSuballocationsToRegister;</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;</div><div class="line"><a name="l06893"></a><span class="lineno"> 6893</span>&#160;            <span class="comment">// Margin required between allocations - every free space must be at least that large.</span></div><div class="line"><a name="l06894"></a><span class="lineno"> 6894</span>&#160;            VMA_VALIDATE(subAlloc.size &gt;= VMA_DEBUG_MARGIN);</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">else</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;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetOffset() == subAlloc.offset);</div><div class="line"><a name="l06899"></a><span class="lineno"> 6899</span>&#160;            VMA_VALIDATE(subAlloc.hAllocation-&gt;GetSize() == subAlloc.size);</div><div class="line"><a name="l06900"></a><span class="lineno"> 6900</span>&#160;</div><div class="line"><a name="l06901"></a><span class="lineno"> 6901</span>&#160;            <span class="comment">// Margin required between allocations - previous allocation must be free.</span></div><div class="line"><a name="l06902"></a><span class="lineno"> 6902</span>&#160;            VMA_VALIDATE(VMA_DEBUG_MARGIN == 0 || prevFree);</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;</div><div class="line"><a name="l06905"></a><span class="lineno"> 6905</span>&#160;        calculatedOffset += subAlloc.size;</div><div class="line"><a name="l06906"></a><span class="lineno"> 6906</span>&#160;        prevFree = currFree;</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;</div><div class="line"><a name="l06909"></a><span class="lineno"> 6909</span>&#160;    <span class="comment">// Number of free suballocations registered in m_FreeSuballocationsBySize doesn&#39;t</span></div><div class="line"><a name="l06910"></a><span class="lineno"> 6910</span>&#160;    <span class="comment">// match expected one.</span></div><div class="line"><a name="l06911"></a><span class="lineno"> 6911</span>&#160;    VMA_VALIDATE(m_FreeSuballocationsBySize.size() == freeSuballocationsToRegister);</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;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l06914"></a><span class="lineno"> 6914</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="l06915"></a><span class="lineno"> 6915</span>&#160;    {</div><div class="line"><a name="l06916"></a><span class="lineno"> 6916</span>&#160;        VmaSuballocationList::iterator suballocItem = m_FreeSuballocationsBySize[i];</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;        <span class="comment">// Only free suballocations can be registered in m_FreeSuballocationsBySize.</span></div><div class="line"><a name="l06919"></a><span class="lineno"> 6919</span>&#160;        VMA_VALIDATE(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l06920"></a><span class="lineno"> 6920</span>&#160;        <span class="comment">// They must be sorted by size ascending.</span></div><div class="line"><a name="l06921"></a><span class="lineno"> 6921</span>&#160;        VMA_VALIDATE(suballocItem-&gt;size &gt;= lastSize);</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;        lastSize = suballocItem-&gt;size;</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;</div><div class="line"><a name="l06926"></a><span class="lineno"> 6926</span>&#160;    <span class="comment">// Check if totals match calculacted values.</span></div><div class="line"><a name="l06927"></a><span class="lineno"> 6927</span>&#160;    VMA_VALIDATE(ValidateFreeSuballocationList());</div><div class="line"><a name="l06928"></a><span class="lineno"> 6928</span>&#160;    VMA_VALIDATE(calculatedOffset == GetSize());</div><div class="line"><a name="l06929"></a><span class="lineno"> 6929</span>&#160;    VMA_VALIDATE(calculatedSumFreeSize == m_SumFreeSize);</div><div class="line"><a name="l06930"></a><span class="lineno"> 6930</span>&#160;    VMA_VALIDATE(calculatedFreeCount == m_FreeCount);</div><div class="line"><a name="l06931"></a><span class="lineno"> 6931</span>&#160;</div><div class="line"><a name="l06932"></a><span class="lineno"> 6932</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l06935"></a><span class="lineno"> 6935</span>&#160;VkDeviceSize VmaBlockMetadata_Generic::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l06936"></a><span class="lineno"> 6936</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06937"></a><span class="lineno"> 6937</span>&#160;    <span class="keywordflow">if</span>(!m_FreeSuballocationsBySize.empty())</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="keywordflow">return</span> m_FreeSuballocationsBySize.back()-&gt;size;</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l06942"></a><span class="lineno"> 6942</span>&#160;    {</div><div class="line"><a name="l06943"></a><span class="lineno"> 6943</span>&#160;        <span class="keywordflow">return</span> 0;</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;}</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;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::IsEmpty()<span class="keyword"> const</span></div><div class="line"><a name="l06948"></a><span class="lineno"> 6948</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06949"></a><span class="lineno"> 6949</span>&#160;    <span class="keywordflow">return</span> (m_Suballocations.size() == 1) &amp;&amp; (m_FreeCount == 1);</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;</div><div class="line"><a name="l06952"></a><span class="lineno"> 6952</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::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="l06953"></a><span class="lineno"> 6953</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06954"></a><span class="lineno"> 6954</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</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;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</div><div class="line"><a name="l06957"></a><span class="lineno"> 6957</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = rangeCount - m_FreeCount;</div><div class="line"><a name="l06958"></a><span class="lineno"> 6958</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = m_FreeCount;</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = m_SumFreeSize;</div><div class="line"><a name="l06961"></a><span class="lineno"> 6961</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = GetSize() - outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>;</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06964"></a><span class="lineno"> 6964</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l06965"></a><span class="lineno"> 6965</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l06966"></a><span class="lineno"> 6966</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</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="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l06969"></a><span class="lineno"> 6969</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l06970"></a><span class="lineno"> 6970</span>&#160;        ++suballocItem)</div><div class="line"><a name="l06971"></a><span class="lineno"> 6971</span>&#160;    {</div><div class="line"><a name="l06972"></a><span class="lineno"> 6972</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l06973"></a><span class="lineno"> 6973</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l06974"></a><span class="lineno"> 6974</span>&#160;        {</div><div class="line"><a name="l06975"></a><span class="lineno"> 6975</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="l06976"></a><span class="lineno"> 6976</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="l06977"></a><span class="lineno"> 6977</span>&#160;        }</div><div class="line"><a name="l06978"></a><span class="lineno"> 6978</span>&#160;        <span class="keywordflow">else</span></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;            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="l06981"></a><span class="lineno"> 6981</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="l06982"></a><span class="lineno"> 6982</span>&#160;        }</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;</div><div class="line"><a name="l06986"></a><span class="lineno"> 6986</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::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="l06987"></a><span class="lineno"> 6987</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l06988"></a><span class="lineno"> 6988</span>&#160;    <span class="keyword">const</span> uint32_t rangeCount = (uint32_t)m_Suballocations.size();</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;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div><div class="line"><a name="l06991"></a><span class="lineno"> 6991</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize;</div><div class="line"><a name="l06992"></a><span class="lineno"> 6992</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += rangeCount - m_FreeCount;</div><div class="line"><a name="l06993"></a><span class="lineno"> 6993</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l06994"></a><span class="lineno"> 6994</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="l06995"></a><span class="lineno"> 6995</span>&#160;}</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="preprocessor">#if VMA_STATS_STRING_ENABLED</span></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="keywordtype">void</span> VmaBlockMetadata_Generic::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l07000"></a><span class="lineno"> 7000</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07001"></a><span class="lineno"> 7001</span>&#160;    PrintDetailedMap_Begin(json,</div><div class="line"><a name="l07002"></a><span class="lineno"> 7002</span>&#160;        m_SumFreeSize, <span class="comment">// unusedBytes</span></div><div class="line"><a name="l07003"></a><span class="lineno"> 7003</span>&#160;        m_Suballocations.size() - (size_t)m_FreeCount, <span class="comment">// allocationCount</span></div><div class="line"><a name="l07004"></a><span class="lineno"> 7004</span>&#160;        m_FreeCount); <span class="comment">// unusedRangeCount</span></div><div class="line"><a name="l07005"></a><span class="lineno"> 7005</span>&#160;</div><div class="line"><a name="l07006"></a><span class="lineno"> 7006</span>&#160;    <span class="keywordtype">size_t</span> i = 0;</div><div class="line"><a name="l07007"></a><span class="lineno"> 7007</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::const_iterator suballocItem = m_Suballocations.cbegin();</div><div class="line"><a name="l07008"></a><span class="lineno"> 7008</span>&#160;        suballocItem != m_Suballocations.cend();</div><div class="line"><a name="l07009"></a><span class="lineno"> 7009</span>&#160;        ++suballocItem, ++i)</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;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            PrintDetailedMap_UnusedRange(json, suballocItem-&gt;offset, suballocItem-&gt;size);</div><div class="line"><a name="l07014"></a><span class="lineno"> 7014</span>&#160;        }</div><div class="line"><a name="l07015"></a><span class="lineno"> 7015</span>&#160;        <span class="keywordflow">else</span></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;            PrintDetailedMap_Allocation(json, suballocItem-&gt;offset, suballocItem-&gt;hAllocation);</div><div class="line"><a name="l07018"></a><span class="lineno"> 7018</span>&#160;        }</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;</div><div class="line"><a name="l07021"></a><span class="lineno"> 7021</span>&#160;    PrintDetailedMap_End(json);</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;</div><div class="line"><a name="l07024"></a><span class="lineno"> 7024</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l07025"></a><span class="lineno"> 7025</span>&#160;</div><div class="line"><a name="l07026"></a><span class="lineno"> 7026</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::CreateAllocationRequest(</div><div class="line"><a name="l07027"></a><span class="lineno"> 7027</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07028"></a><span class="lineno"> 7028</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l07029"></a><span class="lineno"> 7029</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l07030"></a><span class="lineno"> 7030</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l07031"></a><span class="lineno"> 7031</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l07032"></a><span class="lineno"> 7032</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l07033"></a><span class="lineno"> 7033</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l07034"></a><span class="lineno"> 7034</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l07035"></a><span class="lineno"> 7035</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l07036"></a><span class="lineno"> 7036</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l07039"></a><span class="lineno"> 7039</span>&#160;    VMA_ASSERT(!upperAddress);</div><div class="line"><a name="l07040"></a><span class="lineno"> 7040</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07041"></a><span class="lineno"> 7041</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l07042"></a><span class="lineno"> 7042</span>&#160;    VMA_HEAVY_ASSERT(Validate());</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="comment">// There is not enough total free space in this block to fullfill the request: Early return.</span></div><div class="line"><a name="l07045"></a><span class="lineno"> 7045</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost == <span class="keyword">false</span> &amp;&amp;</div><div class="line"><a name="l07046"></a><span class="lineno"> 7046</span>&#160;        m_SumFreeSize &lt; allocSize + 2 * VMA_DEBUG_MARGIN)</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;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="comment">// New algorithm, efficiently searching freeSuballocationsBySize.</span></div><div class="line"><a name="l07052"></a><span class="lineno"> 7052</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> freeSuballocCount = m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l07053"></a><span class="lineno"> 7053</span>&#160;    <span class="keywordflow">if</span>(freeSuballocCount &gt; 0)</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="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div><div class="line"><a name="l07056"></a><span class="lineno"> 7056</span>&#160;        {</div><div class="line"><a name="l07057"></a><span class="lineno"> 7057</span>&#160;            <span class="comment">// Find first free suballocation with size not less than allocSize + 2 * VMA_DEBUG_MARGIN.</span></div><div class="line"><a name="l07058"></a><span class="lineno"> 7058</span>&#160;            VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l07059"></a><span class="lineno"> 7059</span>&#160;                m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l07060"></a><span class="lineno"> 7060</span>&#160;                m_FreeSuballocationsBySize.data() + freeSuballocCount,</div><div class="line"><a name="l07061"></a><span class="lineno"> 7061</span>&#160;                allocSize + 2 * VMA_DEBUG_MARGIN,</div><div class="line"><a name="l07062"></a><span class="lineno"> 7062</span>&#160;                VmaSuballocationItemSizeLess());</div><div class="line"><a name="l07063"></a><span class="lineno"> 7063</span>&#160;            <span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l07064"></a><span class="lineno"> 7064</span>&#160;            <span class="keywordflow">for</span>(; index &lt; freeSuballocCount; ++index)</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;                <span class="keywordflow">if</span>(CheckAllocation(</div><div class="line"><a name="l07067"></a><span class="lineno"> 7067</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07068"></a><span class="lineno"> 7068</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l07069"></a><span class="lineno"> 7069</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l07070"></a><span class="lineno"> 7070</span>&#160;                    allocSize,</div><div class="line"><a name="l07071"></a><span class="lineno"> 7071</span>&#160;                    allocAlignment,</div><div class="line"><a name="l07072"></a><span class="lineno"> 7072</span>&#160;                    allocType,</div><div class="line"><a name="l07073"></a><span class="lineno"> 7073</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l07074"></a><span class="lineno"> 7074</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07075"></a><span class="lineno"> 7075</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l07076"></a><span class="lineno"> 7076</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l07077"></a><span class="lineno"> 7077</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l07078"></a><span class="lineno"> 7078</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</div><div class="line"><a name="l07079"></a><span class="lineno"> 7079</span>&#160;                {</div><div class="line"><a name="l07080"></a><span class="lineno"> 7080</span>&#160;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l07081"></a><span class="lineno"> 7081</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07082"></a><span class="lineno"> 7082</span>&#160;                }</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;        <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></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;            <span class="comment">// Search staring from biggest suballocations.</span></div><div class="line"><a name="l07088"></a><span class="lineno"> 7088</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = freeSuballocCount; index--; )</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">if</span>(CheckAllocation(</div><div class="line"><a name="l07091"></a><span class="lineno"> 7091</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07092"></a><span class="lineno"> 7092</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l07093"></a><span class="lineno"> 7093</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l07094"></a><span class="lineno"> 7094</span>&#160;                    allocSize,</div><div class="line"><a name="l07095"></a><span class="lineno"> 7095</span>&#160;                    allocAlignment,</div><div class="line"><a name="l07096"></a><span class="lineno"> 7096</span>&#160;                    allocType,</div><div class="line"><a name="l07097"></a><span class="lineno"> 7097</span>&#160;                    m_FreeSuballocationsBySize[index],</div><div class="line"><a name="l07098"></a><span class="lineno"> 7098</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l07099"></a><span class="lineno"> 7099</span>&#160;                    &amp;pAllocationRequest-&gt;offset,</div><div class="line"><a name="l07100"></a><span class="lineno"> 7100</span>&#160;                    &amp;pAllocationRequest-&gt;itemsToMakeLostCount,</div><div class="line"><a name="l07101"></a><span class="lineno"> 7101</span>&#160;                    &amp;pAllocationRequest-&gt;sumFreeSize,</div><div class="line"><a name="l07102"></a><span class="lineno"> 7102</span>&#160;                    &amp;pAllocationRequest-&gt;sumItemSize))</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;                    pAllocationRequest-&gt;item = m_FreeSuballocationsBySize[index];</div><div class="line"><a name="l07105"></a><span class="lineno"> 7105</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07106"></a><span class="lineno"> 7106</span>&#160;                }</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;        }</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;</div><div class="line"><a name="l07111"></a><span class="lineno"> 7111</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</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;        <span class="comment">// Brute-force algorithm. TODO: Come up with something better.</span></div><div class="line"><a name="l07114"></a><span class="lineno"> 7114</span>&#160;</div><div class="line"><a name="l07115"></a><span class="lineno"> 7115</span>&#160;        pAllocationRequest-&gt;sumFreeSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l07116"></a><span class="lineno"> 7116</span>&#160;        pAllocationRequest-&gt;sumItemSize = VK_WHOLE_SIZE;</div><div class="line"><a name="l07117"></a><span class="lineno"> 7117</span>&#160;</div><div class="line"><a name="l07118"></a><span class="lineno"> 7118</span>&#160;        VmaAllocationRequest tmpAllocRequest = {};</div><div class="line"><a name="l07119"></a><span class="lineno"> 7119</span>&#160;        <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocIt = m_Suballocations.begin();</div><div class="line"><a name="l07120"></a><span class="lineno"> 7120</span>&#160;            suballocIt != m_Suballocations.end();</div><div class="line"><a name="l07121"></a><span class="lineno"> 7121</span>&#160;            ++suballocIt)</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="keywordflow">if</span>(suballocIt-&gt;type == VMA_SUBALLOCATION_TYPE_FREE ||</div><div class="line"><a name="l07124"></a><span class="lineno"> 7124</span>&#160;                suballocIt-&gt;hAllocation-&gt;CanBecomeLost())</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>(CheckAllocation(</div><div class="line"><a name="l07127"></a><span class="lineno"> 7127</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l07128"></a><span class="lineno"> 7128</span>&#160;                    frameInUseCount,</div><div class="line"><a name="l07129"></a><span class="lineno"> 7129</span>&#160;                    bufferImageGranularity,</div><div class="line"><a name="l07130"></a><span class="lineno"> 7130</span>&#160;                    allocSize,</div><div class="line"><a name="l07131"></a><span class="lineno"> 7131</span>&#160;                    allocAlignment,</div><div class="line"><a name="l07132"></a><span class="lineno"> 7132</span>&#160;                    allocType,</div><div class="line"><a name="l07133"></a><span class="lineno"> 7133</span>&#160;                    suballocIt,</div><div class="line"><a name="l07134"></a><span class="lineno"> 7134</span>&#160;                    canMakeOtherLost,</div><div class="line"><a name="l07135"></a><span class="lineno"> 7135</span>&#160;                    &amp;tmpAllocRequest.offset,</div><div class="line"><a name="l07136"></a><span class="lineno"> 7136</span>&#160;                    &amp;tmpAllocRequest.itemsToMakeLostCount,</div><div class="line"><a name="l07137"></a><span class="lineno"> 7137</span>&#160;                    &amp;tmpAllocRequest.sumFreeSize,</div><div class="line"><a name="l07138"></a><span class="lineno"> 7138</span>&#160;                    &amp;tmpAllocRequest.sumItemSize))</div><div class="line"><a name="l07139"></a><span class="lineno"> 7139</span>&#160;                {</div><div class="line"><a name="l07140"></a><span class="lineno"> 7140</span>&#160;                    tmpAllocRequest.item = suballocIt;</div><div class="line"><a name="l07141"></a><span class="lineno"> 7141</span>&#160;</div><div class="line"><a name="l07142"></a><span class="lineno"> 7142</span>&#160;                    <span class="keywordflow">if</span>(tmpAllocRequest.CalcCost() &lt; pAllocationRequest-&gt;CalcCost() ||</div><div class="line"><a name="l07143"></a><span class="lineno"> 7143</span>&#160;                        strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</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;                        *pAllocationRequest = tmpAllocRequest;</div><div class="line"><a name="l07146"></a><span class="lineno"> 7146</span>&#160;                    }</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;            }</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;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;sumItemSize != VK_WHOLE_SIZE)</div><div class="line"><a name="l07152"></a><span class="lineno"> 7152</span>&#160;        {</div><div class="line"><a name="l07153"></a><span class="lineno"> 7153</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07154"></a><span class="lineno"> 7154</span>&#160;        }</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;</div><div class="line"><a name="l07157"></a><span class="lineno"> 7157</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07158"></a><span class="lineno"> 7158</span>&#160;}</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;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::MakeRequestedAllocationsLost(</div><div class="line"><a name="l07161"></a><span class="lineno"> 7161</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07162"></a><span class="lineno"> 7162</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l07163"></a><span class="lineno"> 7163</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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="keywordflow">while</span>(pAllocationRequest-&gt;itemsToMakeLostCount &gt; 0)</div><div class="line"><a name="l07166"></a><span class="lineno"> 7166</span>&#160;    {</div><div class="line"><a name="l07167"></a><span class="lineno"> 7167</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            ++pAllocationRequest-&gt;item;</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;        VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l07172"></a><span class="lineno"> 7172</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07173"></a><span class="lineno"> 7173</span>&#160;        VMA_ASSERT(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l07174"></a><span class="lineno"> 7174</span>&#160;        <span class="keywordflow">if</span>(pAllocationRequest-&gt;item-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l07175"></a><span class="lineno"> 7175</span>&#160;        {</div><div class="line"><a name="l07176"></a><span class="lineno"> 7176</span>&#160;            pAllocationRequest-&gt;item = FreeSuballocation(pAllocationRequest-&gt;item);</div><div class="line"><a name="l07177"></a><span class="lineno"> 7177</span>&#160;            --pAllocationRequest-&gt;itemsToMakeLostCount;</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l07180"></a><span class="lineno"> 7180</span>&#160;        {</div><div class="line"><a name="l07181"></a><span class="lineno"> 7181</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;    }</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;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l07186"></a><span class="lineno"> 7186</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item != m_Suballocations.end());</div><div class="line"><a name="l07187"></a><span class="lineno"> 7187</span>&#160;    VMA_ASSERT(pAllocationRequest-&gt;item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l07190"></a><span class="lineno"> 7190</span>&#160;}</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;uint32_t VmaBlockMetadata_Generic::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</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;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l07195"></a><span class="lineno"> 7195</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l07196"></a><span class="lineno"> 7196</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l07197"></a><span class="lineno"> 7197</span>&#160;        ++it)</div><div class="line"><a name="l07198"></a><span class="lineno"> 7198</span>&#160;    {</div><div class="line"><a name="l07199"></a><span class="lineno"> 7199</span>&#160;        <span class="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l07200"></a><span class="lineno"> 7200</span>&#160;            it-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l07201"></a><span class="lineno"> 7201</span>&#160;            it-&gt;hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l07202"></a><span class="lineno"> 7202</span>&#160;        {</div><div class="line"><a name="l07203"></a><span class="lineno"> 7203</span>&#160;            it = FreeSuballocation(it);</div><div class="line"><a name="l07204"></a><span class="lineno"> 7204</span>&#160;            ++lostAllocationCount;</div><div class="line"><a name="l07205"></a><span class="lineno"> 7205</span>&#160;        }</div><div class="line"><a name="l07206"></a><span class="lineno"> 7206</span>&#160;    }</div><div class="line"><a name="l07207"></a><span class="lineno"> 7207</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div><div class="line"><a name="l07208"></a><span class="lineno"> 7208</span>&#160;}</div><div class="line"><a name="l07209"></a><span class="lineno"> 7209</span>&#160;</div><div class="line"><a name="l07210"></a><span class="lineno"> 7210</span>&#160;VkResult VmaBlockMetadata_Generic::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div><div class="line"><a name="l07211"></a><span class="lineno"> 7211</span>&#160;{</div><div class="line"><a name="l07212"></a><span class="lineno"> 7212</span>&#160;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator it = m_Suballocations.begin();</div><div class="line"><a name="l07213"></a><span class="lineno"> 7213</span>&#160;        it != m_Suballocations.end();</div><div class="line"><a name="l07214"></a><span class="lineno"> 7214</span>&#160;        ++it)</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="keywordflow">if</span>(it-&gt;type != VMA_SUBALLOCATION_TYPE_FREE)</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>(!VmaValidateMagicValue(pBlockData, it-&gt;offset - VMA_DEBUG_MARGIN))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l07221"></a><span class="lineno"> 7221</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, it-&gt;offset + it-&gt;size))</div><div class="line"><a name="l07224"></a><span class="lineno"> 7224</span>&#160;            {</div><div class="line"><a name="l07225"></a><span class="lineno"> 7225</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l07226"></a><span class="lineno"> 7226</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l07227"></a><span class="lineno"> 7227</span>&#160;            }</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;</div><div class="line"><a name="l07231"></a><span class="lineno"> 7231</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l07232"></a><span class="lineno"> 7232</span>&#160;}</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="keywordtype">void</span> VmaBlockMetadata_Generic::Alloc(</div><div class="line"><a name="l07235"></a><span class="lineno"> 7235</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l07236"></a><span class="lineno"> 7236</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l07237"></a><span class="lineno"> 7237</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l07238"></a><span class="lineno"> 7238</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l07239"></a><span class="lineno"> 7239</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l07240"></a><span class="lineno"> 7240</span>&#160;{</div><div class="line"><a name="l07241"></a><span class="lineno"> 7241</span>&#160;    VMA_ASSERT(!upperAddress);</div><div class="line"><a name="l07242"></a><span class="lineno"> 7242</span>&#160;    VMA_ASSERT(request.item != m_Suballocations.end());</div><div class="line"><a name="l07243"></a><span class="lineno"> 7243</span>&#160;    VmaSuballocation&amp; suballoc = *request.item;</div><div class="line"><a name="l07244"></a><span class="lineno"> 7244</span>&#160;    <span class="comment">// Given suballocation is a free block.</span></div><div class="line"><a name="l07245"></a><span class="lineno"> 7245</span>&#160;    VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07246"></a><span class="lineno"> 7246</span>&#160;    <span class="comment">// Given offset is inside this suballocation.</span></div><div class="line"><a name="l07247"></a><span class="lineno"> 7247</span>&#160;    VMA_ASSERT(request.offset &gt;= suballoc.offset);</div><div class="line"><a name="l07248"></a><span class="lineno"> 7248</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingBegin = request.offset - suballoc.offset;</div><div class="line"><a name="l07249"></a><span class="lineno"> 7249</span>&#160;    VMA_ASSERT(suballoc.size &gt;= paddingBegin + allocSize);</div><div class="line"><a name="l07250"></a><span class="lineno"> 7250</span>&#160;    <span class="keyword">const</span> VkDeviceSize paddingEnd = suballoc.size - paddingBegin - allocSize;</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">// Unregister this free suballocation from m_FreeSuballocationsBySize and update</span></div><div class="line"><a name="l07253"></a><span class="lineno"> 7253</span>&#160;    <span class="comment">// it to become used.</span></div><div class="line"><a name="l07254"></a><span class="lineno"> 7254</span>&#160;    UnregisterFreeSuballocation(request.item);</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;    suballoc.offset = request.offset;</div><div class="line"><a name="l07257"></a><span class="lineno"> 7257</span>&#160;    suballoc.size = allocSize;</div><div class="line"><a name="l07258"></a><span class="lineno"> 7258</span>&#160;    suballoc.type = type;</div><div class="line"><a name="l07259"></a><span class="lineno"> 7259</span>&#160;    suballoc.hAllocation = hAllocation;</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;    <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="l07262"></a><span class="lineno"> 7262</span>&#160;    <span class="keywordflow">if</span>(paddingEnd)</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;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l07265"></a><span class="lineno"> 7265</span>&#160;        paddingSuballoc.offset = request.offset + allocSize;</div><div class="line"><a name="l07266"></a><span class="lineno"> 7266</span>&#160;        paddingSuballoc.size = paddingEnd;</div><div class="line"><a name="l07267"></a><span class="lineno"> 7267</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07268"></a><span class="lineno"> 7268</span>&#160;        VmaSuballocationList::iterator next = request.item;</div><div class="line"><a name="l07269"></a><span class="lineno"> 7269</span>&#160;        ++next;</div><div class="line"><a name="l07270"></a><span class="lineno"> 7270</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingEndItem =</div><div class="line"><a name="l07271"></a><span class="lineno"> 7271</span>&#160;            m_Suballocations.insert(next, paddingSuballoc);</div><div class="line"><a name="l07272"></a><span class="lineno"> 7272</span>&#160;        RegisterFreeSuballocation(paddingEndItem);</div><div class="line"><a name="l07273"></a><span class="lineno"> 7273</span>&#160;    }</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="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="l07276"></a><span class="lineno"> 7276</span>&#160;    <span class="keywordflow">if</span>(paddingBegin)</div><div class="line"><a name="l07277"></a><span class="lineno"> 7277</span>&#160;    {</div><div class="line"><a name="l07278"></a><span class="lineno"> 7278</span>&#160;        VmaSuballocation paddingSuballoc = {};</div><div class="line"><a name="l07279"></a><span class="lineno"> 7279</span>&#160;        paddingSuballoc.offset = request.offset - paddingBegin;</div><div class="line"><a name="l07280"></a><span class="lineno"> 7280</span>&#160;        paddingSuballoc.size = paddingBegin;</div><div class="line"><a name="l07281"></a><span class="lineno"> 7281</span>&#160;        paddingSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07282"></a><span class="lineno"> 7282</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator paddingBeginItem =</div><div class="line"><a name="l07283"></a><span class="lineno"> 7283</span>&#160;            m_Suballocations.insert(request.item, paddingSuballoc);</div><div class="line"><a name="l07284"></a><span class="lineno"> 7284</span>&#160;        RegisterFreeSuballocation(paddingBeginItem);</div><div class="line"><a name="l07285"></a><span class="lineno"> 7285</span>&#160;    }</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="comment">// Update totals.</span></div><div class="line"><a name="l07288"></a><span class="lineno"> 7288</span>&#160;    m_FreeCount = m_FreeCount - 1;</div><div class="line"><a name="l07289"></a><span class="lineno"> 7289</span>&#160;    <span class="keywordflow">if</span>(paddingBegin &gt; 0)</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;        ++m_FreeCount;</div><div class="line"><a name="l07292"></a><span class="lineno"> 7292</span>&#160;    }</div><div class="line"><a name="l07293"></a><span class="lineno"> 7293</span>&#160;    <span class="keywordflow">if</span>(paddingEnd &gt; 0)</div><div class="line"><a name="l07294"></a><span class="lineno"> 7294</span>&#160;    {</div><div class="line"><a name="l07295"></a><span class="lineno"> 7295</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l07296"></a><span class="lineno"> 7296</span>&#160;    }</div><div class="line"><a name="l07297"></a><span class="lineno"> 7297</span>&#160;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l07298"></a><span class="lineno"> 7298</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l07303"></a><span class="lineno"> 7303</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l07304"></a><span class="lineno"> 7304</span>&#160;        ++suballocItem)</div><div class="line"><a name="l07305"></a><span class="lineno"> 7305</span>&#160;    {</div><div class="line"><a name="l07306"></a><span class="lineno"> 7306</span>&#160;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07307"></a><span class="lineno"> 7307</span>&#160;        <span class="keywordflow">if</span>(suballoc.hAllocation == allocation)</div><div class="line"><a name="l07308"></a><span class="lineno"> 7308</span>&#160;        {</div><div class="line"><a name="l07309"></a><span class="lineno"> 7309</span>&#160;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l07310"></a><span class="lineno"> 7310</span>&#160;            VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l07311"></a><span class="lineno"> 7311</span>&#160;            <span class="keywordflow">return</span>;</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;    }</div><div class="line"><a name="l07314"></a><span class="lineno"> 7314</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</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;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::FreeAtOffset(VkDeviceSize offset)</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;    <span class="keywordflow">for</span>(VmaSuballocationList::iterator suballocItem = m_Suballocations.begin();</div><div class="line"><a name="l07320"></a><span class="lineno"> 7320</span>&#160;        suballocItem != m_Suballocations.end();</div><div class="line"><a name="l07321"></a><span class="lineno"> 7321</span>&#160;        ++suballocItem)</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;        VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07324"></a><span class="lineno"> 7324</span>&#160;        <span class="keywordflow">if</span>(suballoc.offset == offset)</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;            FreeSuballocation(suballocItem);</div><div class="line"><a name="l07327"></a><span class="lineno"> 7327</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l07328"></a><span class="lineno"> 7328</span>&#160;        }</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;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found!&quot;</span>);</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;</div><div class="line"><a name="l07333"></a><span class="lineno"> 7333</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Generic::ValidateFreeSuballocationList()<span class="keyword"> const</span></div><div class="line"><a name="l07334"></a><span class="lineno"> 7334</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07335"></a><span class="lineno"> 7335</span>&#160;    VkDeviceSize lastSize = 0;</div><div class="line"><a name="l07336"></a><span class="lineno"> 7336</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="l07337"></a><span class="lineno"> 7337</span>&#160;    {</div><div class="line"><a name="l07338"></a><span class="lineno"> 7338</span>&#160;        <span class="keyword">const</span> VmaSuballocationList::iterator it = m_FreeSuballocationsBySize[i];</div><div class="line"><a name="l07339"></a><span class="lineno"> 7339</span>&#160;</div><div class="line"><a name="l07340"></a><span class="lineno"> 7340</span>&#160;        VMA_VALIDATE(it-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07341"></a><span class="lineno"> 7341</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER);</div><div class="line"><a name="l07342"></a><span class="lineno"> 7342</span>&#160;        VMA_VALIDATE(it-&gt;size &gt;= lastSize);</div><div class="line"><a name="l07343"></a><span class="lineno"> 7343</span>&#160;        lastSize = it-&gt;size;</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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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="keywordtype">bool</span> VmaBlockMetadata_Generic::CheckAllocation(</div><div class="line"><a name="l07349"></a><span class="lineno"> 7349</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l07350"></a><span class="lineno"> 7350</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l07351"></a><span class="lineno"> 7351</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l07352"></a><span class="lineno"> 7352</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l07353"></a><span class="lineno"> 7353</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l07354"></a><span class="lineno"> 7354</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l07355"></a><span class="lineno"> 7355</span>&#160;    VmaSuballocationList::const_iterator suballocItem,</div><div class="line"><a name="l07356"></a><span class="lineno"> 7356</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l07357"></a><span class="lineno"> 7357</span>&#160;    VkDeviceSize* pOffset,</div><div class="line"><a name="l07358"></a><span class="lineno"> 7358</span>&#160;    <span class="keywordtype">size_t</span>* itemsToMakeLostCount,</div><div class="line"><a name="l07359"></a><span class="lineno"> 7359</span>&#160;    VkDeviceSize* pSumFreeSize,</div><div class="line"><a name="l07360"></a><span class="lineno"> 7360</span>&#160;    VkDeviceSize* pSumItemSize)<span class="keyword"> const</span></div><div class="line"><a name="l07361"></a><span class="lineno"> 7361</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07362"></a><span class="lineno"> 7362</span>&#160;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l07363"></a><span class="lineno"> 7363</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07364"></a><span class="lineno"> 7364</span>&#160;    VMA_ASSERT(suballocItem != m_Suballocations.cend());</div><div class="line"><a name="l07365"></a><span class="lineno"> 7365</span>&#160;    VMA_ASSERT(pOffset != VMA_NULL);</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;    *itemsToMakeLostCount = 0;</div><div class="line"><a name="l07368"></a><span class="lineno"> 7368</span>&#160;    *pSumFreeSize = 0;</div><div class="line"><a name="l07369"></a><span class="lineno"> 7369</span>&#160;    *pSumItemSize = 0;</div><div class="line"><a name="l07370"></a><span class="lineno"> 7370</span>&#160;</div><div class="line"><a name="l07371"></a><span class="lineno"> 7371</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</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;        <span class="keywordflow">if</span>(suballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            *pSumFreeSize = suballocItem-&gt;size;</div><div class="line"><a name="l07376"></a><span class="lineno"> 7376</span>&#160;        }</div><div class="line"><a name="l07377"></a><span class="lineno"> 7377</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l07378"></a><span class="lineno"> 7378</span>&#160;        {</div><div class="line"><a name="l07379"></a><span class="lineno"> 7379</span>&#160;            <span class="keywordflow">if</span>(suballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l07380"></a><span class="lineno"> 7380</span>&#160;                suballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l07381"></a><span class="lineno"> 7381</span>&#160;            {</div><div class="line"><a name="l07382"></a><span class="lineno"> 7382</span>&#160;                ++*itemsToMakeLostCount;</div><div class="line"><a name="l07383"></a><span class="lineno"> 7383</span>&#160;                *pSumItemSize = suballocItem-&gt;size;</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;            <span class="keywordflow">else</span></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;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07388"></a><span class="lineno"> 7388</span>&#160;            }</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;        <span class="comment">// Remaining size is too small for this request: Early return.</span></div><div class="line"><a name="l07392"></a><span class="lineno"> 7392</span>&#160;        <span class="keywordflow">if</span>(GetSize() - suballocItem-&gt;offset &lt; allocSize)</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">return</span> <span class="keyword">false</span>;</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;</div><div class="line"><a name="l07397"></a><span class="lineno"> 7397</span>&#160;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l07398"></a><span class="lineno"> 7398</span>&#160;        *pOffset = suballocItem-&gt;offset;</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;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l07401"></a><span class="lineno"> 7401</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</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;            *pOffset += VMA_DEBUG_MARGIN;</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;    </div><div class="line"><a name="l07406"></a><span class="lineno"> 7406</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l07407"></a><span class="lineno"> 7407</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l07408"></a><span class="lineno"> 7408</span>&#160;</div><div class="line"><a name="l07409"></a><span class="lineno"> 7409</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l07410"></a><span class="lineno"> 7410</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l07411"></a><span class="lineno"> 7411</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l07414"></a><span class="lineno"> 7414</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l07415"></a><span class="lineno"> 7415</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</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;                --prevSuballocItem;</div><div class="line"><a name="l07418"></a><span class="lineno"> 7418</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l07419"></a><span class="lineno"> 7419</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</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;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l07424"></a><span class="lineno"> 7424</span>&#160;                        <span class="keywordflow">break</span>;</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;                <span class="keywordflow">else</span></div><div class="line"><a name="l07428"></a><span class="lineno"> 7428</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l07429"></a><span class="lineno"> 7429</span>&#160;                    <span class="keywordflow">break</span>;</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="keywordflow">if</span>(bufferImageGranularityConflict)</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;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</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;        }</div><div class="line"><a name="l07436"></a><span class="lineno"> 7436</span>&#160;    </div><div class="line"><a name="l07437"></a><span class="lineno"> 7437</span>&#160;        <span class="comment">// Now that we have final *pOffset, check if we are past suballocItem.</span></div><div class="line"><a name="l07438"></a><span class="lineno"> 7438</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="l07439"></a><span class="lineno"> 7439</span>&#160;        <span class="keywordflow">if</span>(*pOffset &gt;= suballocItem-&gt;offset + suballocItem-&gt;size)</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07442"></a><span class="lineno"> 7442</span>&#160;        }</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="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l07445"></a><span class="lineno"> 7445</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballocItem-&gt;offset;</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;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l07448"></a><span class="lineno"> 7448</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</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;        <span class="keyword">const</span> VkDeviceSize totalSize = paddingBegin + allocSize + requiredEndMargin;</div><div class="line"><a name="l07451"></a><span class="lineno"> 7451</span>&#160;        <span class="comment">// Another early return check.</span></div><div class="line"><a name="l07452"></a><span class="lineno"> 7452</span>&#160;        <span class="keywordflow">if</span>(suballocItem-&gt;offset + totalSize &gt; GetSize())</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="comment">// Advance lastSuballocItem until desired size is reached.</span></div><div class="line"><a name="l07458"></a><span class="lineno"> 7458</span>&#160;        <span class="comment">// Update itemsToMakeLostCount.</span></div><div class="line"><a name="l07459"></a><span class="lineno"> 7459</span>&#160;        VmaSuballocationList::const_iterator lastSuballocItem = suballocItem;</div><div class="line"><a name="l07460"></a><span class="lineno"> 7460</span>&#160;        <span class="keywordflow">if</span>(totalSize &gt; suballocItem-&gt;size)</div><div class="line"><a name="l07461"></a><span class="lineno"> 7461</span>&#160;        {</div><div class="line"><a name="l07462"></a><span class="lineno"> 7462</span>&#160;            VkDeviceSize remainingSize = totalSize - suballocItem-&gt;size;</div><div class="line"><a name="l07463"></a><span class="lineno"> 7463</span>&#160;            <span class="keywordflow">while</span>(remainingSize &gt; 0)</div><div class="line"><a name="l07464"></a><span class="lineno"> 7464</span>&#160;            {</div><div class="line"><a name="l07465"></a><span class="lineno"> 7465</span>&#160;                ++lastSuballocItem;</div><div class="line"><a name="l07466"></a><span class="lineno"> 7466</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem == m_Suballocations.cend())</div><div class="line"><a name="l07467"></a><span class="lineno"> 7467</span>&#160;                {</div><div class="line"><a name="l07468"></a><span class="lineno"> 7468</span>&#160;                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07469"></a><span class="lineno"> 7469</span>&#160;                }</div><div class="line"><a name="l07470"></a><span class="lineno"> 7470</span>&#160;                <span class="keywordflow">if</span>(lastSuballocItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l07471"></a><span class="lineno"> 7471</span>&#160;                {</div><div class="line"><a name="l07472"></a><span class="lineno"> 7472</span>&#160;                    *pSumFreeSize += lastSuballocItem-&gt;size;</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;                    VMA_ASSERT(lastSuballocItem-&gt;hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07477"></a><span class="lineno"> 7477</span>&#160;                    <span class="keywordflow">if</span>(lastSuballocItem-&gt;hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l07478"></a><span class="lineno"> 7478</span>&#160;                        lastSuballocItem-&gt;hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l07479"></a><span class="lineno"> 7479</span>&#160;                    {</div><div class="line"><a name="l07480"></a><span class="lineno"> 7480</span>&#160;                        ++*itemsToMakeLostCount;</div><div class="line"><a name="l07481"></a><span class="lineno"> 7481</span>&#160;                        *pSumItemSize += lastSuballocItem-&gt;size;</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="keywordflow">else</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07486"></a><span class="lineno"> 7486</span>&#160;                    }</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;                remainingSize = (lastSuballocItem-&gt;size &lt; remainingSize) ?</div><div class="line"><a name="l07489"></a><span class="lineno"> 7489</span>&#160;                    remainingSize - lastSuballocItem-&gt;size : 0;</div><div class="line"><a name="l07490"></a><span class="lineno"> 7490</span>&#160;            }</div><div class="line"><a name="l07491"></a><span class="lineno"> 7491</span>&#160;        }</div><div class="line"><a name="l07492"></a><span class="lineno"> 7492</span>&#160;</div><div class="line"><a name="l07493"></a><span class="lineno"> 7493</span>&#160;        <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l07494"></a><span class="lineno"> 7494</span>&#160;        <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l07495"></a><span class="lineno"> 7495</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l07496"></a><span class="lineno"> 7496</span>&#160;        {</div><div class="line"><a name="l07497"></a><span class="lineno"> 7497</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = lastSuballocItem;</div><div class="line"><a name="l07498"></a><span class="lineno"> 7498</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l07499"></a><span class="lineno"> 7499</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</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="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l07502"></a><span class="lineno"> 7502</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l07503"></a><span class="lineno"> 7503</span>&#160;                {</div><div class="line"><a name="l07504"></a><span class="lineno"> 7504</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l07505"></a><span class="lineno"> 7505</span>&#160;                    {</div><div class="line"><a name="l07506"></a><span class="lineno"> 7506</span>&#160;                        VMA_ASSERT(nextSuballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07507"></a><span class="lineno"> 7507</span>&#160;                        <span class="keywordflow">if</span>(nextSuballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l07508"></a><span class="lineno"> 7508</span>&#160;                            nextSuballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</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;                            ++*itemsToMakeLostCount;</div><div class="line"><a name="l07511"></a><span class="lineno"> 7511</span>&#160;                        }</div><div class="line"><a name="l07512"></a><span class="lineno"> 7512</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l07513"></a><span class="lineno"> 7513</span>&#160;                        {</div><div class="line"><a name="l07514"></a><span class="lineno"> 7514</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07515"></a><span class="lineno"> 7515</span>&#160;                        }</div><div class="line"><a name="l07516"></a><span class="lineno"> 7516</span>&#160;                    }</div><div class="line"><a name="l07517"></a><span class="lineno"> 7517</span>&#160;                }</div><div class="line"><a name="l07518"></a><span class="lineno"> 7518</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l07519"></a><span class="lineno"> 7519</span>&#160;                {</div><div class="line"><a name="l07520"></a><span class="lineno"> 7520</span>&#160;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l07521"></a><span class="lineno"> 7521</span>&#160;                    <span class="keywordflow">break</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;                ++nextSuballocItem;</div><div class="line"><a name="l07524"></a><span class="lineno"> 7524</span>&#160;            }</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;    }</div><div class="line"><a name="l07527"></a><span class="lineno"> 7527</span>&#160;    <span class="keywordflow">else</span></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;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07530"></a><span class="lineno"> 7530</span>&#160;        VMA_ASSERT(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE);</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;        *pSumFreeSize = suballoc.size;</div><div class="line"><a name="l07533"></a><span class="lineno"> 7533</span>&#160;</div><div class="line"><a name="l07534"></a><span class="lineno"> 7534</span>&#160;        <span class="comment">// Size of this suballocation is too small for this request: Early return.</span></div><div class="line"><a name="l07535"></a><span class="lineno"> 7535</span>&#160;        <span class="keywordflow">if</span>(suballoc.size &lt; allocSize)</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07538"></a><span class="lineno"> 7538</span>&#160;        }</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;        <span class="comment">// Start from offset equal to beginning of this suballocation.</span></div><div class="line"><a name="l07541"></a><span class="lineno"> 7541</span>&#160;        *pOffset = suballoc.offset;</div><div class="line"><a name="l07542"></a><span class="lineno"> 7542</span>&#160;    </div><div class="line"><a name="l07543"></a><span class="lineno"> 7543</span>&#160;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l07544"></a><span class="lineno"> 7544</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l07545"></a><span class="lineno"> 7545</span>&#160;        {</div><div class="line"><a name="l07546"></a><span class="lineno"> 7546</span>&#160;            *pOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l07547"></a><span class="lineno"> 7547</span>&#160;        }</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;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l07550"></a><span class="lineno"> 7550</span>&#160;        *pOffset = VmaAlignUp(*pOffset, allocAlignment);</div><div class="line"><a name="l07551"></a><span class="lineno"> 7551</span>&#160;    </div><div class="line"><a name="l07552"></a><span class="lineno"> 7552</span>&#160;        <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l07553"></a><span class="lineno"> 7553</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l07554"></a><span class="lineno"> 7554</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</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="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l07557"></a><span class="lineno"> 7557</span>&#160;            VmaSuballocationList::const_iterator prevSuballocItem = suballocItem;</div><div class="line"><a name="l07558"></a><span class="lineno"> 7558</span>&#160;            <span class="keywordflow">while</span>(prevSuballocItem != m_Suballocations.cbegin())</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;                --prevSuballocItem;</div><div class="line"><a name="l07561"></a><span class="lineno"> 7561</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = *prevSuballocItem;</div><div class="line"><a name="l07562"></a><span class="lineno"> 7562</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, *pOffset, bufferImageGranularity))</div><div class="line"><a name="l07563"></a><span class="lineno"> 7563</span>&#160;                {</div><div class="line"><a name="l07564"></a><span class="lineno"> 7564</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l07567"></a><span class="lineno"> 7567</span>&#160;                        <span class="keywordflow">break</span>;</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;                <span class="keywordflow">else</span></div><div class="line"><a name="l07571"></a><span class="lineno"> 7571</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l07572"></a><span class="lineno"> 7572</span>&#160;                    <span class="keywordflow">break</span>;</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;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</div><div class="line"><a name="l07575"></a><span class="lineno"> 7575</span>&#160;            {</div><div class="line"><a name="l07576"></a><span class="lineno"> 7576</span>&#160;                *pOffset = VmaAlignUp(*pOffset, bufferImageGranularity);</div><div class="line"><a name="l07577"></a><span class="lineno"> 7577</span>&#160;            }</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="comment">// Calculate padding at the beginning based on current offset.</span></div><div class="line"><a name="l07581"></a><span class="lineno"> 7581</span>&#160;        <span class="keyword">const</span> VkDeviceSize paddingBegin = *pOffset - suballoc.offset;</div><div class="line"><a name="l07582"></a><span class="lineno"> 7582</span>&#160;</div><div class="line"><a name="l07583"></a><span class="lineno"> 7583</span>&#160;        <span class="comment">// Calculate required margin at the end.</span></div><div class="line"><a name="l07584"></a><span class="lineno"> 7584</span>&#160;        <span class="keyword">const</span> VkDeviceSize requiredEndMargin = VMA_DEBUG_MARGIN;</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="comment">// Fail if requested size plus margin before and after is bigger than size of this suballocation.</span></div><div class="line"><a name="l07587"></a><span class="lineno"> 7587</span>&#160;        <span class="keywordflow">if</span>(paddingBegin + allocSize + requiredEndMargin &gt; suballoc.size)</div><div class="line"><a name="l07588"></a><span class="lineno"> 7588</span>&#160;        {</div><div class="line"><a name="l07589"></a><span class="lineno"> 7589</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l07593"></a><span class="lineno"> 7593</span>&#160;        <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l07594"></a><span class="lineno"> 7594</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l07595"></a><span class="lineno"> 7595</span>&#160;        {</div><div class="line"><a name="l07596"></a><span class="lineno"> 7596</span>&#160;            VmaSuballocationList::const_iterator nextSuballocItem = suballocItem;</div><div class="line"><a name="l07597"></a><span class="lineno"> 7597</span>&#160;            ++nextSuballocItem;</div><div class="line"><a name="l07598"></a><span class="lineno"> 7598</span>&#160;            <span class="keywordflow">while</span>(nextSuballocItem != m_Suballocations.cend())</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="keyword">const</span> VmaSuballocation&amp; nextSuballoc = *nextSuballocItem;</div><div class="line"><a name="l07601"></a><span class="lineno"> 7601</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(*pOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l07602"></a><span class="lineno"> 7602</span>&#160;                {</div><div class="line"><a name="l07603"></a><span class="lineno"> 7603</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l07604"></a><span class="lineno"> 7604</span>&#160;                    {</div><div class="line"><a name="l07605"></a><span class="lineno"> 7605</span>&#160;                        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l07606"></a><span class="lineno"> 7606</span>&#160;                    }</div><div class="line"><a name="l07607"></a><span class="lineno"> 7607</span>&#160;                }</div><div class="line"><a name="l07608"></a><span class="lineno"> 7608</span>&#160;                <span class="keywordflow">else</span></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;                    <span class="comment">// Already on next page.</span></div><div class="line"><a name="l07611"></a><span class="lineno"> 7611</span>&#160;                    <span class="keywordflow">break</span>;</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;                ++nextSuballocItem;</div><div class="line"><a name="l07614"></a><span class="lineno"> 7614</span>&#160;            }</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">// All tests passed: Success. pOffset is already filled.</span></div><div class="line"><a name="l07619"></a><span class="lineno"> 7619</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</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;</div><div class="line"><a name="l07622"></a><span class="lineno"> 7622</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::MergeFreeWithNext(VmaSuballocationList::iterator item)</div><div class="line"><a name="l07623"></a><span class="lineno"> 7623</span>&#160;{</div><div class="line"><a name="l07624"></a><span class="lineno"> 7624</span>&#160;    VMA_ASSERT(item != m_Suballocations.end());</div><div class="line"><a name="l07625"></a><span class="lineno"> 7625</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07626"></a><span class="lineno"> 7626</span>&#160;    </div><div class="line"><a name="l07627"></a><span class="lineno"> 7627</span>&#160;    VmaSuballocationList::iterator nextItem = item;</div><div class="line"><a name="l07628"></a><span class="lineno"> 7628</span>&#160;    ++nextItem;</div><div class="line"><a name="l07629"></a><span class="lineno"> 7629</span>&#160;    VMA_ASSERT(nextItem != m_Suballocations.end());</div><div class="line"><a name="l07630"></a><span class="lineno"> 7630</span>&#160;    VMA_ASSERT(nextItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07631"></a><span class="lineno"> 7631</span>&#160;</div><div class="line"><a name="l07632"></a><span class="lineno"> 7632</span>&#160;    item-&gt;size += nextItem-&gt;size;</div><div class="line"><a name="l07633"></a><span class="lineno"> 7633</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l07634"></a><span class="lineno"> 7634</span>&#160;    m_Suballocations.erase(nextItem);</div><div class="line"><a name="l07635"></a><span class="lineno"> 7635</span>&#160;}</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;VmaSuballocationList::iterator VmaBlockMetadata_Generic::FreeSuballocation(VmaSuballocationList::iterator suballocItem)</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">// Change this suballocation to be marked as free.</span></div><div class="line"><a name="l07640"></a><span class="lineno"> 7640</span>&#160;    VmaSuballocation&amp; suballoc = *suballocItem;</div><div class="line"><a name="l07641"></a><span class="lineno"> 7641</span>&#160;    suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l07642"></a><span class="lineno"> 7642</span>&#160;    suballoc.hAllocation = VK_NULL_HANDLE;</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="comment">// Update totals.</span></div><div class="line"><a name="l07645"></a><span class="lineno"> 7645</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l07646"></a><span class="lineno"> 7646</span>&#160;    m_SumFreeSize += suballoc.size;</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="comment">// Merge with previous and/or next suballocation if it&#39;s also free.</span></div><div class="line"><a name="l07649"></a><span class="lineno"> 7649</span>&#160;    <span class="keywordtype">bool</span> mergeWithNext = <span class="keyword">false</span>;</div><div class="line"><a name="l07650"></a><span class="lineno"> 7650</span>&#160;    <span class="keywordtype">bool</span> mergeWithPrev = <span class="keyword">false</span>;</div><div class="line"><a name="l07651"></a><span class="lineno"> 7651</span>&#160;    </div><div class="line"><a name="l07652"></a><span class="lineno"> 7652</span>&#160;    VmaSuballocationList::iterator nextItem = suballocItem;</div><div class="line"><a name="l07653"></a><span class="lineno"> 7653</span>&#160;    ++nextItem;</div><div class="line"><a name="l07654"></a><span class="lineno"> 7654</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="l07655"></a><span class="lineno"> 7655</span>&#160;    {</div><div class="line"><a name="l07656"></a><span class="lineno"> 7656</span>&#160;        mergeWithNext = <span class="keyword">true</span>;</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;</div><div class="line"><a name="l07659"></a><span class="lineno"> 7659</span>&#160;    VmaSuballocationList::iterator prevItem = suballocItem;</div><div class="line"><a name="l07660"></a><span class="lineno"> 7660</span>&#160;    <span class="keywordflow">if</span>(suballocItem != m_Suballocations.begin())</div><div class="line"><a name="l07661"></a><span class="lineno"> 7661</span>&#160;    {</div><div class="line"><a name="l07662"></a><span class="lineno"> 7662</span>&#160;        --prevItem;</div><div class="line"><a name="l07663"></a><span class="lineno"> 7663</span>&#160;        <span class="keywordflow">if</span>(prevItem-&gt;type == VMA_SUBALLOCATION_TYPE_FREE)</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;            mergeWithPrev = <span class="keyword">true</span>;</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;    }</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;    <span class="keywordflow">if</span>(mergeWithNext)</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;        UnregisterFreeSuballocation(nextItem);</div><div class="line"><a name="l07672"></a><span class="lineno"> 7672</span>&#160;        MergeFreeWithNext(suballocItem);</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;</div><div class="line"><a name="l07675"></a><span class="lineno"> 7675</span>&#160;    <span class="keywordflow">if</span>(mergeWithPrev)</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;        UnregisterFreeSuballocation(prevItem);</div><div class="line"><a name="l07678"></a><span class="lineno"> 7678</span>&#160;        MergeFreeWithNext(prevItem);</div><div class="line"><a name="l07679"></a><span class="lineno"> 7679</span>&#160;        RegisterFreeSuballocation(prevItem);</div><div class="line"><a name="l07680"></a><span class="lineno"> 7680</span>&#160;        <span class="keywordflow">return</span> prevItem;</div><div class="line"><a name="l07681"></a><span class="lineno"> 7681</span>&#160;    }</div><div class="line"><a name="l07682"></a><span class="lineno"> 7682</span>&#160;    <span class="keywordflow">else</span></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;        RegisterFreeSuballocation(suballocItem);</div><div class="line"><a name="l07685"></a><span class="lineno"> 7685</span>&#160;        <span class="keywordflow">return</span> suballocItem;</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;}</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> VmaBlockMetadata_Generic::RegisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l07690"></a><span class="lineno"> 7690</span>&#160;{</div><div class="line"><a name="l07691"></a><span class="lineno"> 7691</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07692"></a><span class="lineno"> 7692</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</div><div class="line"><a name="l07693"></a><span class="lineno"> 7693</span>&#160;</div><div class="line"><a name="l07694"></a><span class="lineno"> 7694</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="l07695"></a><span class="lineno"> 7695</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l07696"></a><span class="lineno"> 7696</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</div><div class="line"><a name="l07697"></a><span class="lineno"> 7697</span>&#160;</div><div class="line"><a name="l07698"></a><span class="lineno"> 7698</span>&#160;    <span class="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l07699"></a><span class="lineno"> 7699</span>&#160;    {</div><div class="line"><a name="l07700"></a><span class="lineno"> 7700</span>&#160;        <span class="keywordflow">if</span>(m_FreeSuballocationsBySize.empty())</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;            m_FreeSuballocationsBySize.push_back(item);</div><div class="line"><a name="l07703"></a><span class="lineno"> 7703</span>&#160;        }</div><div class="line"><a name="l07704"></a><span class="lineno"> 7704</span>&#160;        <span class="keywordflow">else</span></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;            VmaVectorInsertSorted&lt;VmaSuballocationItemSizeLess&gt;(m_FreeSuballocationsBySize, item);</div><div class="line"><a name="l07707"></a><span class="lineno"> 7707</span>&#160;        }</div><div class="line"><a name="l07708"></a><span class="lineno"> 7708</span>&#160;    }</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;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></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;</div><div class="line"><a name="l07713"></a><span class="lineno"> 7713</span>&#160;</div><div class="line"><a name="l07714"></a><span class="lineno"> 7714</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Generic::UnregisterFreeSuballocation(VmaSuballocationList::iterator item)</div><div class="line"><a name="l07715"></a><span class="lineno"> 7715</span>&#160;{</div><div class="line"><a name="l07716"></a><span class="lineno"> 7716</span>&#160;    VMA_ASSERT(item-&gt;type == VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l07717"></a><span class="lineno"> 7717</span>&#160;    VMA_ASSERT(item-&gt;size &gt; 0);</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;    <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="l07720"></a><span class="lineno"> 7720</span>&#160;    <span class="comment">// this function, depending on what do you want to check.</span></div><div class="line"><a name="l07721"></a><span class="lineno"> 7721</span>&#160;    VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</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="keywordflow">if</span>(item-&gt;size &gt;= VMA_MIN_FREE_SUBALLOCATION_SIZE_TO_REGISTER)</div><div class="line"><a name="l07724"></a><span class="lineno"> 7724</span>&#160;    {</div><div class="line"><a name="l07725"></a><span class="lineno"> 7725</span>&#160;        VmaSuballocationList::iterator* <span class="keyword">const</span> it = VmaBinaryFindFirstNotLess(</div><div class="line"><a name="l07726"></a><span class="lineno"> 7726</span>&#160;            m_FreeSuballocationsBySize.data(),</div><div class="line"><a name="l07727"></a><span class="lineno"> 7727</span>&#160;            m_FreeSuballocationsBySize.data() + m_FreeSuballocationsBySize.size(),</div><div class="line"><a name="l07728"></a><span class="lineno"> 7728</span>&#160;            item,</div><div class="line"><a name="l07729"></a><span class="lineno"> 7729</span>&#160;            VmaSuballocationItemSizeLess());</div><div class="line"><a name="l07730"></a><span class="lineno"> 7730</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> index = it - m_FreeSuballocationsBySize.data();</div><div class="line"><a name="l07731"></a><span class="lineno"> 7731</span>&#160;            index &lt; m_FreeSuballocationsBySize.size();</div><div class="line"><a name="l07732"></a><span class="lineno"> 7732</span>&#160;            ++index)</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;            <span class="keywordflow">if</span>(m_FreeSuballocationsBySize[index] == item)</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;                VmaVectorRemove(m_FreeSuballocationsBySize, index);</div><div class="line"><a name="l07737"></a><span class="lineno"> 7737</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l07738"></a><span class="lineno"> 7738</span>&#160;            }</div><div class="line"><a name="l07739"></a><span class="lineno"> 7739</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="l07740"></a><span class="lineno"> 7740</span>&#160;        }</div><div class="line"><a name="l07741"></a><span class="lineno"> 7741</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Not found.&quot;</span>);</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;</div><div class="line"><a name="l07744"></a><span class="lineno"> 7744</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(ValidateFreeSuballocationList());</span></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;</div><div class="line"><a name="l07748"></a><span class="lineno"> 7748</span>&#160;<span class="comment">// class VmaBlockMetadata_Linear</span></div><div class="line"><a name="l07749"></a><span class="lineno"> 7749</span>&#160;</div><div class="line"><a name="l07750"></a><span class="lineno"> 7750</span>&#160;VmaBlockMetadata_Linear::VmaBlockMetadata_Linear(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l07751"></a><span class="lineno"> 7751</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l07752"></a><span class="lineno"> 7752</span>&#160;    m_SumFreeSize(0),</div><div class="line"><a name="l07753"></a><span class="lineno"> 7753</span>&#160;    m_Suballocations0(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07754"></a><span class="lineno"> 7754</span>&#160;    m_Suballocations1(VmaStlAllocator&lt;VmaSuballocation&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l07755"></a><span class="lineno"> 7755</span>&#160;    m_1stVectorIndex(0),</div><div class="line"><a name="l07756"></a><span class="lineno"> 7756</span>&#160;    m_2ndVectorMode(SECOND_VECTOR_EMPTY),</div><div class="line"><a name="l07757"></a><span class="lineno"> 7757</span>&#160;    m_1stNullItemsBeginCount(0),</div><div class="line"><a name="l07758"></a><span class="lineno"> 7758</span>&#160;    m_1stNullItemsMiddleCount(0),</div><div class="line"><a name="l07759"></a><span class="lineno"> 7759</span>&#160;    m_2ndNullItemsCount(0)</div><div class="line"><a name="l07760"></a><span class="lineno"> 7760</span>&#160;{</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;</div><div class="line"><a name="l07763"></a><span class="lineno"> 7763</span>&#160;VmaBlockMetadata_Linear::~VmaBlockMetadata_Linear()</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;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Init(VkDeviceSize size)</div><div class="line"><a name="l07768"></a><span class="lineno"> 7768</span>&#160;{</div><div class="line"><a name="l07769"></a><span class="lineno"> 7769</span>&#160;    VmaBlockMetadata::Init(size);</div><div class="line"><a name="l07770"></a><span class="lineno"> 7770</span>&#160;    m_SumFreeSize = size;</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;</div><div class="line"><a name="l07773"></a><span class="lineno"> 7773</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l07774"></a><span class="lineno"> 7774</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07775"></a><span class="lineno"> 7775</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l07776"></a><span class="lineno"> 7776</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</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;    VMA_VALIDATE(suballocations2nd.empty() == (m_2ndVectorMode == SECOND_VECTOR_EMPTY));</div><div class="line"><a name="l07779"></a><span class="lineno"> 7779</span>&#160;    VMA_VALIDATE(!suballocations1st.empty() ||</div><div class="line"><a name="l07780"></a><span class="lineno"> 7780</span>&#160;        suballocations2nd.empty() ||</div><div class="line"><a name="l07781"></a><span class="lineno"> 7781</span>&#160;        m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER);</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;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div><div class="line"><a name="l07784"></a><span class="lineno"> 7784</span>&#160;    {</div><div class="line"><a name="l07785"></a><span class="lineno"> 7785</span>&#160;        <span class="comment">// Null item at the beginning should be accounted into m_1stNullItemsBeginCount.</span></div><div class="line"><a name="l07786"></a><span class="lineno"> 7786</span>&#160;        VMA_VALIDATE(suballocations1st[m_1stNullItemsBeginCount].hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07787"></a><span class="lineno"> 7787</span>&#160;        <span class="comment">// Null item at the end should be just pop_back().</span></div><div class="line"><a name="l07788"></a><span class="lineno"> 7788</span>&#160;        VMA_VALIDATE(suballocations1st.back().hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l07789"></a><span class="lineno"> 7789</span>&#160;    }</div><div class="line"><a name="l07790"></a><span class="lineno"> 7790</span>&#160;    <span class="keywordflow">if</span>(!suballocations2nd.empty())</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;        <span class="comment">// Null item at the end should be just pop_back().</span></div><div class="line"><a name="l07793"></a><span class="lineno"> 7793</span>&#160;        VMA_VALIDATE(suballocations2nd.back().hAllocation != VK_NULL_HANDLE);</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;</div><div class="line"><a name="l07796"></a><span class="lineno"> 7796</span>&#160;    VMA_VALIDATE(m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount &lt;= suballocations1st.size());</div><div class="line"><a name="l07797"></a><span class="lineno"> 7797</span>&#160;    VMA_VALIDATE(m_2ndNullItemsCount &lt;= suballocations2nd.size());</div><div class="line"><a name="l07798"></a><span class="lineno"> 7798</span>&#160;</div><div class="line"><a name="l07799"></a><span class="lineno"> 7799</span>&#160;    VkDeviceSize sumUsedSize = 0;</div><div class="line"><a name="l07800"></a><span class="lineno"> 7800</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l07801"></a><span class="lineno"> 7801</span>&#160;    VkDeviceSize offset = VMA_DEBUG_MARGIN;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l07804"></a><span class="lineno"> 7804</span>&#160;    {</div><div class="line"><a name="l07805"></a><span class="lineno"> 7805</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l07806"></a><span class="lineno"> 7806</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div><div class="line"><a name="l07807"></a><span class="lineno"> 7807</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; suballoc2ndCount; ++i)</div><div class="line"><a name="l07808"></a><span class="lineno"> 7808</span>&#160;        {</div><div class="line"><a name="l07809"></a><span class="lineno"> 7809</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l07810"></a><span class="lineno"> 7810</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="l07811"></a><span class="lineno"> 7811</span>&#160;</div><div class="line"><a name="l07812"></a><span class="lineno"> 7812</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l07813"></a><span class="lineno"> 7813</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</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;            <span class="keywordflow">if</span>(!currFree)</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;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l07818"></a><span class="lineno"> 7818</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l07819"></a><span class="lineno"> 7819</span>&#160;                sumUsedSize += suballoc.size;</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">else</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;                ++nullItem2ndCount;</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;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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;</div><div class="line"><a name="l07829"></a><span class="lineno"> 7829</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</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;</div><div class="line"><a name="l07832"></a><span class="lineno"> 7832</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; m_1stNullItemsBeginCount; ++i)</div><div class="line"><a name="l07833"></a><span class="lineno"> 7833</span>&#160;    {</div><div class="line"><a name="l07834"></a><span class="lineno"> 7834</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l07835"></a><span class="lineno"> 7835</span>&#160;        VMA_VALIDATE(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l07836"></a><span class="lineno"> 7836</span>&#160;            suballoc.hAllocation == VK_NULL_HANDLE);</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;</div><div class="line"><a name="l07839"></a><span class="lineno"> 7839</span>&#160;    <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount;</div><div class="line"><a name="l07840"></a><span class="lineno"> 7840</span>&#160;</div><div class="line"><a name="l07841"></a><span class="lineno"> 7841</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount; i &lt; suballoc1stCount; ++i)</div><div class="line"><a name="l07842"></a><span class="lineno"> 7842</span>&#160;    {</div><div class="line"><a name="l07843"></a><span class="lineno"> 7843</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l07844"></a><span class="lineno"> 7844</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="l07845"></a><span class="lineno"> 7845</span>&#160;</div><div class="line"><a name="l07846"></a><span class="lineno"> 7846</span>&#160;        VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l07847"></a><span class="lineno"> 7847</span>&#160;        VMA_VALIDATE(suballoc.offset &gt;= offset);</div><div class="line"><a name="l07848"></a><span class="lineno"> 7848</span>&#160;        VMA_VALIDATE(i &gt;= m_1stNullItemsBeginCount || currFree);</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="keywordflow">if</span>(!currFree)</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;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l07853"></a><span class="lineno"> 7853</span>&#160;            VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l07854"></a><span class="lineno"> 7854</span>&#160;            sumUsedSize += suballoc.size;</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">else</span></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;            ++nullItem1stCount;</div><div class="line"><a name="l07859"></a><span class="lineno"> 7859</span>&#160;        }</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;        offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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;    VMA_VALIDATE(nullItem1stCount == m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount);</div><div class="line"><a name="l07864"></a><span class="lineno"> 7864</span>&#160;</div><div class="line"><a name="l07865"></a><span class="lineno"> 7865</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</div><div class="line"><a name="l07868"></a><span class="lineno"> 7868</span>&#160;        <span class="keywordtype">size_t</span> nullItem2ndCount = 0;</div><div class="line"><a name="l07869"></a><span class="lineno"> 7869</span>&#160;        <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = suballoc2ndCount; i--; )</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="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l07872"></a><span class="lineno"> 7872</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="l07873"></a><span class="lineno"> 7873</span>&#160;</div><div class="line"><a name="l07874"></a><span class="lineno"> 7874</span>&#160;            VMA_VALIDATE(currFree == (suballoc.hAllocation == VK_NULL_HANDLE));</div><div class="line"><a name="l07875"></a><span class="lineno"> 7875</span>&#160;            VMA_VALIDATE(suballoc.offset &gt;= offset);</div><div class="line"><a name="l07876"></a><span class="lineno"> 7876</span>&#160;</div><div class="line"><a name="l07877"></a><span class="lineno"> 7877</span>&#160;            <span class="keywordflow">if</span>(!currFree)</div><div class="line"><a name="l07878"></a><span class="lineno"> 7878</span>&#160;            {</div><div class="line"><a name="l07879"></a><span class="lineno"> 7879</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetOffset() == suballoc.offset);</div><div class="line"><a name="l07880"></a><span class="lineno"> 7880</span>&#160;                VMA_VALIDATE(suballoc.hAllocation-&gt;GetSize() == suballoc.size);</div><div class="line"><a name="l07881"></a><span class="lineno"> 7881</span>&#160;                sumUsedSize += suballoc.size;</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="keywordflow">else</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;                ++nullItem2ndCount;</div><div class="line"><a name="l07886"></a><span class="lineno"> 7886</span>&#160;            }</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;            offset = suballoc.offset + suballoc.size + VMA_DEBUG_MARGIN;</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;</div><div class="line"><a name="l07891"></a><span class="lineno"> 7891</span>&#160;        VMA_VALIDATE(nullItem2ndCount == m_2ndNullItemsCount);</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;    VMA_VALIDATE(offset &lt;= GetSize());</div><div class="line"><a name="l07895"></a><span class="lineno"> 7895</span>&#160;    VMA_VALIDATE(m_SumFreeSize == GetSize() - sumUsedSize);</div><div class="line"><a name="l07896"></a><span class="lineno"> 7896</span>&#160;</div><div class="line"><a name="l07897"></a><span class="lineno"> 7897</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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">size_t</span> VmaBlockMetadata_Linear::GetAllocationCount()<span class="keyword"> const</span></div><div class="line"><a name="l07901"></a><span class="lineno"> 7901</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07902"></a><span class="lineno"> 7902</span>&#160;    <span class="keywordflow">return</span> AccessSuballocations1st().size() - (m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount) +</div><div class="line"><a name="l07903"></a><span class="lineno"> 7903</span>&#160;        AccessSuballocations2nd().size() - m_2ndNullItemsCount;</div><div class="line"><a name="l07904"></a><span class="lineno"> 7904</span>&#160;}</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;VkDeviceSize VmaBlockMetadata_Linear::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l07907"></a><span class="lineno"> 7907</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07908"></a><span class="lineno"> 7908</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l07909"></a><span class="lineno"> 7909</span>&#160;</div><div class="line"><a name="l07910"></a><span class="lineno"> 7910</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l07911"></a><span class="lineno"> 7911</span>&#160;<span class="comment">    We don&#39;t consider gaps inside allocation vectors with freed allocations because</span></div><div class="line"><a name="l07912"></a><span class="lineno"> 7912</span>&#160;<span class="comment">    they are not suitable for reuse in linear allocator. We consider only space that</span></div><div class="line"><a name="l07913"></a><span class="lineno"> 7913</span>&#160;<span class="comment">    is available for new allocations.</span></div><div class="line"><a name="l07914"></a><span class="lineno"> 7914</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l07915"></a><span class="lineno"> 7915</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</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">return</span> size;</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;    </div><div class="line"><a name="l07920"></a><span class="lineno"> 7920</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</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">switch</span>(m_2ndVectorMode)</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">case</span> SECOND_VECTOR_EMPTY:</div><div class="line"><a name="l07925"></a><span class="lineno"> 7925</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l07926"></a><span class="lineno"> 7926</span>&#160;<span class="comment">        Available space is after end of 1st, as well as before beginning of 1st (which</span></div><div class="line"><a name="l07927"></a><span class="lineno"> 7927</span>&#160;<span class="comment">        whould make it a ring buffer).</span></div><div class="line"><a name="l07928"></a><span class="lineno"> 7928</span>&#160;<span class="comment">        */</span></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="keyword">const</span> <span class="keywordtype">size_t</span> suballocations1stCount = suballocations1st.size();</div><div class="line"><a name="l07931"></a><span class="lineno"> 7931</span>&#160;            VMA_ASSERT(suballocations1stCount &gt; m_1stNullItemsBeginCount);</div><div class="line"><a name="l07932"></a><span class="lineno"> 7932</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l07933"></a><span class="lineno"> 7933</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc  = suballocations1st[suballocations1stCount - 1];</div><div class="line"><a name="l07934"></a><span class="lineno"> 7934</span>&#160;            <span class="keywordflow">return</span> VMA_MAX(</div><div class="line"><a name="l07935"></a><span class="lineno"> 7935</span>&#160;                firstSuballoc.offset,</div><div class="line"><a name="l07936"></a><span class="lineno"> 7936</span>&#160;                size - (lastSuballoc.offset + lastSuballoc.size));</div><div class="line"><a name="l07937"></a><span class="lineno"> 7937</span>&#160;        }</div><div class="line"><a name="l07938"></a><span class="lineno"> 7938</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l07939"></a><span class="lineno"> 7939</span>&#160;</div><div class="line"><a name="l07940"></a><span class="lineno"> 7940</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div><div class="line"><a name="l07941"></a><span class="lineno"> 7941</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l07942"></a><span class="lineno"> 7942</span>&#160;<span class="comment">        Available space is only between end of 2nd and beginning of 1st.</span></div><div class="line"><a name="l07943"></a><span class="lineno"> 7943</span>&#160;<span class="comment">        */</span></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;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l07946"></a><span class="lineno"> 7946</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc2nd = suballocations2nd.back();</div><div class="line"><a name="l07947"></a><span class="lineno"> 7947</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; firstSuballoc1st = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l07948"></a><span class="lineno"> 7948</span>&#160;            <span class="keywordflow">return</span> firstSuballoc1st.offset - (lastSuballoc2nd.offset + lastSuballoc2nd.size);</div><div class="line"><a name="l07949"></a><span class="lineno"> 7949</span>&#160;        }</div><div class="line"><a name="l07950"></a><span class="lineno"> 7950</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l07951"></a><span class="lineno"> 7951</span>&#160;</div><div class="line"><a name="l07952"></a><span class="lineno"> 7952</span>&#160;    <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div><div class="line"><a name="l07953"></a><span class="lineno"> 7953</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l07954"></a><span class="lineno"> 7954</span>&#160;<span class="comment">        Available space is only between end of 1st and top of 2nd.</span></div><div class="line"><a name="l07955"></a><span class="lineno"> 7955</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l07956"></a><span class="lineno"> 7956</span>&#160;        {</div><div class="line"><a name="l07957"></a><span class="lineno"> 7957</span>&#160;            <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l07958"></a><span class="lineno"> 7958</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; topSuballoc2nd = suballocations2nd.back();</div><div class="line"><a name="l07959"></a><span class="lineno"> 7959</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc1st = suballocations1st.back();</div><div class="line"><a name="l07960"></a><span class="lineno"> 7960</span>&#160;            <span class="keywordflow">return</span> topSuballoc2nd.offset - (lastSuballoc1st.offset + lastSuballoc1st.size);</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;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l07963"></a><span class="lineno"> 7963</span>&#160;</div><div class="line"><a name="l07964"></a><span class="lineno"> 7964</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l07965"></a><span class="lineno"> 7965</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l07966"></a><span class="lineno"> 7966</span>&#160;        <span class="keywordflow">return</span> 0;</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;}</div><div class="line"><a name="l07969"></a><span class="lineno"> 7969</span>&#160;</div><div class="line"><a name="l07970"></a><span class="lineno"> 7970</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::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="l07971"></a><span class="lineno"> 7971</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l07972"></a><span class="lineno"> 7972</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l07973"></a><span class="lineno"> 7973</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l07974"></a><span class="lineno"> 7974</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l07975"></a><span class="lineno"> 7975</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l07976"></a><span class="lineno"> 7976</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l07979"></a><span class="lineno"> 7979</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = (uint32_t)GetAllocationCount();</div><div class="line"><a name="l07980"></a><span class="lineno"> 7980</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l07981"></a><span class="lineno"> 7981</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = 0;</div><div class="line"><a name="l07982"></a><span class="lineno"> 7982</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l07983"></a><span class="lineno"> 7983</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = 0;</div><div class="line"><a name="l07984"></a><span class="lineno"> 7984</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l07985"></a><span class="lineno"> 7985</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</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;    VkDeviceSize lastOffset = 0;</div><div class="line"><a name="l07988"></a><span class="lineno"> 7988</span>&#160;</div><div class="line"><a name="l07989"></a><span class="lineno"> 7989</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l07990"></a><span class="lineno"> 7990</span>&#160;    {</div><div class="line"><a name="l07991"></a><span class="lineno"> 7991</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l07992"></a><span class="lineno"> 7992</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l07993"></a><span class="lineno"> 7993</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l07996"></a><span class="lineno"> 7996</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l07997"></a><span class="lineno"> 7997</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08002"></a><span class="lineno"> 8002</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08003"></a><span class="lineno"> 8003</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08008"></a><span class="lineno"> 8008</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08011"></a><span class="lineno"> 8011</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08012"></a><span class="lineno"> 8012</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08013"></a><span class="lineno"> 8013</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08014"></a><span class="lineno"> 8014</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>, unusedRangeSize);</div><div class="line"><a name="l08015"></a><span class="lineno"> 8015</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</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;            </div><div class="line"><a name="l08018"></a><span class="lineno"> 8018</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08019"></a><span class="lineno"> 8019</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08020"></a><span class="lineno"> 8020</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l08021"></a><span class="lineno"> 8021</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="l08022"></a><span class="lineno"> 8022</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</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="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08025"></a><span class="lineno"> 8025</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08026"></a><span class="lineno"> 8026</span>&#160;                ++nextAlloc2ndIndex;</div><div class="line"><a name="l08027"></a><span class="lineno"> 8027</span>&#160;            }</div><div class="line"><a name="l08028"></a><span class="lineno"> 8028</span>&#160;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08029"></a><span class="lineno"> 8029</span>&#160;            <span class="keywordflow">else</span></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;                <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l08032"></a><span class="lineno"> 8032</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l08035"></a><span class="lineno"> 8035</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08036"></a><span class="lineno"> 8036</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08037"></a><span class="lineno"> 8037</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>, unusedRangeSize);</div><div class="line"><a name="l08038"></a><span class="lineno"> 8038</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div><div class="line"><a name="l08039"></a><span class="lineno"> 8039</span>&#160;               }</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;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08042"></a><span class="lineno"> 8042</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div><div class="line"><a name="l08043"></a><span class="lineno"> 8043</span>&#160;            }</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;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08048"></a><span class="lineno"> 8048</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l08049"></a><span class="lineno"> 8049</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l08050"></a><span class="lineno"> 8050</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div><div class="line"><a name="l08051"></a><span class="lineno"> 8051</span>&#160;    {</div><div class="line"><a name="l08052"></a><span class="lineno"> 8052</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08053"></a><span class="lineno"> 8053</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l08054"></a><span class="lineno"> 8054</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</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">// Found non-null allocation.</span></div><div class="line"><a name="l08060"></a><span class="lineno"> 8060</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</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;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08065"></a><span class="lineno"> 8065</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08068"></a><span class="lineno"> 8068</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08069"></a><span class="lineno"> 8069</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08070"></a><span class="lineno"> 8070</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08071"></a><span class="lineno"> 8071</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>, unusedRangeSize);</div><div class="line"><a name="l08072"></a><span class="lineno"> 8072</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</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;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08076"></a><span class="lineno"> 8076</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08077"></a><span class="lineno"> 8077</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l08078"></a><span class="lineno"> 8078</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="l08079"></a><span class="lineno"> 8079</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</div><div class="line"><a name="l08080"></a><span class="lineno"> 8080</span>&#160;            </div><div class="line"><a name="l08081"></a><span class="lineno"> 8081</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08082"></a><span class="lineno"> 8082</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08083"></a><span class="lineno"> 8083</span>&#160;            ++nextAlloc1stIndex;</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">// We are at the end.</span></div><div class="line"><a name="l08086"></a><span class="lineno"> 8086</span>&#160;        <span class="keywordflow">else</span></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;            <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l08089"></a><span class="lineno"> 8089</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l08092"></a><span class="lineno"> 8092</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08093"></a><span class="lineno"> 8093</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08094"></a><span class="lineno"> 8094</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>, unusedRangeSize);</div><div class="line"><a name="l08095"></a><span class="lineno"> 8095</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div><div class="line"><a name="l08096"></a><span class="lineno"> 8096</span>&#160;           }</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;            <span class="comment">// End of loop.</span></div><div class="line"><a name="l08099"></a><span class="lineno"> 8099</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div><div class="line"><a name="l08100"></a><span class="lineno"> 8100</span>&#160;        }</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>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l08106"></a><span class="lineno"> 8106</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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;            <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08109"></a><span class="lineno"> 8109</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l08110"></a><span class="lineno"> 8110</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08111"></a><span class="lineno"> 8111</span>&#160;            {</div><div class="line"><a name="l08112"></a><span class="lineno"> 8112</span>&#160;                --nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08115"></a><span class="lineno"> 8115</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08116"></a><span class="lineno"> 8116</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08121"></a><span class="lineno"> 8121</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08124"></a><span class="lineno"> 8124</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08125"></a><span class="lineno"> 8125</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08126"></a><span class="lineno"> 8126</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08127"></a><span class="lineno"> 8127</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>, unusedRangeSize);</div><div class="line"><a name="l08128"></a><span class="lineno"> 8128</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</div><div class="line"><a name="l08129"></a><span class="lineno"> 8129</span>&#160;                }</div><div class="line"><a name="l08130"></a><span class="lineno"> 8130</span>&#160;            </div><div class="line"><a name="l08131"></a><span class="lineno"> 8131</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08132"></a><span class="lineno"> 8132</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08133"></a><span class="lineno"> 8133</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += suballoc.size;</div><div class="line"><a name="l08134"></a><span class="lineno"> 8134</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="l08135"></a><span class="lineno"> 8135</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a>, suballoc.size);</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="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08138"></a><span class="lineno"> 8138</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08139"></a><span class="lineno"> 8139</span>&#160;                --nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08142"></a><span class="lineno"> 8142</span>&#160;            <span class="keywordflow">else</span></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="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l08145"></a><span class="lineno"> 8145</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</div><div class="line"><a name="l08146"></a><span class="lineno"> 8146</span>&#160;                {</div><div class="line"><a name="l08147"></a><span class="lineno"> 8147</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l08148"></a><span class="lineno"> 8148</span>&#160;                    ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l08149"></a><span class="lineno"> 8149</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l08150"></a><span class="lineno"> 8150</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>, unusedRangeSize);</div><div class="line"><a name="l08151"></a><span class="lineno"> 8151</span>&#160;                    outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = VMA_MIN(outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a>, unusedRangeSize);</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;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08155"></a><span class="lineno"> 8155</span>&#160;                lastOffset = size;</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;        }</div><div class="line"><a name="l08158"></a><span class="lineno"> 8158</span>&#160;    }</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;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = size - outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a>;</div><div class="line"><a name="l08161"></a><span class="lineno"> 8161</span>&#160;}</div><div class="line"><a name="l08162"></a><span class="lineno"> 8162</span>&#160;</div><div class="line"><a name="l08163"></a><span class="lineno"> 8163</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::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="l08164"></a><span class="lineno"> 8164</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08165"></a><span class="lineno"> 8165</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l08166"></a><span class="lineno"> 8166</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08167"></a><span class="lineno"> 8167</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l08168"></a><span class="lineno"> 8168</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l08169"></a><span class="lineno"> 8169</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</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;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += size;</div><div class="line"><a name="l08172"></a><span class="lineno"> 8172</span>&#160;</div><div class="line"><a name="l08173"></a><span class="lineno"> 8173</span>&#160;    VkDeviceSize lastOffset = 0;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l08178"></a><span class="lineno"> 8178</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08179"></a><span class="lineno"> 8179</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08182"></a><span class="lineno"> 8182</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l08183"></a><span class="lineno"> 8183</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08188"></a><span class="lineno"> 8188</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08189"></a><span class="lineno"> 8189</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08194"></a><span class="lineno"> 8194</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08195"></a><span class="lineno"> 8195</span>&#160;                {</div><div class="line"><a name="l08196"></a><span class="lineno"> 8196</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08197"></a><span class="lineno"> 8197</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08198"></a><span class="lineno"> 8198</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08199"></a><span class="lineno"> 8199</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08200"></a><span class="lineno"> 8200</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>, unusedRangeSize);</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="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08204"></a><span class="lineno"> 8204</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08205"></a><span class="lineno"> 8205</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08208"></a><span class="lineno"> 8208</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08209"></a><span class="lineno"> 8209</span>&#160;                ++nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08212"></a><span class="lineno"> 8212</span>&#160;            <span class="keywordflow">else</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;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08215"></a><span class="lineno"> 8215</span>&#160;                {</div><div class="line"><a name="l08216"></a><span class="lineno"> 8216</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l08217"></a><span class="lineno"> 8217</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l08218"></a><span class="lineno"> 8218</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08219"></a><span class="lineno"> 8219</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08220"></a><span class="lineno"> 8220</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>, unusedRangeSize);</div><div class="line"><a name="l08221"></a><span class="lineno"> 8221</span>&#160;                }</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">// End of loop.</span></div><div class="line"><a name="l08224"></a><span class="lineno"> 8224</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</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;        }</div><div class="line"><a name="l08227"></a><span class="lineno"> 8227</span>&#160;    }</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;    <span class="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08230"></a><span class="lineno"> 8230</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l08231"></a><span class="lineno"> 8231</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l08232"></a><span class="lineno"> 8232</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08235"></a><span class="lineno"> 8235</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l08236"></a><span class="lineno"> 8236</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</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;</div><div class="line"><a name="l08241"></a><span class="lineno"> 8241</span>&#160;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08242"></a><span class="lineno"> 8242</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div><div class="line"><a name="l08243"></a><span class="lineno"> 8243</span>&#160;        {</div><div class="line"><a name="l08244"></a><span class="lineno"> 8244</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</div><div class="line"><a name="l08245"></a><span class="lineno"> 8245</span>&#160;            </div><div class="line"><a name="l08246"></a><span class="lineno"> 8246</span>&#160;            <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08247"></a><span class="lineno"> 8247</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08248"></a><span class="lineno"> 8248</span>&#160;            {</div><div class="line"><a name="l08249"></a><span class="lineno"> 8249</span>&#160;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08250"></a><span class="lineno"> 8250</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08251"></a><span class="lineno"> 8251</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08252"></a><span class="lineno"> 8252</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08253"></a><span class="lineno"> 8253</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>, unusedRangeSize);</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;            </div><div class="line"><a name="l08256"></a><span class="lineno"> 8256</span>&#160;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08257"></a><span class="lineno"> 8257</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08258"></a><span class="lineno"> 8258</span>&#160;            ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08261"></a><span class="lineno"> 8261</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08262"></a><span class="lineno"> 8262</span>&#160;            ++nextAlloc1stIndex;</div><div class="line"><a name="l08263"></a><span class="lineno"> 8263</span>&#160;        }</div><div class="line"><a name="l08264"></a><span class="lineno"> 8264</span>&#160;        <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08265"></a><span class="lineno"> 8265</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08266"></a><span class="lineno"> 8266</span>&#160;        {</div><div class="line"><a name="l08267"></a><span class="lineno"> 8267</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l08270"></a><span class="lineno"> 8270</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l08271"></a><span class="lineno"> 8271</span>&#160;                inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08272"></a><span class="lineno"> 8272</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08273"></a><span class="lineno"> 8273</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>, unusedRangeSize);</div><div class="line"><a name="l08274"></a><span class="lineno"> 8274</span>&#160;            }</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;            <span class="comment">// End of loop.</span></div><div class="line"><a name="l08277"></a><span class="lineno"> 8277</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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;    }</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l08284"></a><span class="lineno"> 8284</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08287"></a><span class="lineno"> 8287</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l08288"></a><span class="lineno"> 8288</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                --nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08293"></a><span class="lineno"> 8293</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08294"></a><span class="lineno"> 8294</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08299"></a><span class="lineno"> 8299</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08302"></a><span class="lineno"> 8302</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08303"></a><span class="lineno"> 8303</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08304"></a><span class="lineno"> 8304</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08305"></a><span class="lineno"> 8305</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>, unusedRangeSize);</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;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08309"></a><span class="lineno"> 8309</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08310"></a><span class="lineno"> 8310</span>&#160;                ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a>;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08313"></a><span class="lineno"> 8313</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08314"></a><span class="lineno"> 8314</span>&#160;                --nextAlloc2ndIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l08317"></a><span class="lineno"> 8317</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08318"></a><span class="lineno"> 8318</span>&#160;            {</div><div class="line"><a name="l08319"></a><span class="lineno"> 8319</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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;                    <span class="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l08322"></a><span class="lineno"> 8322</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l08323"></a><span class="lineno"> 8323</span>&#160;                    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += unusedRangeSize;</div><div class="line"><a name="l08324"></a><span class="lineno"> 8324</span>&#160;                    ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l08325"></a><span class="lineno"> 8325</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>, unusedRangeSize);</div><div class="line"><a name="l08326"></a><span class="lineno"> 8326</span>&#160;                }</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="comment">// End of loop.</span></div><div class="line"><a name="l08329"></a><span class="lineno"> 8329</span>&#160;                lastOffset = size;</div><div class="line"><a name="l08330"></a><span class="lineno"> 8330</span>&#160;            }</div><div class="line"><a name="l08331"></a><span class="lineno"> 8331</span>&#160;        }</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;</div><div class="line"><a name="l08335"></a><span class="lineno"> 8335</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08336"></a><span class="lineno"> 8336</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l08337"></a><span class="lineno"> 8337</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l08338"></a><span class="lineno"> 8338</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l08339"></a><span class="lineno"> 8339</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l08340"></a><span class="lineno"> 8340</span>&#160;    <span class="keyword">const</span> SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l08341"></a><span class="lineno"> 8341</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l08342"></a><span class="lineno"> 8342</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc2ndCount = suballocations2nd.size();</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;    <span class="comment">// FIRST PASS</span></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="keywordtype">size_t</span> unusedRangeCount = 0;</div><div class="line"><a name="l08347"></a><span class="lineno"> 8347</span>&#160;    VkDeviceSize usedBytes = 0;</div><div class="line"><a name="l08348"></a><span class="lineno"> 8348</span>&#160;</div><div class="line"><a name="l08349"></a><span class="lineno"> 8349</span>&#160;    VkDeviceSize lastOffset = 0;</div><div class="line"><a name="l08350"></a><span class="lineno"> 8350</span>&#160;</div><div class="line"><a name="l08351"></a><span class="lineno"> 8351</span>&#160;    <span class="keywordtype">size_t</span> alloc2ndCount = 0;</div><div class="line"><a name="l08352"></a><span class="lineno"> 8352</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l08353"></a><span class="lineno"> 8353</span>&#160;    {</div><div class="line"><a name="l08354"></a><span class="lineno"> 8354</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l08355"></a><span class="lineno"> 8355</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l08356"></a><span class="lineno"> 8356</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08357"></a><span class="lineno"> 8357</span>&#160;        {</div><div class="line"><a name="l08358"></a><span class="lineno"> 8358</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08359"></a><span class="lineno"> 8359</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l08360"></a><span class="lineno"> 8360</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</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;                ++nextAlloc2ndIndex;</div><div class="line"><a name="l08363"></a><span class="lineno"> 8363</span>&#160;            }</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;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08366"></a><span class="lineno"> 8366</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</div><div class="line"><a name="l08367"></a><span class="lineno"> 8367</span>&#160;            {</div><div class="line"><a name="l08368"></a><span class="lineno"> 8368</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l08369"></a><span class="lineno"> 8369</span>&#160;            </div><div class="line"><a name="l08370"></a><span class="lineno"> 8370</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08371"></a><span class="lineno"> 8371</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08372"></a><span class="lineno"> 8372</span>&#160;                {</div><div class="line"><a name="l08373"></a><span class="lineno"> 8373</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08374"></a><span class="lineno"> 8374</span>&#160;                    ++unusedRangeCount;</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;            </div><div class="line"><a name="l08377"></a><span class="lineno"> 8377</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08378"></a><span class="lineno"> 8378</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08379"></a><span class="lineno"> 8379</span>&#160;                ++alloc2ndCount;</div><div class="line"><a name="l08380"></a><span class="lineno"> 8380</span>&#160;                usedBytes += suballoc.size;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08383"></a><span class="lineno"> 8383</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08384"></a><span class="lineno"> 8384</span>&#160;                ++nextAlloc2ndIndex;</div><div class="line"><a name="l08385"></a><span class="lineno"> 8385</span>&#160;            }</div><div class="line"><a name="l08386"></a><span class="lineno"> 8386</span>&#160;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08387"></a><span class="lineno"> 8387</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08388"></a><span class="lineno"> 8388</span>&#160;            {</div><div class="line"><a name="l08389"></a><span class="lineno"> 8389</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</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;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l08392"></a><span class="lineno"> 8392</span>&#160;                    ++unusedRangeCount;</div><div class="line"><a name="l08393"></a><span class="lineno"> 8393</span>&#160;                }</div><div class="line"><a name="l08394"></a><span class="lineno"> 8394</span>&#160;</div><div class="line"><a name="l08395"></a><span class="lineno"> 8395</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08396"></a><span class="lineno"> 8396</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</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;        }</div><div class="line"><a name="l08399"></a><span class="lineno"> 8399</span>&#160;    }</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="keywordtype">size_t</span> nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08402"></a><span class="lineno"> 8402</span>&#160;    <span class="keywordtype">size_t</span> alloc1stCount = 0;</div><div class="line"><a name="l08403"></a><span class="lineno"> 8403</span>&#160;    <span class="keyword">const</span> VkDeviceSize freeSpace1stTo2ndEnd =</div><div class="line"><a name="l08404"></a><span class="lineno"> 8404</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ? suballocations2nd.back().offset : size;</div><div class="line"><a name="l08405"></a><span class="lineno"> 8405</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08408"></a><span class="lineno"> 8408</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l08409"></a><span class="lineno"> 8409</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</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;            ++nextAlloc1stIndex;</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;</div><div class="line"><a name="l08414"></a><span class="lineno"> 8414</span>&#160;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08415"></a><span class="lineno"> 8415</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div><div class="line"><a name="l08416"></a><span class="lineno"> 8416</span>&#160;        {</div><div class="line"><a name="l08417"></a><span class="lineno"> 8417</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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;            <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08420"></a><span class="lineno"> 8420</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08423"></a><span class="lineno"> 8423</span>&#160;                ++unusedRangeCount;</div><div class="line"><a name="l08424"></a><span class="lineno"> 8424</span>&#160;            }</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;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08427"></a><span class="lineno"> 8427</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08428"></a><span class="lineno"> 8428</span>&#160;            ++alloc1stCount;</div><div class="line"><a name="l08429"></a><span class="lineno"> 8429</span>&#160;            usedBytes += suballoc.size;</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;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08432"></a><span class="lineno"> 8432</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08433"></a><span class="lineno"> 8433</span>&#160;            ++nextAlloc1stIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l08436"></a><span class="lineno"> 8436</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l08437"></a><span class="lineno"> 8437</span>&#160;        {</div><div class="line"><a name="l08438"></a><span class="lineno"> 8438</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; size)</div><div class="line"><a name="l08439"></a><span class="lineno"> 8439</span>&#160;            {</div><div class="line"><a name="l08440"></a><span class="lineno"> 8440</span>&#160;                <span class="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l08441"></a><span class="lineno"> 8441</span>&#160;                ++unusedRangeCount;</div><div class="line"><a name="l08442"></a><span class="lineno"> 8442</span>&#160;            }</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="comment">// End of loop.</span></div><div class="line"><a name="l08445"></a><span class="lineno"> 8445</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</div><div class="line"><a name="l08446"></a><span class="lineno"> 8446</span>&#160;        }</div><div class="line"><a name="l08447"></a><span class="lineno"> 8447</span>&#160;    }</div><div class="line"><a name="l08448"></a><span class="lineno"> 8448</span>&#160;</div><div class="line"><a name="l08449"></a><span class="lineno"> 8449</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l08452"></a><span class="lineno"> 8452</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08455"></a><span class="lineno"> 8455</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l08456"></a><span class="lineno"> 8456</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08457"></a><span class="lineno"> 8457</span>&#160;            {</div><div class="line"><a name="l08458"></a><span class="lineno"> 8458</span>&#160;                --nextAlloc2ndIndex;</div><div class="line"><a name="l08459"></a><span class="lineno"> 8459</span>&#160;            }</div><div class="line"><a name="l08460"></a><span class="lineno"> 8460</span>&#160;</div><div class="line"><a name="l08461"></a><span class="lineno"> 8461</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08462"></a><span class="lineno"> 8462</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</div><div class="line"><a name="l08463"></a><span class="lineno"> 8463</span>&#160;            {</div><div class="line"><a name="l08464"></a><span class="lineno"> 8464</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l08465"></a><span class="lineno"> 8465</span>&#160;            </div><div class="line"><a name="l08466"></a><span class="lineno"> 8466</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08467"></a><span class="lineno"> 8467</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08468"></a><span class="lineno"> 8468</span>&#160;                {</div><div class="line"><a name="l08469"></a><span class="lineno"> 8469</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08470"></a><span class="lineno"> 8470</span>&#160;                    ++unusedRangeCount;</div><div class="line"><a name="l08471"></a><span class="lineno"> 8471</span>&#160;                }</div><div class="line"><a name="l08472"></a><span class="lineno"> 8472</span>&#160;            </div><div class="line"><a name="l08473"></a><span class="lineno"> 8473</span>&#160;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08474"></a><span class="lineno"> 8474</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08475"></a><span class="lineno"> 8475</span>&#160;                ++alloc2ndCount;</div><div class="line"><a name="l08476"></a><span class="lineno"> 8476</span>&#160;                usedBytes += suballoc.size;</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08479"></a><span class="lineno"> 8479</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08480"></a><span class="lineno"> 8480</span>&#160;                --nextAlloc2ndIndex;</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;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08483"></a><span class="lineno"> 8483</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08484"></a><span class="lineno"> 8484</span>&#160;            {</div><div class="line"><a name="l08485"></a><span class="lineno"> 8485</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; size)</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="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l08488"></a><span class="lineno"> 8488</span>&#160;                    ++unusedRangeCount;</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;</div><div class="line"><a name="l08491"></a><span class="lineno"> 8491</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08492"></a><span class="lineno"> 8492</span>&#160;                lastOffset = size;</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;</div><div class="line"><a name="l08497"></a><span class="lineno"> 8497</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusedBytes = size - usedBytes;</div><div class="line"><a name="l08498"></a><span class="lineno"> 8498</span>&#160;    PrintDetailedMap_Begin(json, unusedBytes, alloc1stCount + alloc2ndCount, unusedRangeCount);</div><div class="line"><a name="l08499"></a><span class="lineno"> 8499</span>&#160;</div><div class="line"><a name="l08500"></a><span class="lineno"> 8500</span>&#160;    <span class="comment">// SECOND PASS</span></div><div class="line"><a name="l08501"></a><span class="lineno"> 8501</span>&#160;    lastOffset = 0;</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;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l08504"></a><span class="lineno"> 8504</span>&#160;    {</div><div class="line"><a name="l08505"></a><span class="lineno"> 8505</span>&#160;        <span class="keyword">const</span> VkDeviceSize freeSpace2ndTo1stEnd = suballocations1st[m_1stNullItemsBeginCount].offset;</div><div class="line"><a name="l08506"></a><span class="lineno"> 8506</span>&#160;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = 0;</div><div class="line"><a name="l08507"></a><span class="lineno"> 8507</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08508"></a><span class="lineno"> 8508</span>&#160;        {</div><div class="line"><a name="l08509"></a><span class="lineno"> 8509</span>&#160;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08510"></a><span class="lineno"> 8510</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex &lt; suballoc2ndCount &amp;&amp;</div><div class="line"><a name="l08511"></a><span class="lineno"> 8511</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08512"></a><span class="lineno"> 8512</span>&#160;            {</div><div class="line"><a name="l08513"></a><span class="lineno"> 8513</span>&#160;                ++nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08516"></a><span class="lineno"> 8516</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08517"></a><span class="lineno"> 8517</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex &lt; suballoc2ndCount)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</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;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08522"></a><span class="lineno"> 8522</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</div><div class="line"><a name="l08523"></a><span class="lineno"> 8523</span>&#160;                {</div><div class="line"><a name="l08524"></a><span class="lineno"> 8524</span>&#160;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08525"></a><span class="lineno"> 8525</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08526"></a><span class="lineno"> 8526</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l08527"></a><span class="lineno"> 8527</span>&#160;                }</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;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08530"></a><span class="lineno"> 8530</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08531"></a><span class="lineno"> 8531</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08534"></a><span class="lineno"> 8534</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08535"></a><span class="lineno"> 8535</span>&#160;                ++nextAlloc2ndIndex;</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="comment">// We are at the end.</span></div><div class="line"><a name="l08538"></a><span class="lineno"> 8538</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l08539"></a><span class="lineno"> 8539</span>&#160;            {</div><div class="line"><a name="l08540"></a><span class="lineno"> 8540</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; freeSpace2ndTo1stEnd)</div><div class="line"><a name="l08541"></a><span class="lineno"> 8541</span>&#160;                {</div><div class="line"><a name="l08542"></a><span class="lineno"> 8542</span>&#160;                    <span class="comment">// There is free space from lastOffset to freeSpace2ndTo1stEnd.</span></div><div class="line"><a name="l08543"></a><span class="lineno"> 8543</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace2ndTo1stEnd - lastOffset;</div><div class="line"><a name="l08544"></a><span class="lineno"> 8544</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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;</div><div class="line"><a name="l08547"></a><span class="lineno"> 8547</span>&#160;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08548"></a><span class="lineno"> 8548</span>&#160;                lastOffset = freeSpace2ndTo1stEnd;</div><div class="line"><a name="l08549"></a><span class="lineno"> 8549</span>&#160;            }</div><div class="line"><a name="l08550"></a><span class="lineno"> 8550</span>&#160;        }</div><div class="line"><a name="l08551"></a><span class="lineno"> 8551</span>&#160;    }</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;    nextAlloc1stIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l08554"></a><span class="lineno"> 8554</span>&#160;    <span class="keywordflow">while</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</div><div class="line"><a name="l08555"></a><span class="lineno"> 8555</span>&#160;    {</div><div class="line"><a name="l08556"></a><span class="lineno"> 8556</span>&#160;        <span class="comment">// Find next non-null allocation or move nextAllocIndex to the end.</span></div><div class="line"><a name="l08557"></a><span class="lineno"> 8557</span>&#160;        <span class="keywordflow">while</span>(nextAlloc1stIndex &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l08558"></a><span class="lineno"> 8558</span>&#160;            suballocations1st[nextAlloc1stIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08559"></a><span class="lineno"> 8559</span>&#160;        {</div><div class="line"><a name="l08560"></a><span class="lineno"> 8560</span>&#160;            ++nextAlloc1stIndex;</div><div class="line"><a name="l08561"></a><span class="lineno"> 8561</span>&#160;        }</div><div class="line"><a name="l08562"></a><span class="lineno"> 8562</span>&#160;</div><div class="line"><a name="l08563"></a><span class="lineno"> 8563</span>&#160;        <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08564"></a><span class="lineno"> 8564</span>&#160;        <span class="keywordflow">if</span>(nextAlloc1stIndex &lt; suballoc1stCount)</div><div class="line"><a name="l08565"></a><span class="lineno"> 8565</span>&#160;        {</div><div class="line"><a name="l08566"></a><span class="lineno"> 8566</span>&#160;            <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[nextAlloc1stIndex];</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;            <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08569"></a><span class="lineno"> 8569</span>&#160;            <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08572"></a><span class="lineno"> 8572</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08573"></a><span class="lineno"> 8573</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l08574"></a><span class="lineno"> 8574</span>&#160;            }</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;            <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08577"></a><span class="lineno"> 8577</span>&#160;            <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08578"></a><span class="lineno"> 8578</span>&#160;            PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</div><div class="line"><a name="l08579"></a><span class="lineno"> 8579</span>&#160;            </div><div class="line"><a name="l08580"></a><span class="lineno"> 8580</span>&#160;            <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08581"></a><span class="lineno"> 8581</span>&#160;            lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08582"></a><span class="lineno"> 8582</span>&#160;            ++nextAlloc1stIndex;</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;        <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08585"></a><span class="lineno"> 8585</span>&#160;        <span class="keywordflow">else</span></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;            <span class="keywordflow">if</span>(lastOffset &lt; freeSpace1stTo2ndEnd)</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="comment">// There is free space from lastOffset to freeSpace1stTo2ndEnd.</span></div><div class="line"><a name="l08590"></a><span class="lineno"> 8590</span>&#160;                <span class="keyword">const</span> VkDeviceSize unusedRangeSize = freeSpace1stTo2ndEnd - lastOffset;</div><div class="line"><a name="l08591"></a><span class="lineno"> 8591</span>&#160;                PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</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;</div><div class="line"><a name="l08594"></a><span class="lineno"> 8594</span>&#160;            <span class="comment">// End of loop.</span></div><div class="line"><a name="l08595"></a><span class="lineno"> 8595</span>&#160;            lastOffset = freeSpace1stTo2ndEnd;</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;    }</div><div class="line"><a name="l08598"></a><span class="lineno"> 8598</span>&#160;</div><div class="line"><a name="l08599"></a><span class="lineno"> 8599</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        <span class="keywordtype">size_t</span> nextAlloc2ndIndex = suballocations2nd.size() - 1;</div><div class="line"><a name="l08602"></a><span class="lineno"> 8602</span>&#160;        <span class="keywordflow">while</span>(lastOffset &lt; size)</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;            <span class="comment">// Find next non-null allocation or move nextAlloc2ndIndex to the end.</span></div><div class="line"><a name="l08605"></a><span class="lineno"> 8605</span>&#160;            <span class="keywordflow">while</span>(nextAlloc2ndIndex != SIZE_MAX &amp;&amp;</div><div class="line"><a name="l08606"></a><span class="lineno"> 8606</span>&#160;                suballocations2nd[nextAlloc2ndIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l08607"></a><span class="lineno"> 8607</span>&#160;            {</div><div class="line"><a name="l08608"></a><span class="lineno"> 8608</span>&#160;                --nextAlloc2ndIndex;</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;</div><div class="line"><a name="l08611"></a><span class="lineno"> 8611</span>&#160;            <span class="comment">// Found non-null allocation.</span></div><div class="line"><a name="l08612"></a><span class="lineno"> 8612</span>&#160;            <span class="keywordflow">if</span>(nextAlloc2ndIndex != SIZE_MAX)</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;                <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[nextAlloc2ndIndex];</div><div class="line"><a name="l08615"></a><span class="lineno"> 8615</span>&#160;            </div><div class="line"><a name="l08616"></a><span class="lineno"> 8616</span>&#160;                <span class="comment">// 1. Process free space before this allocation.</span></div><div class="line"><a name="l08617"></a><span class="lineno"> 8617</span>&#160;                <span class="keywordflow">if</span>(lastOffset &lt; suballoc.offset)</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;                    <span class="comment">// There is free space from lastOffset to suballoc.offset.</span></div><div class="line"><a name="l08620"></a><span class="lineno"> 8620</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = suballoc.offset - lastOffset;</div><div class="line"><a name="l08621"></a><span class="lineno"> 8621</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l08622"></a><span class="lineno"> 8622</span>&#160;                }</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;                <span class="comment">// 2. Process this allocation.</span></div><div class="line"><a name="l08625"></a><span class="lineno"> 8625</span>&#160;                <span class="comment">// There is allocation with suballoc.offset, suballoc.size.</span></div><div class="line"><a name="l08626"></a><span class="lineno"> 8626</span>&#160;                PrintDetailedMap_Allocation(json, suballoc.offset, suballoc.hAllocation);</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;                <span class="comment">// 3. Prepare for next iteration.</span></div><div class="line"><a name="l08629"></a><span class="lineno"> 8629</span>&#160;                lastOffset = suballoc.offset + suballoc.size;</div><div class="line"><a name="l08630"></a><span class="lineno"> 8630</span>&#160;                --nextAlloc2ndIndex;</div><div class="line"><a name="l08631"></a><span class="lineno"> 8631</span>&#160;            }</div><div class="line"><a name="l08632"></a><span class="lineno"> 8632</span>&#160;            <span class="comment">// We are at the end.</span></div><div class="line"><a name="l08633"></a><span class="lineno"> 8633</span>&#160;            <span class="keywordflow">else</span></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>(lastOffset &lt; size)</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;                    <span class="comment">// There is free space from lastOffset to size.</span></div><div class="line"><a name="l08638"></a><span class="lineno"> 8638</span>&#160;                    <span class="keyword">const</span> VkDeviceSize unusedRangeSize = size - lastOffset;</div><div class="line"><a name="l08639"></a><span class="lineno"> 8639</span>&#160;                    PrintDetailedMap_UnusedRange(json, lastOffset, unusedRangeSize);</div><div class="line"><a name="l08640"></a><span class="lineno"> 8640</span>&#160;                }</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;                <span class="comment">// End of loop.</span></div><div class="line"><a name="l08643"></a><span class="lineno"> 8643</span>&#160;                lastOffset = size;</div><div class="line"><a name="l08644"></a><span class="lineno"> 8644</span>&#160;            }</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;    }</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;    PrintDetailedMap_End(json);</div><div class="line"><a name="l08649"></a><span class="lineno"> 8649</span>&#160;}</div><div class="line"><a name="l08650"></a><span class="lineno"> 8650</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l08651"></a><span class="lineno"> 8651</span>&#160;</div><div class="line"><a name="l08652"></a><span class="lineno"> 8652</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::CreateAllocationRequest(</div><div class="line"><a name="l08653"></a><span class="lineno"> 8653</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l08654"></a><span class="lineno"> 8654</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l08655"></a><span class="lineno"> 8655</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l08656"></a><span class="lineno"> 8656</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l08657"></a><span class="lineno"> 8657</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l08658"></a><span class="lineno"> 8658</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l08659"></a><span class="lineno"> 8659</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l08660"></a><span class="lineno"> 8660</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l08661"></a><span class="lineno"> 8661</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l08662"></a><span class="lineno"> 8662</span>&#160;    VmaAllocationRequest* pAllocationRequest)</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;    VMA_ASSERT(allocSize &gt; 0);</div><div class="line"><a name="l08665"></a><span class="lineno"> 8665</span>&#160;    VMA_ASSERT(allocType != VMA_SUBALLOCATION_TYPE_FREE);</div><div class="line"><a name="l08666"></a><span class="lineno"> 8666</span>&#160;    VMA_ASSERT(pAllocationRequest != VMA_NULL);</div><div class="line"><a name="l08667"></a><span class="lineno"> 8667</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l08668"></a><span class="lineno"> 8668</span>&#160;</div><div class="line"><a name="l08669"></a><span class="lineno"> 8669</span>&#160;    <span class="keyword">const</span> VkDeviceSize size = GetSize();</div><div class="line"><a name="l08670"></a><span class="lineno"> 8670</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l08671"></a><span class="lineno"> 8671</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</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;    <span class="keywordflow">if</span>(upperAddress)</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>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Trying to use pool with linear algorithm as double stack, while it is already being used as ring buffer.&quot;</span>);</div><div class="line"><a name="l08678"></a><span class="lineno"> 8678</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="comment">// Try to allocate before 2nd.back(), or end of block if 2nd.empty().</span></div><div class="line"><a name="l08682"></a><span class="lineno"> 8682</span>&#160;        <span class="keywordflow">if</span>(allocSize &gt; size)</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;            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        VkDeviceSize resultBaseOffset = size - allocSize;</div><div class="line"><a name="l08687"></a><span class="lineno"> 8687</span>&#160;        <span class="keywordflow">if</span>(!suballocations2nd.empty())</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;            <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l08690"></a><span class="lineno"> 8690</span>&#160;            resultBaseOffset = lastSuballoc.offset - allocSize;</div><div class="line"><a name="l08691"></a><span class="lineno"> 8691</span>&#160;            <span class="keywordflow">if</span>(allocSize &gt; lastSuballoc.offset)</div><div class="line"><a name="l08692"></a><span class="lineno"> 8692</span>&#160;            {</div><div class="line"><a name="l08693"></a><span class="lineno"> 8693</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;        }</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;        <span class="comment">// Start from offset equal to end of free space.</span></div><div class="line"><a name="l08698"></a><span class="lineno"> 8698</span>&#160;        VkDeviceSize resultOffset = resultBaseOffset;</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;        <span class="comment">// Apply VMA_DEBUG_MARGIN at the end.</span></div><div class="line"><a name="l08701"></a><span class="lineno"> 8701</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l08702"></a><span class="lineno"> 8702</span>&#160;        {</div><div class="line"><a name="l08703"></a><span class="lineno"> 8703</span>&#160;            <span class="keywordflow">if</span>(resultOffset &lt; VMA_DEBUG_MARGIN)</div><div class="line"><a name="l08704"></a><span class="lineno"> 8704</span>&#160;            {</div><div class="line"><a name="l08705"></a><span class="lineno"> 8705</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;            resultOffset -= VMA_DEBUG_MARGIN;</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;</div><div class="line"><a name="l08710"></a><span class="lineno"> 8710</span>&#160;        <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l08711"></a><span class="lineno"> 8711</span>&#160;        resultOffset = VmaAlignDown(resultOffset, allocAlignment);</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;        <span class="comment">// Check next suballocations from 2nd for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08714"></a><span class="lineno"> 8714</span>&#160;        <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l08715"></a><span class="lineno"> 8715</span>&#160;        <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</div><div class="line"><a name="l08716"></a><span class="lineno"> 8716</span>&#160;        {</div><div class="line"><a name="l08717"></a><span class="lineno"> 8717</span>&#160;            <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l08718"></a><span class="lineno"> 8718</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</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;                <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div><div class="line"><a name="l08721"></a><span class="lineno"> 8721</span>&#160;                <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l08722"></a><span class="lineno"> 8722</span>&#160;                {</div><div class="line"><a name="l08723"></a><span class="lineno"> 8723</span>&#160;                    <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(nextSuballoc.type, allocType))</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;                        bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l08726"></a><span class="lineno"> 8726</span>&#160;                        <span class="keywordflow">break</span>;</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;                }</div><div class="line"><a name="l08729"></a><span class="lineno"> 8729</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l08730"></a><span class="lineno"> 8730</span>&#160;                    <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08731"></a><span class="lineno"> 8731</span>&#160;                    <span class="keywordflow">break</span>;</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;            <span class="keywordflow">if</span>(bufferImageGranularityConflict)</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;                resultOffset = VmaAlignDown(resultOffset, bufferImageGranularity);</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;        }</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="comment">// There is enough free space.</span></div><div class="line"><a name="l08740"></a><span class="lineno"> 8740</span>&#160;        <span class="keyword">const</span> VkDeviceSize endOf1st = !suballocations1st.empty() ?</div><div class="line"><a name="l08741"></a><span class="lineno"> 8741</span>&#160;            suballocations1st.back().offset + suballocations1st.back().size :</div><div class="line"><a name="l08742"></a><span class="lineno"> 8742</span>&#160;            0;</div><div class="line"><a name="l08743"></a><span class="lineno"> 8743</span>&#160;        <span class="keywordflow">if</span>(endOf1st + VMA_DEBUG_MARGIN &lt;= resultOffset)</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;            <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08746"></a><span class="lineno"> 8746</span>&#160;            <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l08747"></a><span class="lineno"> 8747</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l08748"></a><span class="lineno"> 8748</span>&#160;            {</div><div class="line"><a name="l08749"></a><span class="lineno"> 8749</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div><div class="line"><a name="l08750"></a><span class="lineno"> 8750</span>&#160;                {</div><div class="line"><a name="l08751"></a><span class="lineno"> 8751</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div><div class="line"><a name="l08752"></a><span class="lineno"> 8752</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</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;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, prevSuballoc.type))</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;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;                    }</div><div class="line"><a name="l08759"></a><span class="lineno"> 8759</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l08760"></a><span class="lineno"> 8760</span>&#160;                    {</div><div class="line"><a name="l08761"></a><span class="lineno"> 8761</span>&#160;                        <span class="comment">// Already on next page.</span></div><div class="line"><a name="l08762"></a><span class="lineno"> 8762</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08763"></a><span class="lineno"> 8763</span>&#160;                    }</div><div class="line"><a name="l08764"></a><span class="lineno"> 8764</span>&#160;                }</div><div class="line"><a name="l08765"></a><span class="lineno"> 8765</span>&#160;            }</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">// All tests passed: Success.</span></div><div class="line"><a name="l08768"></a><span class="lineno"> 8768</span>&#160;            pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l08769"></a><span class="lineno"> 8769</span>&#160;            pAllocationRequest-&gt;sumFreeSize = resultBaseOffset + allocSize - endOf1st;</div><div class="line"><a name="l08770"></a><span class="lineno"> 8770</span>&#160;            pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l08771"></a><span class="lineno"> 8771</span>&#160;            <span class="comment">// pAllocationRequest-&gt;item unused.</span></div><div class="line"><a name="l08772"></a><span class="lineno"> 8772</span>&#160;            pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l08773"></a><span class="lineno"> 8773</span>&#160;            <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    }</div><div class="line"><a name="l08776"></a><span class="lineno"> 8776</span>&#160;    <span class="keywordflow">else</span> <span class="comment">// !upperAddress</span></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;        <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</div><div class="line"><a name="l08779"></a><span class="lineno"> 8779</span>&#160;        {</div><div class="line"><a name="l08780"></a><span class="lineno"> 8780</span>&#160;            <span class="comment">// Try to allocate at the end of 1st vector.</span></div><div class="line"><a name="l08781"></a><span class="lineno"> 8781</span>&#160;</div><div class="line"><a name="l08782"></a><span class="lineno"> 8782</span>&#160;            VkDeviceSize resultBaseOffset = 0;</div><div class="line"><a name="l08783"></a><span class="lineno"> 8783</span>&#160;            <span class="keywordflow">if</span>(!suballocations1st.empty())</div><div class="line"><a name="l08784"></a><span class="lineno"> 8784</span>&#160;            {</div><div class="line"><a name="l08785"></a><span class="lineno"> 8785</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div><div class="line"><a name="l08786"></a><span class="lineno"> 8786</span>&#160;                resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</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;</div><div class="line"><a name="l08789"></a><span class="lineno"> 8789</span>&#160;            <span class="comment">// Start from offset equal to beginning of free space.</span></div><div class="line"><a name="l08790"></a><span class="lineno"> 8790</span>&#160;            VkDeviceSize resultOffset = resultBaseOffset;</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">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l08793"></a><span class="lineno"> 8793</span>&#160;            <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l08794"></a><span class="lineno"> 8794</span>&#160;            {</div><div class="line"><a name="l08795"></a><span class="lineno"> 8795</span>&#160;                resultOffset += VMA_DEBUG_MARGIN;</div><div class="line"><a name="l08796"></a><span class="lineno"> 8796</span>&#160;            }</div><div class="line"><a name="l08797"></a><span class="lineno"> 8797</span>&#160;</div><div class="line"><a name="l08798"></a><span class="lineno"> 8798</span>&#160;            <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l08799"></a><span class="lineno"> 8799</span>&#160;            resultOffset = VmaAlignUp(resultOffset, allocAlignment);</div><div class="line"><a name="l08800"></a><span class="lineno"> 8800</span>&#160;</div><div class="line"><a name="l08801"></a><span class="lineno"> 8801</span>&#160;            <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08802"></a><span class="lineno"> 8802</span>&#160;            <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l08803"></a><span class="lineno"> 8803</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations1st.empty())</div><div class="line"><a name="l08804"></a><span class="lineno"> 8804</span>&#160;            {</div><div class="line"><a name="l08805"></a><span class="lineno"> 8805</span>&#160;                <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l08806"></a><span class="lineno"> 8806</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations1st.size(); prevSuballocIndex--; )</div><div class="line"><a name="l08807"></a><span class="lineno"> 8807</span>&#160;                {</div><div class="line"><a name="l08808"></a><span class="lineno"> 8808</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations1st[prevSuballocIndex];</div><div class="line"><a name="l08809"></a><span class="lineno"> 8809</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div><div class="line"><a name="l08810"></a><span class="lineno"> 8810</span>&#160;                    {</div><div class="line"><a name="l08811"></a><span class="lineno"> 8811</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                            bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l08814"></a><span class="lineno"> 8814</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l08815"></a><span class="lineno"> 8815</span>&#160;                        }</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">else</span></div><div class="line"><a name="l08818"></a><span class="lineno"> 8818</span>&#160;                        <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08819"></a><span class="lineno"> 8819</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08820"></a><span class="lineno"> 8820</span>&#160;                }</div><div class="line"><a name="l08821"></a><span class="lineno"> 8821</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularityConflict)</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;                    resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</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;            }</div><div class="line"><a name="l08826"></a><span class="lineno"> 8826</span>&#160;</div><div class="line"><a name="l08827"></a><span class="lineno"> 8827</span>&#160;            <span class="keyword">const</span> VkDeviceSize freeSpaceEnd = m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK ?</div><div class="line"><a name="l08828"></a><span class="lineno"> 8828</span>&#160;                suballocations2nd.back().offset : size;</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;            <span class="comment">// There is enough free space at the end after alignment.</span></div><div class="line"><a name="l08831"></a><span class="lineno"> 8831</span>&#160;            <span class="keywordflow">if</span>(resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= freeSpaceEnd)</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="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08834"></a><span class="lineno"> 8834</span>&#160;                <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l08835"></a><span class="lineno"> 8835</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = suballocations2nd.size(); nextSuballocIndex--; )</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;                        <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations2nd[nextSuballocIndex];</div><div class="line"><a name="l08840"></a><span class="lineno"> 8840</span>&#160;                        <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</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;                            <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l08843"></a><span class="lineno"> 8843</span>&#160;                            {</div><div class="line"><a name="l08844"></a><span class="lineno"> 8844</span>&#160;                                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08845"></a><span class="lineno"> 8845</span>&#160;                            }</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="keywordflow">else</span></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;                            <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08850"></a><span class="lineno"> 8850</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l08851"></a><span class="lineno"> 8851</span>&#160;                        }</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;                }</div><div class="line"><a name="l08854"></a><span class="lineno"> 8854</span>&#160;</div><div class="line"><a name="l08855"></a><span class="lineno"> 8855</span>&#160;                <span class="comment">// All tests passed: Success.</span></div><div class="line"><a name="l08856"></a><span class="lineno"> 8856</span>&#160;                pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l08857"></a><span class="lineno"> 8857</span>&#160;                pAllocationRequest-&gt;sumFreeSize = freeSpaceEnd - resultBaseOffset;</div><div class="line"><a name="l08858"></a><span class="lineno"> 8858</span>&#160;                pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l08859"></a><span class="lineno"> 8859</span>&#160;                <span class="comment">// pAllocationRequest-&gt;item unused.</span></div><div class="line"><a name="l08860"></a><span class="lineno"> 8860</span>&#160;                pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l08861"></a><span class="lineno"> 8861</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</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;        }</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;        <span class="comment">// Wrap-around to end of 2nd vector. Try to allocate there, watching for the</span></div><div class="line"><a name="l08866"></a><span class="lineno"> 8866</span>&#160;        <span class="comment">// beginning of 1st vector as the end of free space.</span></div><div class="line"><a name="l08867"></a><span class="lineno"> 8867</span>&#160;        <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</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;            VMA_ASSERT(!suballocations1st.empty());</div><div class="line"><a name="l08870"></a><span class="lineno"> 8870</span>&#160;</div><div class="line"><a name="l08871"></a><span class="lineno"> 8871</span>&#160;            VkDeviceSize resultBaseOffset = 0;</div><div class="line"><a name="l08872"></a><span class="lineno"> 8872</span>&#160;            <span class="keywordflow">if</span>(!suballocations2nd.empty())</div><div class="line"><a name="l08873"></a><span class="lineno"> 8873</span>&#160;            {</div><div class="line"><a name="l08874"></a><span class="lineno"> 8874</span>&#160;                <span class="keyword">const</span> VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l08875"></a><span class="lineno"> 8875</span>&#160;                resultBaseOffset = lastSuballoc.offset + lastSuballoc.size;</div><div class="line"><a name="l08876"></a><span class="lineno"> 8876</span>&#160;            }</div><div class="line"><a name="l08877"></a><span class="lineno"> 8877</span>&#160;</div><div class="line"><a name="l08878"></a><span class="lineno"> 8878</span>&#160;            <span class="comment">// Start from offset equal to beginning of free space.</span></div><div class="line"><a name="l08879"></a><span class="lineno"> 8879</span>&#160;            VkDeviceSize resultOffset = resultBaseOffset;</div><div class="line"><a name="l08880"></a><span class="lineno"> 8880</span>&#160;</div><div class="line"><a name="l08881"></a><span class="lineno"> 8881</span>&#160;            <span class="comment">// Apply VMA_DEBUG_MARGIN at the beginning.</span></div><div class="line"><a name="l08882"></a><span class="lineno"> 8882</span>&#160;            <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &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;                resultOffset += VMA_DEBUG_MARGIN;</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;</div><div class="line"><a name="l08887"></a><span class="lineno"> 8887</span>&#160;            <span class="comment">// Apply alignment.</span></div><div class="line"><a name="l08888"></a><span class="lineno"> 8888</span>&#160;            resultOffset = VmaAlignUp(resultOffset, allocAlignment);</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;            <span class="comment">// Check previous suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08891"></a><span class="lineno"> 8891</span>&#160;            <span class="comment">// Make bigger alignment if necessary.</span></div><div class="line"><a name="l08892"></a><span class="lineno"> 8892</span>&#160;            <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1 &amp;&amp; !suballocations2nd.empty())</div><div class="line"><a name="l08893"></a><span class="lineno"> 8893</span>&#160;            {</div><div class="line"><a name="l08894"></a><span class="lineno"> 8894</span>&#160;                <span class="keywordtype">bool</span> bufferImageGranularityConflict = <span class="keyword">false</span>;</div><div class="line"><a name="l08895"></a><span class="lineno"> 8895</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> prevSuballocIndex = suballocations2nd.size(); prevSuballocIndex--; )</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="keyword">const</span> VmaSuballocation&amp; prevSuballoc = suballocations2nd[prevSuballocIndex];</div><div class="line"><a name="l08898"></a><span class="lineno"> 8898</span>&#160;                    <span class="keywordflow">if</span>(VmaBlocksOnSamePage(prevSuballoc.offset, prevSuballoc.size, resultOffset, bufferImageGranularity))</div><div class="line"><a name="l08899"></a><span class="lineno"> 8899</span>&#160;                    {</div><div class="line"><a name="l08900"></a><span class="lineno"> 8900</span>&#160;                        <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(prevSuballoc.type, allocType))</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;                            bufferImageGranularityConflict = <span class="keyword">true</span>;</div><div class="line"><a name="l08903"></a><span class="lineno"> 8903</span>&#160;                            <span class="keywordflow">break</span>;</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;                    }</div><div class="line"><a name="l08906"></a><span class="lineno"> 8906</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l08907"></a><span class="lineno"> 8907</span>&#160;                        <span class="comment">// Already on previous page.</span></div><div class="line"><a name="l08908"></a><span class="lineno"> 8908</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l08909"></a><span class="lineno"> 8909</span>&#160;                }</div><div class="line"><a name="l08910"></a><span class="lineno"> 8910</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularityConflict)</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;                    resultOffset = VmaAlignUp(resultOffset, bufferImageGranularity);</div><div class="line"><a name="l08913"></a><span class="lineno"> 8913</span>&#160;                }</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;            pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l08917"></a><span class="lineno"> 8917</span>&#160;            pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l08918"></a><span class="lineno"> 8918</span>&#160;            <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</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;            <span class="keywordflow">if</span>(canMakeOtherLost)</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">while</span>(index1st &lt; suballocations1st.size() &amp;&amp;</div><div class="line"><a name="l08923"></a><span class="lineno"> 8923</span>&#160;                    resultOffset + allocSize + VMA_DEBUG_MARGIN &gt; suballocations1st[index1st].offset)</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;                    <span class="comment">// Next colliding allocation at the beginning of 1st vector found. Try to make it lost.</span></div><div class="line"><a name="l08926"></a><span class="lineno"> 8926</span>&#160;                    <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div><div class="line"><a name="l08927"></a><span class="lineno"> 8927</span>&#160;                    <span class="keywordflow">if</span>(suballoc.type == VMA_SUBALLOCATION_TYPE_FREE)</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;                        <span class="comment">// No problem.</span></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="keywordflow">else</span></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;                        VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l08934"></a><span class="lineno"> 8934</span>&#160;                        <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l08935"></a><span class="lineno"> 8935</span>&#160;                            suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l08936"></a><span class="lineno"> 8936</span>&#160;                        {</div><div class="line"><a name="l08937"></a><span class="lineno"> 8937</span>&#160;                            ++pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l08938"></a><span class="lineno"> 8938</span>&#160;                            pAllocationRequest-&gt;sumItemSize += suballoc.size;</div><div class="line"><a name="l08939"></a><span class="lineno"> 8939</span>&#160;                        }</div><div class="line"><a name="l08940"></a><span class="lineno"> 8940</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l08941"></a><span class="lineno"> 8941</span>&#160;                        {</div><div class="line"><a name="l08942"></a><span class="lineno"> 8942</span>&#160;                            <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08943"></a><span class="lineno"> 8943</span>&#160;                        }</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;                    ++index1st;</div><div class="line"><a name="l08946"></a><span class="lineno"> 8946</span>&#160;                }</div><div class="line"><a name="l08947"></a><span class="lineno"> 8947</span>&#160;</div><div class="line"><a name="l08948"></a><span class="lineno"> 8948</span>&#160;                <span class="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08949"></a><span class="lineno"> 8949</span>&#160;                <span class="comment">// If conflict exists, we must mark more allocations lost or fail.</span></div><div class="line"><a name="l08950"></a><span class="lineno"> 8950</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l08951"></a><span class="lineno"> 8951</span>&#160;                {</div><div class="line"><a name="l08952"></a><span class="lineno"> 8952</span>&#160;                    <span class="keywordflow">while</span>(index1st &lt; suballocations1st.size())</div><div class="line"><a name="l08953"></a><span class="lineno"> 8953</span>&#160;                    {</div><div class="line"><a name="l08954"></a><span class="lineno"> 8954</span>&#160;                        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div><div class="line"><a name="l08955"></a><span class="lineno"> 8955</span>&#160;                        <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, suballoc.offset, bufferImageGranularity))</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;                            <span class="keywordflow">if</span>(suballoc.hAllocation != VK_NULL_HANDLE)</div><div class="line"><a name="l08958"></a><span class="lineno"> 8958</span>&#160;                            {</div><div class="line"><a name="l08959"></a><span class="lineno"> 8959</span>&#160;                                <span class="comment">// Not checking actual VmaIsBufferImageGranularityConflict(allocType, suballoc.type).</span></div><div class="line"><a name="l08960"></a><span class="lineno"> 8960</span>&#160;                                <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l08961"></a><span class="lineno"> 8961</span>&#160;                                    suballoc.hAllocation-&gt;GetLastUseFrameIndex() + frameInUseCount &lt; currentFrameIndex)</div><div class="line"><a name="l08962"></a><span class="lineno"> 8962</span>&#160;                                {</div><div class="line"><a name="l08963"></a><span class="lineno"> 8963</span>&#160;                                    ++pAllocationRequest-&gt;itemsToMakeLostCount;</div><div class="line"><a name="l08964"></a><span class="lineno"> 8964</span>&#160;                                    pAllocationRequest-&gt;sumItemSize += suballoc.size;</div><div class="line"><a name="l08965"></a><span class="lineno"> 8965</span>&#160;                                }</div><div class="line"><a name="l08966"></a><span class="lineno"> 8966</span>&#160;                                <span class="keywordflow">else</span></div><div class="line"><a name="l08967"></a><span class="lineno"> 8967</span>&#160;                                {</div><div class="line"><a name="l08968"></a><span class="lineno"> 8968</span>&#160;                                    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l08969"></a><span class="lineno"> 8969</span>&#160;                                }</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;                        }</div><div class="line"><a name="l08972"></a><span class="lineno"> 8972</span>&#160;                        <span class="keywordflow">else</span></div><div class="line"><a name="l08973"></a><span class="lineno"> 8973</span>&#160;                        {</div><div class="line"><a name="l08974"></a><span class="lineno"> 8974</span>&#160;                            <span class="comment">// Already on next page.</span></div><div class="line"><a name="l08975"></a><span class="lineno"> 8975</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l08976"></a><span class="lineno"> 8976</span>&#160;                        }</div><div class="line"><a name="l08977"></a><span class="lineno"> 8977</span>&#160;                        ++index1st;</div><div class="line"><a name="l08978"></a><span class="lineno"> 8978</span>&#160;                    }</div><div class="line"><a name="l08979"></a><span class="lineno"> 8979</span>&#160;                }</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;</div><div class="line"><a name="l08982"></a><span class="lineno"> 8982</span>&#160;            <span class="comment">// There is enough free space at the end after alignment.</span></div><div class="line"><a name="l08983"></a><span class="lineno"> 8983</span>&#160;            <span class="keywordflow">if</span>((index1st == suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt; size) ||</div><div class="line"><a name="l08984"></a><span class="lineno"> 8984</span>&#160;                (index1st &lt; suballocations1st.size() &amp;&amp; resultOffset + allocSize + VMA_DEBUG_MARGIN &lt;= suballocations1st[index1st].offset))</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="comment">// Check next suballocations for BufferImageGranularity conflicts.</span></div><div class="line"><a name="l08987"></a><span class="lineno"> 8987</span>&#160;                <span class="comment">// If conflict exists, allocation cannot be made here.</span></div><div class="line"><a name="l08988"></a><span class="lineno"> 8988</span>&#160;                <span class="keywordflow">if</span>(bufferImageGranularity &gt; 1)</div><div class="line"><a name="l08989"></a><span class="lineno"> 8989</span>&#160;                {</div><div class="line"><a name="l08990"></a><span class="lineno"> 8990</span>&#160;                    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> nextSuballocIndex = index1st;</div><div class="line"><a name="l08991"></a><span class="lineno"> 8991</span>&#160;                        nextSuballocIndex &lt; suballocations1st.size();</div><div class="line"><a name="l08992"></a><span class="lineno"> 8992</span>&#160;                        nextSuballocIndex++)</div><div class="line"><a name="l08993"></a><span class="lineno"> 8993</span>&#160;                    {</div><div class="line"><a name="l08994"></a><span class="lineno"> 8994</span>&#160;                        <span class="keyword">const</span> VmaSuballocation&amp; nextSuballoc = suballocations1st[nextSuballocIndex];</div><div class="line"><a name="l08995"></a><span class="lineno"> 8995</span>&#160;                        <span class="keywordflow">if</span>(VmaBlocksOnSamePage(resultOffset, allocSize, nextSuballoc.offset, bufferImageGranularity))</div><div class="line"><a name="l08996"></a><span class="lineno"> 8996</span>&#160;                        {</div><div class="line"><a name="l08997"></a><span class="lineno"> 8997</span>&#160;                            <span class="keywordflow">if</span>(VmaIsBufferImageGranularityConflict(allocType, nextSuballoc.type))</div><div class="line"><a name="l08998"></a><span class="lineno"> 8998</span>&#160;                            {</div><div class="line"><a name="l08999"></a><span class="lineno"> 8999</span>&#160;                                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09000"></a><span class="lineno"> 9000</span>&#160;                            }</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;                        <span class="keywordflow">else</span></div><div class="line"><a name="l09003"></a><span class="lineno"> 9003</span>&#160;                        {</div><div class="line"><a name="l09004"></a><span class="lineno"> 9004</span>&#160;                            <span class="comment">// Already on next page.</span></div><div class="line"><a name="l09005"></a><span class="lineno"> 9005</span>&#160;                            <span class="keywordflow">break</span>;</div><div class="line"><a name="l09006"></a><span class="lineno"> 9006</span>&#160;                        }</div><div class="line"><a name="l09007"></a><span class="lineno"> 9007</span>&#160;                    }</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;</div><div class="line"><a name="l09010"></a><span class="lineno"> 9010</span>&#160;                <span class="comment">// All tests passed: Success.</span></div><div class="line"><a name="l09011"></a><span class="lineno"> 9011</span>&#160;                pAllocationRequest-&gt;offset = resultOffset;</div><div class="line"><a name="l09012"></a><span class="lineno"> 9012</span>&#160;                pAllocationRequest-&gt;sumFreeSize =</div><div class="line"><a name="l09013"></a><span class="lineno"> 9013</span>&#160;                    (index1st &lt; suballocations1st.size() ? suballocations1st[index1st].offset : size)</div><div class="line"><a name="l09014"></a><span class="lineno"> 9014</span>&#160;                    - resultBaseOffset</div><div class="line"><a name="l09015"></a><span class="lineno"> 9015</span>&#160;                    - pAllocationRequest-&gt;sumItemSize;</div><div class="line"><a name="l09016"></a><span class="lineno"> 9016</span>&#160;                <span class="comment">// pAllocationRequest-&gt;item unused.</span></div><div class="line"><a name="l09017"></a><span class="lineno"> 9017</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;        }</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;</div><div class="line"><a name="l09022"></a><span class="lineno"> 9022</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</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;</div><div class="line"><a name="l09025"></a><span class="lineno"> 9025</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Linear::MakeRequestedAllocationsLost(</div><div class="line"><a name="l09026"></a><span class="lineno"> 9026</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09027"></a><span class="lineno"> 9027</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09028"></a><span class="lineno"> 9028</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l09029"></a><span class="lineno"> 9029</span>&#160;{</div><div class="line"><a name="l09030"></a><span class="lineno"> 9030</span>&#160;    <span class="keywordflow">if</span>(pAllocationRequest-&gt;itemsToMakeLostCount == 0)</div><div class="line"><a name="l09031"></a><span class="lineno"> 9031</span>&#160;    {</div><div class="line"><a name="l09032"></a><span class="lineno"> 9032</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;</div><div class="line"><a name="l09035"></a><span class="lineno"> 9035</span>&#160;    VMA_ASSERT(m_2ndVectorMode == SECOND_VECTOR_EMPTY || m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER);</div><div class="line"><a name="l09036"></a><span class="lineno"> 9036</span>&#160;    </div><div class="line"><a name="l09037"></a><span class="lineno"> 9037</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09038"></a><span class="lineno"> 9038</span>&#160;    <span class="keywordtype">size_t</span> index1st = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09039"></a><span class="lineno"> 9039</span>&#160;    <span class="keywordtype">size_t</span> madeLostCount = 0;</div><div class="line"><a name="l09040"></a><span class="lineno"> 9040</span>&#160;    <span class="keywordflow">while</span>(madeLostCount &lt; pAllocationRequest-&gt;itemsToMakeLostCount)</div><div class="line"><a name="l09041"></a><span class="lineno"> 9041</span>&#160;    {</div><div class="line"><a name="l09042"></a><span class="lineno"> 9042</span>&#160;        VMA_ASSERT(index1st &lt; suballocations1st.size());</div><div class="line"><a name="l09043"></a><span class="lineno"> 9043</span>&#160;        VmaSuballocation&amp; suballoc = suballocations1st[index1st];</div><div class="line"><a name="l09044"></a><span class="lineno"> 9044</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l09045"></a><span class="lineno"> 9045</span>&#160;        {</div><div class="line"><a name="l09046"></a><span class="lineno"> 9046</span>&#160;            VMA_ASSERT(suballoc.hAllocation != VK_NULL_HANDLE);</div><div class="line"><a name="l09047"></a><span class="lineno"> 9047</span>&#160;            VMA_ASSERT(suballoc.hAllocation-&gt;CanBecomeLost());</div><div class="line"><a name="l09048"></a><span class="lineno"> 9048</span>&#160;            <span class="keywordflow">if</span>(suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l09049"></a><span class="lineno"> 9049</span>&#160;            {</div><div class="line"><a name="l09050"></a><span class="lineno"> 9050</span>&#160;                suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09051"></a><span class="lineno"> 9051</span>&#160;                suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09052"></a><span class="lineno"> 9052</span>&#160;                m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l09053"></a><span class="lineno"> 9053</span>&#160;                ++m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09054"></a><span class="lineno"> 9054</span>&#160;                ++madeLostCount;</div><div class="line"><a name="l09055"></a><span class="lineno"> 9055</span>&#160;            }</div><div class="line"><a name="l09056"></a><span class="lineno"> 9056</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09057"></a><span class="lineno"> 9057</span>&#160;            {</div><div class="line"><a name="l09058"></a><span class="lineno"> 9058</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09059"></a><span class="lineno"> 9059</span>&#160;            }</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;        ++index1st;</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;</div><div class="line"><a name="l09064"></a><span class="lineno"> 9064</span>&#160;    CleanupAfterFree();</div><div class="line"><a name="l09065"></a><span class="lineno"> 9065</span>&#160;    <span class="comment">//VMA_HEAVY_ASSERT(Validate()); // Already called by ClanupAfterFree().</span></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;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09068"></a><span class="lineno"> 9068</span>&#160;}</div><div class="line"><a name="l09069"></a><span class="lineno"> 9069</span>&#160;</div><div class="line"><a name="l09070"></a><span class="lineno"> 9070</span>&#160;uint32_t VmaBlockMetadata_Linear::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l09071"></a><span class="lineno"> 9071</span>&#160;{</div><div class="line"><a name="l09072"></a><span class="lineno"> 9072</span>&#160;    uint32_t lostAllocationCount = 0;</div><div class="line"><a name="l09073"></a><span class="lineno"> 9073</span>&#160;    </div><div class="line"><a name="l09074"></a><span class="lineno"> 9074</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09075"></a><span class="lineno"> 9075</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i &lt; count; ++i)</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;        VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l09078"></a><span class="lineno"> 9078</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l09079"></a><span class="lineno"> 9079</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l09080"></a><span class="lineno"> 9080</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</div><div class="line"><a name="l09081"></a><span class="lineno"> 9081</span>&#160;        {</div><div class="line"><a name="l09082"></a><span class="lineno"> 9082</span>&#160;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09083"></a><span class="lineno"> 9083</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09084"></a><span class="lineno"> 9084</span>&#160;            ++m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09085"></a><span class="lineno"> 9085</span>&#160;            m_SumFreeSize += suballoc.size;</div><div class="line"><a name="l09086"></a><span class="lineno"> 9086</span>&#160;            ++lostAllocationCount;</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;    }</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;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09091"></a><span class="lineno"> 9091</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i &lt; count; ++i)</div><div class="line"><a name="l09092"></a><span class="lineno"> 9092</span>&#160;    {</div><div class="line"><a name="l09093"></a><span class="lineno"> 9093</span>&#160;        VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l09094"></a><span class="lineno"> 9094</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE &amp;&amp;</div><div class="line"><a name="l09095"></a><span class="lineno"> 9095</span>&#160;            suballoc.hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l09096"></a><span class="lineno"> 9096</span>&#160;            suballoc.hAllocation-&gt;MakeLost(currentFrameIndex, frameInUseCount))</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;            suballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09099"></a><span class="lineno"> 9099</span>&#160;            suballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09100"></a><span class="lineno"> 9100</span>&#160;            ++m_2ndNullItemsCount;</div><div class="line"><a name="l09101"></a><span class="lineno"> 9101</span>&#160;            ++lostAllocationCount;</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;    }</div><div class="line"><a name="l09104"></a><span class="lineno"> 9104</span>&#160;</div><div class="line"><a name="l09105"></a><span class="lineno"> 9105</span>&#160;    <span class="keywordflow">if</span>(lostAllocationCount)</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;        CleanupAfterFree();</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;</div><div class="line"><a name="l09110"></a><span class="lineno"> 9110</span>&#160;    <span class="keywordflow">return</span> lostAllocationCount;</div><div class="line"><a name="l09111"></a><span class="lineno"> 9111</span>&#160;}</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;VkResult VmaBlockMetadata_Linear::CheckCorruption(<span class="keyword">const</span> <span class="keywordtype">void</span>* pBlockData)</div><div class="line"><a name="l09114"></a><span class="lineno"> 9114</span>&#160;{</div><div class="line"><a name="l09115"></a><span class="lineno"> 9115</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09116"></a><span class="lineno"> 9116</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_1stNullItemsBeginCount, count = suballocations1st.size(); i &lt; count; ++i)</div><div class="line"><a name="l09117"></a><span class="lineno"> 9117</span>&#160;    {</div><div class="line"><a name="l09118"></a><span class="lineno"> 9118</span>&#160;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations1st[i];</div><div class="line"><a name="l09119"></a><span class="lineno"> 9119</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</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;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</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;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l09124"></a><span class="lineno"> 9124</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</div><div class="line"><a name="l09127"></a><span class="lineno"> 9127</span>&#160;            {</div><div class="line"><a name="l09128"></a><span class="lineno"> 9128</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l09129"></a><span class="lineno"> 9129</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l09130"></a><span class="lineno"> 9130</span>&#160;            }</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;    }</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;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09135"></a><span class="lineno"> 9135</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0, count = suballocations2nd.size(); i &lt; count; ++i)</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;        <span class="keyword">const</span> VmaSuballocation&amp; suballoc = suballocations2nd[i];</div><div class="line"><a name="l09138"></a><span class="lineno"> 9138</span>&#160;        <span class="keywordflow">if</span>(suballoc.type != VMA_SUBALLOCATION_TYPE_FREE)</div><div class="line"><a name="l09139"></a><span class="lineno"> 9139</span>&#160;        {</div><div class="line"><a name="l09140"></a><span class="lineno"> 9140</span>&#160;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l09141"></a><span class="lineno"> 9141</span>&#160;            {</div><div class="line"><a name="l09142"></a><span class="lineno"> 9142</span>&#160;                VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l09143"></a><span class="lineno"> 9143</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</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;            <span class="keywordflow">if</span>(!VmaValidateMagicValue(pBlockData, suballoc.offset + suballoc.size))</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_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER VALIDATED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l09148"></a><span class="lineno"> 9148</span>&#160;                <span class="keywordflow">return</span> VK_ERROR_VALIDATION_FAILED_EXT;</div><div class="line"><a name="l09149"></a><span class="lineno"> 9149</span>&#160;            }</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;    }</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;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l09154"></a><span class="lineno"> 9154</span>&#160;}</div><div class="line"><a name="l09155"></a><span class="lineno"> 9155</span>&#160;</div><div class="line"><a name="l09156"></a><span class="lineno"> 9156</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::Alloc(</div><div class="line"><a name="l09157"></a><span class="lineno"> 9157</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l09158"></a><span class="lineno"> 9158</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l09159"></a><span class="lineno"> 9159</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09160"></a><span class="lineno"> 9160</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l09161"></a><span class="lineno"> 9161</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</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;    <span class="keyword">const</span> VmaSuballocation newSuballoc = { request.offset, allocSize, hAllocation, type };</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">if</span>(upperAddress)</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;        VMA_ASSERT(m_2ndVectorMode != SECOND_VECTOR_RING_BUFFER &amp;&amp;</div><div class="line"><a name="l09168"></a><span class="lineno"> 9168</span>&#160;            <span class="stringliteral">&quot;CRITICAL ERROR: Trying to use linear allocator as double stack while it was already used as ring buffer.&quot;</span>);</div><div class="line"><a name="l09169"></a><span class="lineno"> 9169</span>&#160;        SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09170"></a><span class="lineno"> 9170</span>&#160;        suballocations2nd.push_back(newSuballoc);</div><div class="line"><a name="l09171"></a><span class="lineno"> 9171</span>&#160;        m_2ndVectorMode = SECOND_VECTOR_DOUBLE_STACK;</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;    <span class="keywordflow">else</span></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;        SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</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;        <span class="comment">// First allocation.</span></div><div class="line"><a name="l09178"></a><span class="lineno"> 9178</span>&#160;        <span class="keywordflow">if</span>(suballocations1st.empty())</div><div class="line"><a name="l09179"></a><span class="lineno"> 9179</span>&#160;        {</div><div class="line"><a name="l09180"></a><span class="lineno"> 9180</span>&#160;            suballocations1st.push_back(newSuballoc);</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l09183"></a><span class="lineno"> 9183</span>&#160;        {</div><div class="line"><a name="l09184"></a><span class="lineno"> 9184</span>&#160;            <span class="comment">// New allocation at the end of 1st vector.</span></div><div class="line"><a name="l09185"></a><span class="lineno"> 9185</span>&#160;            <span class="keywordflow">if</span>(request.offset &gt;= suballocations1st.back().offset + suballocations1st.back().size)</div><div class="line"><a name="l09186"></a><span class="lineno"> 9186</span>&#160;            {</div><div class="line"><a name="l09187"></a><span class="lineno"> 9187</span>&#160;                <span class="comment">// Check if it fits before the end of the block.</span></div><div class="line"><a name="l09188"></a><span class="lineno"> 9188</span>&#160;                VMA_ASSERT(request.offset + allocSize &lt;= GetSize());</div><div class="line"><a name="l09189"></a><span class="lineno"> 9189</span>&#160;                suballocations1st.push_back(newSuballoc);</div><div class="line"><a name="l09190"></a><span class="lineno"> 9190</span>&#160;            }</div><div class="line"><a name="l09191"></a><span class="lineno"> 9191</span>&#160;            <span class="comment">// New allocation at the end of 2-part ring buffer, so before first allocation from 1st vector.</span></div><div class="line"><a name="l09192"></a><span class="lineno"> 9192</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(request.offset + allocSize &lt;= suballocations1st[m_1stNullItemsBeginCount].offset)</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;                SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</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;                <span class="keywordflow">switch</span>(m_2ndVectorMode)</div><div class="line"><a name="l09197"></a><span class="lineno"> 9197</span>&#160;                {</div><div class="line"><a name="l09198"></a><span class="lineno"> 9198</span>&#160;                <span class="keywordflow">case</span> SECOND_VECTOR_EMPTY:</div><div class="line"><a name="l09199"></a><span class="lineno"> 9199</span>&#160;                    <span class="comment">// First allocation from second part ring buffer.</span></div><div class="line"><a name="l09200"></a><span class="lineno"> 9200</span>&#160;                    VMA_ASSERT(suballocations2nd.empty());</div><div class="line"><a name="l09201"></a><span class="lineno"> 9201</span>&#160;                    m_2ndVectorMode = SECOND_VECTOR_RING_BUFFER;</div><div class="line"><a name="l09202"></a><span class="lineno"> 9202</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09203"></a><span class="lineno"> 9203</span>&#160;                <span class="keywordflow">case</span> SECOND_VECTOR_RING_BUFFER:</div><div class="line"><a name="l09204"></a><span class="lineno"> 9204</span>&#160;                    <span class="comment">// 2-part ring buffer is already started.</span></div><div class="line"><a name="l09205"></a><span class="lineno"> 9205</span>&#160;                    VMA_ASSERT(!suballocations2nd.empty());</div><div class="line"><a name="l09206"></a><span class="lineno"> 9206</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09207"></a><span class="lineno"> 9207</span>&#160;                <span class="keywordflow">case</span> SECOND_VECTOR_DOUBLE_STACK:</div><div class="line"><a name="l09208"></a><span class="lineno"> 9208</span>&#160;                    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL ERROR: Trying to use linear allocator as ring buffer while it was already used as double stack.&quot;</span>);</div><div class="line"><a name="l09209"></a><span class="lineno"> 9209</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l09210"></a><span class="lineno"> 9210</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l09211"></a><span class="lineno"> 9211</span>&#160;                    VMA_ASSERT(0);</div><div class="line"><a name="l09212"></a><span class="lineno"> 9212</span>&#160;                }</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;                suballocations2nd.push_back(newSuballoc);</div><div class="line"><a name="l09215"></a><span class="lineno"> 9215</span>&#160;            }</div><div class="line"><a name="l09216"></a><span class="lineno"> 9216</span>&#160;            <span class="keywordflow">else</span></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(0 &amp;&amp; <span class="stringliteral">&quot;CRITICAL INTERNAL ERROR.&quot;</span>);</div><div class="line"><a name="l09219"></a><span class="lineno"> 9219</span>&#160;            }</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;    }</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;    m_SumFreeSize -= newSuballoc.size;</div><div class="line"><a name="l09224"></a><span class="lineno"> 9224</span>&#160;}</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="keywordtype">void</span> VmaBlockMetadata_Linear::Free(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</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;    FreeAtOffset(allocation-&gt;GetOffset());</div><div class="line"><a name="l09229"></a><span class="lineno"> 9229</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::FreeAtOffset(VkDeviceSize offset)</div><div class="line"><a name="l09232"></a><span class="lineno"> 9232</span>&#160;{</div><div class="line"><a name="l09233"></a><span class="lineno"> 9233</span>&#160;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09234"></a><span class="lineno"> 9234</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09235"></a><span class="lineno"> 9235</span>&#160;</div><div class="line"><a name="l09236"></a><span class="lineno"> 9236</span>&#160;    <span class="keywordflow">if</span>(!suballocations1st.empty())</div><div class="line"><a name="l09237"></a><span class="lineno"> 9237</span>&#160;    {</div><div class="line"><a name="l09238"></a><span class="lineno"> 9238</span>&#160;        <span class="comment">// First allocation: Mark it as next empty at the beginning.</span></div><div class="line"><a name="l09239"></a><span class="lineno"> 9239</span>&#160;        VmaSuballocation&amp; firstSuballoc = suballocations1st[m_1stNullItemsBeginCount];</div><div class="line"><a name="l09240"></a><span class="lineno"> 9240</span>&#160;        <span class="keywordflow">if</span>(firstSuballoc.offset == offset)</div><div class="line"><a name="l09241"></a><span class="lineno"> 9241</span>&#160;        {</div><div class="line"><a name="l09242"></a><span class="lineno"> 9242</span>&#160;            firstSuballoc.type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09243"></a><span class="lineno"> 9243</span>&#160;            firstSuballoc.hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09244"></a><span class="lineno"> 9244</span>&#160;            m_SumFreeSize += firstSuballoc.size;</div><div class="line"><a name="l09245"></a><span class="lineno"> 9245</span>&#160;            ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l09246"></a><span class="lineno"> 9246</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09247"></a><span class="lineno"> 9247</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l09248"></a><span class="lineno"> 9248</span>&#160;        }</div><div class="line"><a name="l09249"></a><span class="lineno"> 9249</span>&#160;    }</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;    <span class="comment">// Last allocation in 2-part ring buffer or top of upper stack (same logic).</span></div><div class="line"><a name="l09252"></a><span class="lineno"> 9252</span>&#160;    <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ||</div><div class="line"><a name="l09253"></a><span class="lineno"> 9253</span>&#160;        m_2ndVectorMode == SECOND_VECTOR_DOUBLE_STACK)</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;        VmaSuballocation&amp; lastSuballoc = suballocations2nd.back();</div><div class="line"><a name="l09256"></a><span class="lineno"> 9256</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div><div class="line"><a name="l09257"></a><span class="lineno"> 9257</span>&#160;        {</div><div class="line"><a name="l09258"></a><span class="lineno"> 9258</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div><div class="line"><a name="l09259"></a><span class="lineno"> 9259</span>&#160;            suballocations2nd.pop_back();</div><div class="line"><a name="l09260"></a><span class="lineno"> 9260</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09261"></a><span class="lineno"> 9261</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l09262"></a><span class="lineno"> 9262</span>&#160;        }</div><div class="line"><a name="l09263"></a><span class="lineno"> 9263</span>&#160;    }</div><div class="line"><a name="l09264"></a><span class="lineno"> 9264</span>&#160;    <span class="comment">// Last allocation in 1st vector.</span></div><div class="line"><a name="l09265"></a><span class="lineno"> 9265</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_2ndVectorMode == SECOND_VECTOR_EMPTY)</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;        VmaSuballocation&amp; lastSuballoc = suballocations1st.back();</div><div class="line"><a name="l09268"></a><span class="lineno"> 9268</span>&#160;        <span class="keywordflow">if</span>(lastSuballoc.offset == offset)</div><div class="line"><a name="l09269"></a><span class="lineno"> 9269</span>&#160;        {</div><div class="line"><a name="l09270"></a><span class="lineno"> 9270</span>&#160;            m_SumFreeSize += lastSuballoc.size;</div><div class="line"><a name="l09271"></a><span class="lineno"> 9271</span>&#160;            suballocations1st.pop_back();</div><div class="line"><a name="l09272"></a><span class="lineno"> 9272</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09273"></a><span class="lineno"> 9273</span>&#160;            <span class="keywordflow">return</span>;</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;    }</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;    <span class="comment">// Item from the middle of 1st vector.</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;        VmaSuballocation refSuballoc;</div><div class="line"><a name="l09280"></a><span class="lineno"> 9280</span>&#160;        refSuballoc.offset = offset;</div><div class="line"><a name="l09281"></a><span class="lineno"> 9281</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div><div class="line"><a name="l09282"></a><span class="lineno"> 9282</span>&#160;        SuballocationVectorType::iterator it = VmaVectorFindSorted&lt;VmaSuballocationOffsetLess&gt;(</div><div class="line"><a name="l09283"></a><span class="lineno"> 9283</span>&#160;            suballocations1st.begin() + m_1stNullItemsBeginCount,</div><div class="line"><a name="l09284"></a><span class="lineno"> 9284</span>&#160;            suballocations1st.end(),</div><div class="line"><a name="l09285"></a><span class="lineno"> 9285</span>&#160;            refSuballoc);</div><div class="line"><a name="l09286"></a><span class="lineno"> 9286</span>&#160;        <span class="keywordflow">if</span>(it != suballocations1st.end())</div><div class="line"><a name="l09287"></a><span class="lineno"> 9287</span>&#160;        {</div><div class="line"><a name="l09288"></a><span class="lineno"> 9288</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09289"></a><span class="lineno"> 9289</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09290"></a><span class="lineno"> 9290</span>&#160;            ++m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09291"></a><span class="lineno"> 9291</span>&#160;            m_SumFreeSize += it-&gt;size;</div><div class="line"><a name="l09292"></a><span class="lineno"> 9292</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09293"></a><span class="lineno"> 9293</span>&#160;            <span class="keywordflow">return</span>;</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;    }</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;    <span class="keywordflow">if</span>(m_2ndVectorMode != SECOND_VECTOR_EMPTY)</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;        <span class="comment">// Item from the middle of 2nd vector.</span></div><div class="line"><a name="l09300"></a><span class="lineno"> 9300</span>&#160;        VmaSuballocation refSuballoc;</div><div class="line"><a name="l09301"></a><span class="lineno"> 9301</span>&#160;        refSuballoc.offset = offset;</div><div class="line"><a name="l09302"></a><span class="lineno"> 9302</span>&#160;        <span class="comment">// Rest of members stays uninitialized intentionally for better performance.</span></div><div class="line"><a name="l09303"></a><span class="lineno"> 9303</span>&#160;        SuballocationVectorType::iterator it = m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER ?</div><div class="line"><a name="l09304"></a><span class="lineno"> 9304</span>&#160;            VmaVectorFindSorted&lt;VmaSuballocationOffsetLess&gt;(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc) :</div><div class="line"><a name="l09305"></a><span class="lineno"> 9305</span>&#160;            VmaVectorFindSorted&lt;VmaSuballocationOffsetGreater&gt;(suballocations2nd.begin(), suballocations2nd.end(), refSuballoc);</div><div class="line"><a name="l09306"></a><span class="lineno"> 9306</span>&#160;        <span class="keywordflow">if</span>(it != suballocations2nd.end())</div><div class="line"><a name="l09307"></a><span class="lineno"> 9307</span>&#160;        {</div><div class="line"><a name="l09308"></a><span class="lineno"> 9308</span>&#160;            it-&gt;type = VMA_SUBALLOCATION_TYPE_FREE;</div><div class="line"><a name="l09309"></a><span class="lineno"> 9309</span>&#160;            it-&gt;hAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l09310"></a><span class="lineno"> 9310</span>&#160;            ++m_2ndNullItemsCount;</div><div class="line"><a name="l09311"></a><span class="lineno"> 9311</span>&#160;            m_SumFreeSize += it-&gt;size;</div><div class="line"><a name="l09312"></a><span class="lineno"> 9312</span>&#160;            CleanupAfterFree();</div><div class="line"><a name="l09313"></a><span class="lineno"> 9313</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l09314"></a><span class="lineno"> 9314</span>&#160;        }</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;</div><div class="line"><a name="l09317"></a><span class="lineno"> 9317</span>&#160;    VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;Allocation to free not found in linear allocator!&quot;</span>);</div><div class="line"><a name="l09318"></a><span class="lineno"> 9318</span>&#160;}</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="keywordtype">bool</span> VmaBlockMetadata_Linear::ShouldCompact1st()<span class="keyword"> const</span></div><div class="line"><a name="l09321"></a><span class="lineno"> 9321</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09322"></a><span class="lineno"> 9322</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItemCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09323"></a><span class="lineno"> 9323</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballocCount = AccessSuballocations1st().size();</div><div class="line"><a name="l09324"></a><span class="lineno"> 9324</span>&#160;    <span class="keywordflow">return</span> suballocCount &gt; 32 &amp;&amp; nullItemCount * 2 &gt;= (suballocCount - nullItemCount) * 3;</div><div class="line"><a name="l09325"></a><span class="lineno"> 9325</span>&#160;}</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;<span class="keywordtype">void</span> VmaBlockMetadata_Linear::CleanupAfterFree()</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;    SuballocationVectorType&amp; suballocations1st = AccessSuballocations1st();</div><div class="line"><a name="l09330"></a><span class="lineno"> 9330</span>&#160;    SuballocationVectorType&amp; suballocations2nd = AccessSuballocations2nd();</div><div class="line"><a name="l09331"></a><span class="lineno"> 9331</span>&#160;</div><div class="line"><a name="l09332"></a><span class="lineno"> 9332</span>&#160;    <span class="keywordflow">if</span>(IsEmpty())</div><div class="line"><a name="l09333"></a><span class="lineno"> 9333</span>&#160;    {</div><div class="line"><a name="l09334"></a><span class="lineno"> 9334</span>&#160;        suballocations1st.clear();</div><div class="line"><a name="l09335"></a><span class="lineno"> 9335</span>&#160;        suballocations2nd.clear();</div><div class="line"><a name="l09336"></a><span class="lineno"> 9336</span>&#160;        m_1stNullItemsBeginCount = 0;</div><div class="line"><a name="l09337"></a><span class="lineno"> 9337</span>&#160;        m_1stNullItemsMiddleCount = 0;</div><div class="line"><a name="l09338"></a><span class="lineno"> 9338</span>&#160;        m_2ndNullItemsCount = 0;</div><div class="line"><a name="l09339"></a><span class="lineno"> 9339</span>&#160;        m_2ndVectorMode = SECOND_VECTOR_EMPTY;</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">else</span></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;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> suballoc1stCount = suballocations1st.size();</div><div class="line"><a name="l09344"></a><span class="lineno"> 9344</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> nullItem1stCount = m_1stNullItemsBeginCount + m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09345"></a><span class="lineno"> 9345</span>&#160;        VMA_ASSERT(nullItem1stCount &lt;= suballoc1stCount);</div><div class="line"><a name="l09346"></a><span class="lineno"> 9346</span>&#160;</div><div class="line"><a name="l09347"></a><span class="lineno"> 9347</span>&#160;        <span class="comment">// Find more null items at the beginning of 1st vector.</span></div><div class="line"><a name="l09348"></a><span class="lineno"> 9348</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballoc1stCount &amp;&amp;</div><div class="line"><a name="l09349"></a><span class="lineno"> 9349</span>&#160;            suballocations1st[m_1stNullItemsBeginCount].hAllocation == 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;            ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l09352"></a><span class="lineno"> 9352</span>&#160;            --m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09353"></a><span class="lineno"> 9353</span>&#160;        }</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;        <span class="comment">// Find more null items at the end of 1st vector.</span></div><div class="line"><a name="l09356"></a><span class="lineno"> 9356</span>&#160;        <span class="keywordflow">while</span>(m_1stNullItemsMiddleCount &gt; 0 &amp;&amp;</div><div class="line"><a name="l09357"></a><span class="lineno"> 9357</span>&#160;            suballocations1st.back().hAllocation == VK_NULL_HANDLE)</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;            --m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09360"></a><span class="lineno"> 9360</span>&#160;            suballocations1st.pop_back();</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="comment">// Find more null items at the end of 2nd vector.</span></div><div class="line"><a name="l09364"></a><span class="lineno"> 9364</span>&#160;        <span class="keywordflow">while</span>(m_2ndNullItemsCount &gt; 0 &amp;&amp;</div><div class="line"><a name="l09365"></a><span class="lineno"> 9365</span>&#160;            suballocations2nd.back().hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09366"></a><span class="lineno"> 9366</span>&#160;        {</div><div class="line"><a name="l09367"></a><span class="lineno"> 9367</span>&#160;            --m_2ndNullItemsCount;</div><div class="line"><a name="l09368"></a><span class="lineno"> 9368</span>&#160;            suballocations2nd.pop_back();</div><div class="line"><a name="l09369"></a><span class="lineno"> 9369</span>&#160;        }</div><div class="line"><a name="l09370"></a><span class="lineno"> 9370</span>&#160;</div><div class="line"><a name="l09371"></a><span class="lineno"> 9371</span>&#160;        <span class="keywordflow">if</span>(ShouldCompact1st())</div><div class="line"><a name="l09372"></a><span class="lineno"> 9372</span>&#160;        {</div><div class="line"><a name="l09373"></a><span class="lineno"> 9373</span>&#160;            <span class="keyword">const</span> <span class="keywordtype">size_t</span> nonNullItemCount = suballoc1stCount - nullItem1stCount;</div><div class="line"><a name="l09374"></a><span class="lineno"> 9374</span>&#160;            <span class="keywordtype">size_t</span> srcIndex = m_1stNullItemsBeginCount;</div><div class="line"><a name="l09375"></a><span class="lineno"> 9375</span>&#160;            <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> dstIndex = 0; dstIndex &lt; nonNullItemCount; ++dstIndex)</div><div class="line"><a name="l09376"></a><span class="lineno"> 9376</span>&#160;            {</div><div class="line"><a name="l09377"></a><span class="lineno"> 9377</span>&#160;                <span class="keywordflow">while</span>(suballocations1st[srcIndex].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09378"></a><span class="lineno"> 9378</span>&#160;                {</div><div class="line"><a name="l09379"></a><span class="lineno"> 9379</span>&#160;                    ++srcIndex;</div><div class="line"><a name="l09380"></a><span class="lineno"> 9380</span>&#160;                }</div><div class="line"><a name="l09381"></a><span class="lineno"> 9381</span>&#160;                <span class="keywordflow">if</span>(dstIndex != srcIndex)</div><div class="line"><a name="l09382"></a><span class="lineno"> 9382</span>&#160;                {</div><div class="line"><a name="l09383"></a><span class="lineno"> 9383</span>&#160;                    suballocations1st[dstIndex] = suballocations1st[srcIndex];</div><div class="line"><a name="l09384"></a><span class="lineno"> 9384</span>&#160;                }</div><div class="line"><a name="l09385"></a><span class="lineno"> 9385</span>&#160;                ++srcIndex;</div><div class="line"><a name="l09386"></a><span class="lineno"> 9386</span>&#160;            }</div><div class="line"><a name="l09387"></a><span class="lineno"> 9387</span>&#160;            suballocations1st.resize(nonNullItemCount);</div><div class="line"><a name="l09388"></a><span class="lineno"> 9388</span>&#160;            m_1stNullItemsBeginCount = 0;</div><div class="line"><a name="l09389"></a><span class="lineno"> 9389</span>&#160;            m_1stNullItemsMiddleCount = 0;</div><div class="line"><a name="l09390"></a><span class="lineno"> 9390</span>&#160;        }</div><div class="line"><a name="l09391"></a><span class="lineno"> 9391</span>&#160;</div><div class="line"><a name="l09392"></a><span class="lineno"> 9392</span>&#160;        <span class="comment">// 2nd vector became empty.</span></div><div class="line"><a name="l09393"></a><span class="lineno"> 9393</span>&#160;        <span class="keywordflow">if</span>(suballocations2nd.empty())</div><div class="line"><a name="l09394"></a><span class="lineno"> 9394</span>&#160;        {</div><div class="line"><a name="l09395"></a><span class="lineno"> 9395</span>&#160;            m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div><div class="line"><a name="l09396"></a><span class="lineno"> 9396</span>&#160;        }</div><div class="line"><a name="l09397"></a><span class="lineno"> 9397</span>&#160;</div><div class="line"><a name="l09398"></a><span class="lineno"> 9398</span>&#160;        <span class="comment">// 1st vector became empty.</span></div><div class="line"><a name="l09399"></a><span class="lineno"> 9399</span>&#160;        <span class="keywordflow">if</span>(suballocations1st.size() - m_1stNullItemsBeginCount == 0)</div><div class="line"><a name="l09400"></a><span class="lineno"> 9400</span>&#160;        {</div><div class="line"><a name="l09401"></a><span class="lineno"> 9401</span>&#160;            suballocations1st.clear();</div><div class="line"><a name="l09402"></a><span class="lineno"> 9402</span>&#160;            m_1stNullItemsBeginCount = 0;</div><div class="line"><a name="l09403"></a><span class="lineno"> 9403</span>&#160;</div><div class="line"><a name="l09404"></a><span class="lineno"> 9404</span>&#160;            <span class="keywordflow">if</span>(!suballocations2nd.empty() &amp;&amp; m_2ndVectorMode == SECOND_VECTOR_RING_BUFFER)</div><div class="line"><a name="l09405"></a><span class="lineno"> 9405</span>&#160;            {</div><div class="line"><a name="l09406"></a><span class="lineno"> 9406</span>&#160;                <span class="comment">// Swap 1st with 2nd. Now 2nd is empty.</span></div><div class="line"><a name="l09407"></a><span class="lineno"> 9407</span>&#160;                m_2ndVectorMode = SECOND_VECTOR_EMPTY;</div><div class="line"><a name="l09408"></a><span class="lineno"> 9408</span>&#160;                m_1stNullItemsMiddleCount = m_2ndNullItemsCount;</div><div class="line"><a name="l09409"></a><span class="lineno"> 9409</span>&#160;                <span class="keywordflow">while</span>(m_1stNullItemsBeginCount &lt; suballocations2nd.size() &amp;&amp;</div><div class="line"><a name="l09410"></a><span class="lineno"> 9410</span>&#160;                    suballocations2nd[m_1stNullItemsBeginCount].hAllocation == VK_NULL_HANDLE)</div><div class="line"><a name="l09411"></a><span class="lineno"> 9411</span>&#160;                {</div><div class="line"><a name="l09412"></a><span class="lineno"> 9412</span>&#160;                    ++m_1stNullItemsBeginCount;</div><div class="line"><a name="l09413"></a><span class="lineno"> 9413</span>&#160;                    --m_1stNullItemsMiddleCount;</div><div class="line"><a name="l09414"></a><span class="lineno"> 9414</span>&#160;                }</div><div class="line"><a name="l09415"></a><span class="lineno"> 9415</span>&#160;                m_2ndNullItemsCount = 0;</div><div class="line"><a name="l09416"></a><span class="lineno"> 9416</span>&#160;                m_1stVectorIndex ^= 1;</div><div class="line"><a name="l09417"></a><span class="lineno"> 9417</span>&#160;            }</div><div class="line"><a name="l09418"></a><span class="lineno"> 9418</span>&#160;        }</div><div class="line"><a name="l09419"></a><span class="lineno"> 9419</span>&#160;    }</div><div class="line"><a name="l09420"></a><span class="lineno"> 9420</span>&#160;</div><div class="line"><a name="l09421"></a><span class="lineno"> 9421</span>&#160;    VMA_HEAVY_ASSERT(Validate());</div><div class="line"><a name="l09422"></a><span class="lineno"> 9422</span>&#160;}</div><div class="line"><a name="l09423"></a><span class="lineno"> 9423</span>&#160;</div><div class="line"><a name="l09424"></a><span class="lineno"> 9424</span>&#160;</div><div class="line"><a name="l09426"></a><span class="lineno"> 9426</span>&#160;<span class="comment">// class VmaBlockMetadata_Buddy</span></div><div class="line"><a name="l09427"></a><span class="lineno"> 9427</span>&#160;</div><div class="line"><a name="l09428"></a><span class="lineno"> 9428</span>&#160;VmaBlockMetadata_Buddy::VmaBlockMetadata_Buddy(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l09429"></a><span class="lineno"> 9429</span>&#160;    VmaBlockMetadata(hAllocator),</div><div class="line"><a name="l09430"></a><span class="lineno"> 9430</span>&#160;    m_Root(VMA_NULL),</div><div class="line"><a name="l09431"></a><span class="lineno"> 9431</span>&#160;    m_AllocationCount(0),</div><div class="line"><a name="l09432"></a><span class="lineno"> 9432</span>&#160;    m_FreeCount(1),</div><div class="line"><a name="l09433"></a><span class="lineno"> 9433</span>&#160;    m_SumFreeSize(0)</div><div class="line"><a name="l09434"></a><span class="lineno"> 9434</span>&#160;{</div><div class="line"><a name="l09435"></a><span class="lineno"> 9435</span>&#160;    memset(m_FreeList, 0, <span class="keyword">sizeof</span>(m_FreeList));</div><div class="line"><a name="l09436"></a><span class="lineno"> 9436</span>&#160;}</div><div class="line"><a name="l09437"></a><span class="lineno"> 9437</span>&#160;</div><div class="line"><a name="l09438"></a><span class="lineno"> 9438</span>&#160;VmaBlockMetadata_Buddy::~VmaBlockMetadata_Buddy()</div><div class="line"><a name="l09439"></a><span class="lineno"> 9439</span>&#160;{</div><div class="line"><a name="l09440"></a><span class="lineno"> 9440</span>&#160;    DeleteNode(m_Root);</div><div class="line"><a name="l09441"></a><span class="lineno"> 9441</span>&#160;}</div><div class="line"><a name="l09442"></a><span class="lineno"> 9442</span>&#160;</div><div class="line"><a name="l09443"></a><span class="lineno"> 9443</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Init(VkDeviceSize size)</div><div class="line"><a name="l09444"></a><span class="lineno"> 9444</span>&#160;{</div><div class="line"><a name="l09445"></a><span class="lineno"> 9445</span>&#160;    VmaBlockMetadata::Init(size);</div><div class="line"><a name="l09446"></a><span class="lineno"> 9446</span>&#160;</div><div class="line"><a name="l09447"></a><span class="lineno"> 9447</span>&#160;    m_UsableSize = VmaPrevPow2(size);</div><div class="line"><a name="l09448"></a><span class="lineno"> 9448</span>&#160;    m_SumFreeSize = m_UsableSize;</div><div class="line"><a name="l09449"></a><span class="lineno"> 9449</span>&#160;</div><div class="line"><a name="l09450"></a><span class="lineno"> 9450</span>&#160;    <span class="comment">// Calculate m_LevelCount.</span></div><div class="line"><a name="l09451"></a><span class="lineno"> 9451</span>&#160;    m_LevelCount = 1;</div><div class="line"><a name="l09452"></a><span class="lineno"> 9452</span>&#160;    <span class="keywordflow">while</span>(m_LevelCount &lt; MAX_LEVELS &amp;&amp;</div><div class="line"><a name="l09453"></a><span class="lineno"> 9453</span>&#160;        LevelToNodeSize(m_LevelCount) &gt;= MIN_NODE_SIZE)</div><div class="line"><a name="l09454"></a><span class="lineno"> 9454</span>&#160;    {</div><div class="line"><a name="l09455"></a><span class="lineno"> 9455</span>&#160;        ++m_LevelCount;</div><div class="line"><a name="l09456"></a><span class="lineno"> 9456</span>&#160;    }</div><div class="line"><a name="l09457"></a><span class="lineno"> 9457</span>&#160;</div><div class="line"><a name="l09458"></a><span class="lineno"> 9458</span>&#160;    Node* rootNode = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l09459"></a><span class="lineno"> 9459</span>&#160;    rootNode-&gt;offset = 0;</div><div class="line"><a name="l09460"></a><span class="lineno"> 9460</span>&#160;    rootNode-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09461"></a><span class="lineno"> 9461</span>&#160;    rootNode-&gt;parent = VMA_NULL;</div><div class="line"><a name="l09462"></a><span class="lineno"> 9462</span>&#160;    rootNode-&gt;buddy = VMA_NULL;</div><div class="line"><a name="l09463"></a><span class="lineno"> 9463</span>&#160;</div><div class="line"><a name="l09464"></a><span class="lineno"> 9464</span>&#160;    m_Root = rootNode;</div><div class="line"><a name="l09465"></a><span class="lineno"> 9465</span>&#160;    AddToFreeListFront(0, rootNode);</div><div class="line"><a name="l09466"></a><span class="lineno"> 9466</span>&#160;}</div><div class="line"><a name="l09467"></a><span class="lineno"> 9467</span>&#160;</div><div class="line"><a name="l09468"></a><span class="lineno"> 9468</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l09469"></a><span class="lineno"> 9469</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09470"></a><span class="lineno"> 9470</span>&#160;    <span class="comment">// Validate tree.</span></div><div class="line"><a name="l09471"></a><span class="lineno"> 9471</span>&#160;    ValidationContext ctx;</div><div class="line"><a name="l09472"></a><span class="lineno"> 9472</span>&#160;    <span class="keywordflow">if</span>(!ValidateNode(ctx, VMA_NULL, m_Root, 0, LevelToNodeSize(0)))</div><div class="line"><a name="l09473"></a><span class="lineno"> 9473</span>&#160;    {</div><div class="line"><a name="l09474"></a><span class="lineno"> 9474</span>&#160;        VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode failed.&quot;</span>);</div><div class="line"><a name="l09475"></a><span class="lineno"> 9475</span>&#160;    }</div><div class="line"><a name="l09476"></a><span class="lineno"> 9476</span>&#160;    VMA_VALIDATE(m_AllocationCount == ctx.calculatedAllocationCount);</div><div class="line"><a name="l09477"></a><span class="lineno"> 9477</span>&#160;    VMA_VALIDATE(m_SumFreeSize == ctx.calculatedSumFreeSize);</div><div class="line"><a name="l09478"></a><span class="lineno"> 9478</span>&#160;</div><div class="line"><a name="l09479"></a><span class="lineno"> 9479</span>&#160;    <span class="comment">// Validate free node lists.</span></div><div class="line"><a name="l09480"></a><span class="lineno"> 9480</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div><div class="line"><a name="l09481"></a><span class="lineno"> 9481</span>&#160;    {</div><div class="line"><a name="l09482"></a><span class="lineno"> 9482</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL ||</div><div class="line"><a name="l09483"></a><span class="lineno"> 9483</span>&#160;            m_FreeList[level].front-&gt;free.prev == VMA_NULL);</div><div class="line"><a name="l09484"></a><span class="lineno"> 9484</span>&#160;</div><div class="line"><a name="l09485"></a><span class="lineno"> 9485</span>&#160;        <span class="keywordflow">for</span>(Node* node = m_FreeList[level].front;</div><div class="line"><a name="l09486"></a><span class="lineno"> 9486</span>&#160;            node != VMA_NULL;</div><div class="line"><a name="l09487"></a><span class="lineno"> 9487</span>&#160;            node = node-&gt;free.next)</div><div class="line"><a name="l09488"></a><span class="lineno"> 9488</span>&#160;        {</div><div class="line"><a name="l09489"></a><span class="lineno"> 9489</span>&#160;            VMA_VALIDATE(node-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09490"></a><span class="lineno"> 9490</span>&#160;            </div><div class="line"><a name="l09491"></a><span class="lineno"> 9491</span>&#160;            <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div><div class="line"><a name="l09492"></a><span class="lineno"> 9492</span>&#160;            {</div><div class="line"><a name="l09493"></a><span class="lineno"> 9493</span>&#160;                VMA_VALIDATE(m_FreeList[level].back == node);</div><div class="line"><a name="l09494"></a><span class="lineno"> 9494</span>&#160;            }</div><div class="line"><a name="l09495"></a><span class="lineno"> 9495</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l09496"></a><span class="lineno"> 9496</span>&#160;            {</div><div class="line"><a name="l09497"></a><span class="lineno"> 9497</span>&#160;                VMA_VALIDATE(node-&gt;free.next-&gt;free.prev == node);</div><div class="line"><a name="l09498"></a><span class="lineno"> 9498</span>&#160;            }</div><div class="line"><a name="l09499"></a><span class="lineno"> 9499</span>&#160;        }</div><div class="line"><a name="l09500"></a><span class="lineno"> 9500</span>&#160;    }</div><div class="line"><a name="l09501"></a><span class="lineno"> 9501</span>&#160;</div><div class="line"><a name="l09502"></a><span class="lineno"> 9502</span>&#160;    <span class="comment">// Validate that free lists ar higher levels are empty.</span></div><div class="line"><a name="l09503"></a><span class="lineno"> 9503</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = m_LevelCount; level &lt; MAX_LEVELS; ++level)</div><div class="line"><a name="l09504"></a><span class="lineno"> 9504</span>&#160;    {</div><div class="line"><a name="l09505"></a><span class="lineno"> 9505</span>&#160;        VMA_VALIDATE(m_FreeList[level].front == VMA_NULL &amp;&amp; m_FreeList[level].back == VMA_NULL);</div><div class="line"><a name="l09506"></a><span class="lineno"> 9506</span>&#160;    }</div><div class="line"><a name="l09507"></a><span class="lineno"> 9507</span>&#160;</div><div class="line"><a name="l09508"></a><span class="lineno"> 9508</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09509"></a><span class="lineno"> 9509</span>&#160;}</div><div class="line"><a name="l09510"></a><span class="lineno"> 9510</span>&#160;</div><div class="line"><a name="l09511"></a><span class="lineno"> 9511</span>&#160;VkDeviceSize VmaBlockMetadata_Buddy::GetUnusedRangeSizeMax()<span class="keyword"> const</span></div><div class="line"><a name="l09512"></a><span class="lineno"> 9512</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09513"></a><span class="lineno"> 9513</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = 0; level &lt; m_LevelCount; ++level)</div><div class="line"><a name="l09514"></a><span class="lineno"> 9514</span>&#160;    {</div><div class="line"><a name="l09515"></a><span class="lineno"> 9515</span>&#160;        <span class="keywordflow">if</span>(m_FreeList[level].front != VMA_NULL)</div><div class="line"><a name="l09516"></a><span class="lineno"> 9516</span>&#160;        {</div><div class="line"><a name="l09517"></a><span class="lineno"> 9517</span>&#160;            <span class="keywordflow">return</span> LevelToNodeSize(level);</div><div class="line"><a name="l09518"></a><span class="lineno"> 9518</span>&#160;        }</div><div class="line"><a name="l09519"></a><span class="lineno"> 9519</span>&#160;    }</div><div class="line"><a name="l09520"></a><span class="lineno"> 9520</span>&#160;    <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l09521"></a><span class="lineno"> 9521</span>&#160;}</div><div class="line"><a name="l09522"></a><span class="lineno"> 9522</span>&#160;</div><div class="line"><a name="l09523"></a><span class="lineno"> 9523</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::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="l09524"></a><span class="lineno"> 9524</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09525"></a><span class="lineno"> 9525</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div><div class="line"><a name="l09526"></a><span class="lineno"> 9526</span>&#160;</div><div class="line"><a name="l09527"></a><span class="lineno"> 9527</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#abc4bb7cd611900778464c56e50c970a4">blockCount</a> = 1;</div><div class="line"><a name="l09528"></a><span class="lineno"> 9528</span>&#160;</div><div class="line"><a name="l09529"></a><span class="lineno"> 9529</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a> = 0;</div><div class="line"><a name="l09530"></a><span class="lineno"> 9530</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> = 0;</div><div class="line"><a name="l09531"></a><span class="lineno"> 9531</span>&#160;</div><div class="line"><a name="l09532"></a><span class="lineno"> 9532</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a17e9733a5ecd76287d4db6e66f71f50c">allocationSizeMax</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a5ba1a2476c4d39b10f7e2f7ebbb72ac4">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l09533"></a><span class="lineno"> 9533</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#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l09534"></a><span class="lineno"> 9534</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#a1081a039964e566c672e7a2347f9e599">allocationSizeAvg</a> = outInfo.<a class="code" href="struct_vma_stat_info.html#a2f9b3452af90c9768a30b7fb6ae194fc">unusedRangeSizeAvg</a> = 0; <span class="comment">// Unused.</span></div><div class="line"><a name="l09535"></a><span class="lineno"> 9535</span>&#160;</div><div class="line"><a name="l09536"></a><span class="lineno"> 9536</span>&#160;    CalcAllocationStatInfoNode(outInfo, m_Root, LevelToNodeSize(0));</div><div class="line"><a name="l09537"></a><span class="lineno"> 9537</span>&#160;</div><div class="line"><a name="l09538"></a><span class="lineno"> 9538</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div><div class="line"><a name="l09539"></a><span class="lineno"> 9539</span>&#160;    {</div><div class="line"><a name="l09540"></a><span class="lineno"> 9540</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09541"></a><span class="lineno"> 9541</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusableSize;</div><div class="line"><a name="l09542"></a><span class="lineno"> 9542</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>, unusableSize);</div><div class="line"><a name="l09543"></a><span class="lineno"> 9543</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>, unusableSize);</div><div class="line"><a name="l09544"></a><span class="lineno"> 9544</span>&#160;    }</div><div class="line"><a name="l09545"></a><span class="lineno"> 9545</span>&#160;}</div><div class="line"><a name="l09546"></a><span class="lineno"> 9546</span>&#160;</div><div class="line"><a name="l09547"></a><span class="lineno"> 9547</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::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="l09548"></a><span class="lineno"> 9548</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09549"></a><span class="lineno"> 9549</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div><div class="line"><a name="l09550"></a><span class="lineno"> 9550</span>&#160;</div><div class="line"><a name="l09551"></a><span class="lineno"> 9551</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> += GetSize();</div><div class="line"><a name="l09552"></a><span class="lineno"> 9552</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> += m_SumFreeSize + unusableSize;</div><div class="line"><a name="l09553"></a><span class="lineno"> 9553</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> += m_AllocationCount;</div><div class="line"><a name="l09554"></a><span class="lineno"> 9554</span>&#160;    inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> += m_FreeCount;</div><div class="line"><a name="l09555"></a><span class="lineno"> 9555</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="l09556"></a><span class="lineno"> 9556</span>&#160;</div><div class="line"><a name="l09557"></a><span class="lineno"> 9557</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div><div class="line"><a name="l09558"></a><span class="lineno"> 9558</span>&#160;    {</div><div class="line"><a name="l09559"></a><span class="lineno"> 9559</span>&#160;        ++inoutStats.<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a>;</div><div class="line"><a name="l09560"></a><span class="lineno"> 9560</span>&#160;        <span class="comment">// Not updating inoutStats.unusedRangeSizeMax with unusableSize because this space is not available for allocations.</span></div><div class="line"><a name="l09561"></a><span class="lineno"> 9561</span>&#160;    }</div><div class="line"><a name="l09562"></a><span class="lineno"> 9562</span>&#160;}</div><div class="line"><a name="l09563"></a><span class="lineno"> 9563</span>&#160;</div><div class="line"><a name="l09564"></a><span class="lineno"> 9564</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09565"></a><span class="lineno"> 9565</span>&#160;</div><div class="line"><a name="l09566"></a><span class="lineno"> 9566</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)<span class="keyword"> const</span></div><div class="line"><a name="l09567"></a><span class="lineno"> 9567</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09568"></a><span class="lineno"> 9568</span>&#160;    <span class="comment">// TODO optimize</span></div><div class="line"><a name="l09569"></a><span class="lineno"> 9569</span>&#160;    <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> stat;</div><div class="line"><a name="l09570"></a><span class="lineno"> 9570</span>&#160;    CalcAllocationStatInfo(stat);</div><div class="line"><a name="l09571"></a><span class="lineno"> 9571</span>&#160;</div><div class="line"><a name="l09572"></a><span class="lineno"> 9572</span>&#160;    PrintDetailedMap_Begin(</div><div class="line"><a name="l09573"></a><span class="lineno"> 9573</span>&#160;        json,</div><div class="line"><a name="l09574"></a><span class="lineno"> 9574</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a>,</div><div class="line"><a name="l09575"></a><span class="lineno"> 9575</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>,</div><div class="line"><a name="l09576"></a><span class="lineno"> 9576</span>&#160;        stat.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>);</div><div class="line"><a name="l09577"></a><span class="lineno"> 9577</span>&#160;</div><div class="line"><a name="l09578"></a><span class="lineno"> 9578</span>&#160;    PrintDetailedMapNode(json, m_Root, LevelToNodeSize(0));</div><div class="line"><a name="l09579"></a><span class="lineno"> 9579</span>&#160;</div><div class="line"><a name="l09580"></a><span class="lineno"> 9580</span>&#160;    <span class="keyword">const</span> VkDeviceSize unusableSize = GetUnusableSize();</div><div class="line"><a name="l09581"></a><span class="lineno"> 9581</span>&#160;    <span class="keywordflow">if</span>(unusableSize &gt; 0)</div><div class="line"><a name="l09582"></a><span class="lineno"> 9582</span>&#160;    {</div><div class="line"><a name="l09583"></a><span class="lineno"> 9583</span>&#160;        PrintDetailedMap_UnusedRange(json,</div><div class="line"><a name="l09584"></a><span class="lineno"> 9584</span>&#160;            m_UsableSize, <span class="comment">// offset</span></div><div class="line"><a name="l09585"></a><span class="lineno"> 9585</span>&#160;            unusableSize); <span class="comment">// size</span></div><div class="line"><a name="l09586"></a><span class="lineno"> 9586</span>&#160;    }</div><div class="line"><a name="l09587"></a><span class="lineno"> 9587</span>&#160;</div><div class="line"><a name="l09588"></a><span class="lineno"> 9588</span>&#160;    PrintDetailedMap_End(json);</div><div class="line"><a name="l09589"></a><span class="lineno"> 9589</span>&#160;}</div><div class="line"><a name="l09590"></a><span class="lineno"> 9590</span>&#160;</div><div class="line"><a name="l09591"></a><span class="lineno"> 9591</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09592"></a><span class="lineno"> 9592</span>&#160;</div><div class="line"><a name="l09593"></a><span class="lineno"> 9593</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::CreateAllocationRequest(</div><div class="line"><a name="l09594"></a><span class="lineno"> 9594</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09595"></a><span class="lineno"> 9595</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09596"></a><span class="lineno"> 9596</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l09597"></a><span class="lineno"> 9597</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09598"></a><span class="lineno"> 9598</span>&#160;    VkDeviceSize allocAlignment,</div><div class="line"><a name="l09599"></a><span class="lineno"> 9599</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l09600"></a><span class="lineno"> 9600</span>&#160;    VmaSuballocationType allocType,</div><div class="line"><a name="l09601"></a><span class="lineno"> 9601</span>&#160;    <span class="keywordtype">bool</span> canMakeOtherLost,</div><div class="line"><a name="l09602"></a><span class="lineno"> 9602</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l09603"></a><span class="lineno"> 9603</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l09604"></a><span class="lineno"> 9604</span>&#160;{</div><div class="line"><a name="l09605"></a><span class="lineno"> 9605</span>&#160;    VMA_ASSERT(!upperAddress &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT can be used only with linear algorithm.&quot;</span>);</div><div class="line"><a name="l09606"></a><span class="lineno"> 9606</span>&#160;</div><div class="line"><a name="l09607"></a><span class="lineno"> 9607</span>&#160;    <span class="comment">// Simple way to respect bufferImageGranularity. May be optimized some day.</span></div><div class="line"><a name="l09608"></a><span class="lineno"> 9608</span>&#160;    <span class="comment">// Whenever it might be an OPTIMAL image...</span></div><div class="line"><a name="l09609"></a><span class="lineno"> 9609</span>&#160;    <span class="keywordflow">if</span>(allocType == VMA_SUBALLOCATION_TYPE_UNKNOWN ||</div><div class="line"><a name="l09610"></a><span class="lineno"> 9610</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN ||</div><div class="line"><a name="l09611"></a><span class="lineno"> 9611</span>&#160;        allocType == VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL)</div><div class="line"><a name="l09612"></a><span class="lineno"> 9612</span>&#160;    {</div><div class="line"><a name="l09613"></a><span class="lineno"> 9613</span>&#160;        allocAlignment = VMA_MAX(allocAlignment, bufferImageGranularity);</div><div class="line"><a name="l09614"></a><span class="lineno"> 9614</span>&#160;        allocSize = VMA_MAX(allocSize, bufferImageGranularity);</div><div class="line"><a name="l09615"></a><span class="lineno"> 9615</span>&#160;    }</div><div class="line"><a name="l09616"></a><span class="lineno"> 9616</span>&#160;</div><div class="line"><a name="l09617"></a><span class="lineno"> 9617</span>&#160;    <span class="keywordflow">if</span>(allocSize &gt; m_UsableSize)</div><div class="line"><a name="l09618"></a><span class="lineno"> 9618</span>&#160;    {</div><div class="line"><a name="l09619"></a><span class="lineno"> 9619</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09620"></a><span class="lineno"> 9620</span>&#160;    }</div><div class="line"><a name="l09621"></a><span class="lineno"> 9621</span>&#160;</div><div class="line"><a name="l09622"></a><span class="lineno"> 9622</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div><div class="line"><a name="l09623"></a><span class="lineno"> 9623</span>&#160;    <span class="keywordflow">for</span>(uint32_t level = targetLevel + 1; level--; )</div><div class="line"><a name="l09624"></a><span class="lineno"> 9624</span>&#160;    {</div><div class="line"><a name="l09625"></a><span class="lineno"> 9625</span>&#160;        <span class="keywordflow">for</span>(Node* freeNode = m_FreeList[level].front;</div><div class="line"><a name="l09626"></a><span class="lineno"> 9626</span>&#160;            freeNode != VMA_NULL;</div><div class="line"><a name="l09627"></a><span class="lineno"> 9627</span>&#160;            freeNode = freeNode-&gt;free.next)</div><div class="line"><a name="l09628"></a><span class="lineno"> 9628</span>&#160;        {</div><div class="line"><a name="l09629"></a><span class="lineno"> 9629</span>&#160;            <span class="keywordflow">if</span>(freeNode-&gt;offset % allocAlignment == 0)</div><div class="line"><a name="l09630"></a><span class="lineno"> 9630</span>&#160;            {</div><div class="line"><a name="l09631"></a><span class="lineno"> 9631</span>&#160;                pAllocationRequest-&gt;offset = freeNode-&gt;offset;</div><div class="line"><a name="l09632"></a><span class="lineno"> 9632</span>&#160;                pAllocationRequest-&gt;sumFreeSize = LevelToNodeSize(level);</div><div class="line"><a name="l09633"></a><span class="lineno"> 9633</span>&#160;                pAllocationRequest-&gt;sumItemSize = 0;</div><div class="line"><a name="l09634"></a><span class="lineno"> 9634</span>&#160;                pAllocationRequest-&gt;itemsToMakeLostCount = 0;</div><div class="line"><a name="l09635"></a><span class="lineno"> 9635</span>&#160;                pAllocationRequest-&gt;customData = (<span class="keywordtype">void</span>*)(uintptr_t)level;</div><div class="line"><a name="l09636"></a><span class="lineno"> 9636</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09637"></a><span class="lineno"> 9637</span>&#160;            }</div><div class="line"><a name="l09638"></a><span class="lineno"> 9638</span>&#160;        }</div><div class="line"><a name="l09639"></a><span class="lineno"> 9639</span>&#160;    }</div><div class="line"><a name="l09640"></a><span class="lineno"> 9640</span>&#160;</div><div class="line"><a name="l09641"></a><span class="lineno"> 9641</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09642"></a><span class="lineno"> 9642</span>&#160;}</div><div class="line"><a name="l09643"></a><span class="lineno"> 9643</span>&#160;</div><div class="line"><a name="l09644"></a><span class="lineno"> 9644</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::MakeRequestedAllocationsLost(</div><div class="line"><a name="l09645"></a><span class="lineno"> 9645</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l09646"></a><span class="lineno"> 9646</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l09647"></a><span class="lineno"> 9647</span>&#160;    VmaAllocationRequest* pAllocationRequest)</div><div class="line"><a name="l09648"></a><span class="lineno"> 9648</span>&#160;{</div><div class="line"><a name="l09649"></a><span class="lineno"> 9649</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l09650"></a><span class="lineno"> 9650</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div><div class="line"><a name="l09651"></a><span class="lineno"> 9651</span>&#160;<span class="comment">    Support might be added in the future.</span></div><div class="line"><a name="l09652"></a><span class="lineno"> 9652</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l09653"></a><span class="lineno"> 9653</span>&#160;    <span class="keywordflow">return</span> pAllocationRequest-&gt;itemsToMakeLostCount == 0;</div><div class="line"><a name="l09654"></a><span class="lineno"> 9654</span>&#160;}</div><div class="line"><a name="l09655"></a><span class="lineno"> 9655</span>&#160;</div><div class="line"><a name="l09656"></a><span class="lineno"> 9656</span>&#160;uint32_t VmaBlockMetadata_Buddy::MakeAllocationsLost(uint32_t currentFrameIndex, uint32_t frameInUseCount)</div><div class="line"><a name="l09657"></a><span class="lineno"> 9657</span>&#160;{</div><div class="line"><a name="l09658"></a><span class="lineno"> 9658</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l09659"></a><span class="lineno"> 9659</span>&#160;<span class="comment">    Lost allocations are not supported in buddy allocator at the moment.</span></div><div class="line"><a name="l09660"></a><span class="lineno"> 9660</span>&#160;<span class="comment">    Support might be added in the future.</span></div><div class="line"><a name="l09661"></a><span class="lineno"> 9661</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l09662"></a><span class="lineno"> 9662</span>&#160;    <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l09663"></a><span class="lineno"> 9663</span>&#160;}</div><div class="line"><a name="l09664"></a><span class="lineno"> 9664</span>&#160;</div><div class="line"><a name="l09665"></a><span class="lineno"> 9665</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::Alloc(</div><div class="line"><a name="l09666"></a><span class="lineno"> 9666</span>&#160;    <span class="keyword">const</span> VmaAllocationRequest&amp; request,</div><div class="line"><a name="l09667"></a><span class="lineno"> 9667</span>&#160;    VmaSuballocationType type,</div><div class="line"><a name="l09668"></a><span class="lineno"> 9668</span>&#160;    VkDeviceSize allocSize,</div><div class="line"><a name="l09669"></a><span class="lineno"> 9669</span>&#160;    <span class="keywordtype">bool</span> upperAddress,</div><div class="line"><a name="l09670"></a><span class="lineno"> 9670</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l09671"></a><span class="lineno"> 9671</span>&#160;{</div><div class="line"><a name="l09672"></a><span class="lineno"> 9672</span>&#160;    <span class="keyword">const</span> uint32_t targetLevel = AllocSizeToLevel(allocSize);</div><div class="line"><a name="l09673"></a><span class="lineno"> 9673</span>&#160;    uint32_t currLevel = (uint32_t)(uintptr_t)request.customData;</div><div class="line"><a name="l09674"></a><span class="lineno"> 9674</span>&#160;    </div><div class="line"><a name="l09675"></a><span class="lineno"> 9675</span>&#160;    Node* currNode = m_FreeList[currLevel].front;</div><div class="line"><a name="l09676"></a><span class="lineno"> 9676</span>&#160;    VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09677"></a><span class="lineno"> 9677</span>&#160;    <span class="keywordflow">while</span>(currNode-&gt;offset != request.offset)</div><div class="line"><a name="l09678"></a><span class="lineno"> 9678</span>&#160;    {</div><div class="line"><a name="l09679"></a><span class="lineno"> 9679</span>&#160;        currNode = currNode-&gt;free.next;</div><div class="line"><a name="l09680"></a><span class="lineno"> 9680</span>&#160;        VMA_ASSERT(currNode != VMA_NULL &amp;&amp; currNode-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09681"></a><span class="lineno"> 9681</span>&#160;    }</div><div class="line"><a name="l09682"></a><span class="lineno"> 9682</span>&#160;    </div><div class="line"><a name="l09683"></a><span class="lineno"> 9683</span>&#160;    <span class="comment">// Go down, splitting free nodes.</span></div><div class="line"><a name="l09684"></a><span class="lineno"> 9684</span>&#160;    <span class="keywordflow">while</span>(currLevel &lt; targetLevel)</div><div class="line"><a name="l09685"></a><span class="lineno"> 9685</span>&#160;    {</div><div class="line"><a name="l09686"></a><span class="lineno"> 9686</span>&#160;        <span class="comment">// currNode is already first free node at currLevel.</span></div><div class="line"><a name="l09687"></a><span class="lineno"> 9687</span>&#160;        <span class="comment">// Remove it from list of free nodes at this currLevel.</span></div><div class="line"><a name="l09688"></a><span class="lineno"> 9688</span>&#160;        RemoveFromFreeList(currLevel, currNode);</div><div class="line"><a name="l09689"></a><span class="lineno"> 9689</span>&#160;         </div><div class="line"><a name="l09690"></a><span class="lineno"> 9690</span>&#160;        <span class="keyword">const</span> uint32_t childrenLevel = currLevel + 1;</div><div class="line"><a name="l09691"></a><span class="lineno"> 9691</span>&#160;</div><div class="line"><a name="l09692"></a><span class="lineno"> 9692</span>&#160;        <span class="comment">// Create two free sub-nodes.</span></div><div class="line"><a name="l09693"></a><span class="lineno"> 9693</span>&#160;        Node* leftChild = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l09694"></a><span class="lineno"> 9694</span>&#160;        Node* rightChild = vma_new(GetAllocationCallbacks(), Node)();</div><div class="line"><a name="l09695"></a><span class="lineno"> 9695</span>&#160;</div><div class="line"><a name="l09696"></a><span class="lineno"> 9696</span>&#160;        leftChild-&gt;offset = currNode-&gt;offset;</div><div class="line"><a name="l09697"></a><span class="lineno"> 9697</span>&#160;        leftChild-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09698"></a><span class="lineno"> 9698</span>&#160;        leftChild-&gt;parent = currNode;</div><div class="line"><a name="l09699"></a><span class="lineno"> 9699</span>&#160;        leftChild-&gt;buddy = rightChild;</div><div class="line"><a name="l09700"></a><span class="lineno"> 9700</span>&#160;</div><div class="line"><a name="l09701"></a><span class="lineno"> 9701</span>&#160;        rightChild-&gt;offset = currNode-&gt;offset + LevelToNodeSize(childrenLevel);</div><div class="line"><a name="l09702"></a><span class="lineno"> 9702</span>&#160;        rightChild-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09703"></a><span class="lineno"> 9703</span>&#160;        rightChild-&gt;parent = currNode;</div><div class="line"><a name="l09704"></a><span class="lineno"> 9704</span>&#160;        rightChild-&gt;buddy = leftChild;</div><div class="line"><a name="l09705"></a><span class="lineno"> 9705</span>&#160;</div><div class="line"><a name="l09706"></a><span class="lineno"> 9706</span>&#160;        <span class="comment">// Convert current currNode to split type.</span></div><div class="line"><a name="l09707"></a><span class="lineno"> 9707</span>&#160;        currNode-&gt;type = Node::TYPE_SPLIT;</div><div class="line"><a name="l09708"></a><span class="lineno"> 9708</span>&#160;        currNode-&gt;split.leftChild = leftChild;</div><div class="line"><a name="l09709"></a><span class="lineno"> 9709</span>&#160;</div><div class="line"><a name="l09710"></a><span class="lineno"> 9710</span>&#160;        <span class="comment">// Add child nodes to free list. Order is important!</span></div><div class="line"><a name="l09711"></a><span class="lineno"> 9711</span>&#160;        AddToFreeListFront(childrenLevel, rightChild);</div><div class="line"><a name="l09712"></a><span class="lineno"> 9712</span>&#160;        AddToFreeListFront(childrenLevel, leftChild);</div><div class="line"><a name="l09713"></a><span class="lineno"> 9713</span>&#160;</div><div class="line"><a name="l09714"></a><span class="lineno"> 9714</span>&#160;        ++m_FreeCount;</div><div class="line"><a name="l09715"></a><span class="lineno"> 9715</span>&#160;        <span class="comment">//m_SumFreeSize -= LevelToNodeSize(currLevel) % 2; // Useful only when level node sizes can be non power of 2.</span></div><div class="line"><a name="l09716"></a><span class="lineno"> 9716</span>&#160;        ++currLevel;</div><div class="line"><a name="l09717"></a><span class="lineno"> 9717</span>&#160;        currNode = m_FreeList[currLevel].front;</div><div class="line"><a name="l09718"></a><span class="lineno"> 9718</span>&#160;</div><div class="line"><a name="l09719"></a><span class="lineno"> 9719</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l09720"></a><span class="lineno"> 9720</span>&#160;<span class="comment">        We can be sure that currNode, as left child of node previously split,</span></div><div class="line"><a name="l09721"></a><span class="lineno"> 9721</span>&#160;<span class="comment">        also fullfills the alignment requirement.</span></div><div class="line"><a name="l09722"></a><span class="lineno"> 9722</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l09723"></a><span class="lineno"> 9723</span>&#160;    }</div><div class="line"><a name="l09724"></a><span class="lineno"> 9724</span>&#160;</div><div class="line"><a name="l09725"></a><span class="lineno"> 9725</span>&#160;    <span class="comment">// Remove from free list.</span></div><div class="line"><a name="l09726"></a><span class="lineno"> 9726</span>&#160;    VMA_ASSERT(currLevel == targetLevel &amp;&amp;</div><div class="line"><a name="l09727"></a><span class="lineno"> 9727</span>&#160;        currNode != VMA_NULL &amp;&amp;</div><div class="line"><a name="l09728"></a><span class="lineno"> 9728</span>&#160;        currNode-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09729"></a><span class="lineno"> 9729</span>&#160;    RemoveFromFreeList(currLevel, currNode);</div><div class="line"><a name="l09730"></a><span class="lineno"> 9730</span>&#160;</div><div class="line"><a name="l09731"></a><span class="lineno"> 9731</span>&#160;    <span class="comment">// Convert to allocation node.</span></div><div class="line"><a name="l09732"></a><span class="lineno"> 9732</span>&#160;    currNode-&gt;type = Node::TYPE_ALLOCATION;</div><div class="line"><a name="l09733"></a><span class="lineno"> 9733</span>&#160;    currNode-&gt;allocation.alloc = hAllocation;</div><div class="line"><a name="l09734"></a><span class="lineno"> 9734</span>&#160;</div><div class="line"><a name="l09735"></a><span class="lineno"> 9735</span>&#160;    ++m_AllocationCount;</div><div class="line"><a name="l09736"></a><span class="lineno"> 9736</span>&#160;    --m_FreeCount;</div><div class="line"><a name="l09737"></a><span class="lineno"> 9737</span>&#160;    m_SumFreeSize -= allocSize;</div><div class="line"><a name="l09738"></a><span class="lineno"> 9738</span>&#160;}</div><div class="line"><a name="l09739"></a><span class="lineno"> 9739</span>&#160;</div><div class="line"><a name="l09740"></a><span class="lineno"> 9740</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::DeleteNode(Node* node)</div><div class="line"><a name="l09741"></a><span class="lineno"> 9741</span>&#160;{</div><div class="line"><a name="l09742"></a><span class="lineno"> 9742</span>&#160;    <span class="keywordflow">if</span>(node-&gt;type == Node::TYPE_SPLIT)</div><div class="line"><a name="l09743"></a><span class="lineno"> 9743</span>&#160;    {</div><div class="line"><a name="l09744"></a><span class="lineno"> 9744</span>&#160;        DeleteNode(node-&gt;split.leftChild-&gt;buddy);</div><div class="line"><a name="l09745"></a><span class="lineno"> 9745</span>&#160;        DeleteNode(node-&gt;split.leftChild);</div><div class="line"><a name="l09746"></a><span class="lineno"> 9746</span>&#160;    }</div><div class="line"><a name="l09747"></a><span class="lineno"> 9747</span>&#160;</div><div class="line"><a name="l09748"></a><span class="lineno"> 9748</span>&#160;    vma_delete(GetAllocationCallbacks(), node);</div><div class="line"><a name="l09749"></a><span class="lineno"> 9749</span>&#160;}</div><div class="line"><a name="l09750"></a><span class="lineno"> 9750</span>&#160;</div><div class="line"><a name="l09751"></a><span class="lineno"> 9751</span>&#160;<span class="keywordtype">bool</span> VmaBlockMetadata_Buddy::ValidateNode(ValidationContext&amp; ctx, <span class="keyword">const</span> Node* parent, <span class="keyword">const</span> Node* curr, uint32_t level, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div><div class="line"><a name="l09752"></a><span class="lineno"> 9752</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09753"></a><span class="lineno"> 9753</span>&#160;    VMA_VALIDATE(level &lt; m_LevelCount);</div><div class="line"><a name="l09754"></a><span class="lineno"> 9754</span>&#160;    VMA_VALIDATE(curr-&gt;parent == parent);</div><div class="line"><a name="l09755"></a><span class="lineno"> 9755</span>&#160;    VMA_VALIDATE((curr-&gt;buddy == VMA_NULL) == (parent == VMA_NULL));</div><div class="line"><a name="l09756"></a><span class="lineno"> 9756</span>&#160;    VMA_VALIDATE(curr-&gt;buddy == VMA_NULL || curr-&gt;buddy-&gt;buddy == curr);</div><div class="line"><a name="l09757"></a><span class="lineno"> 9757</span>&#160;    <span class="keywordflow">switch</span>(curr-&gt;type)</div><div class="line"><a name="l09758"></a><span class="lineno"> 9758</span>&#160;    {</div><div class="line"><a name="l09759"></a><span class="lineno"> 9759</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l09760"></a><span class="lineno"> 9760</span>&#160;        <span class="comment">// curr-&gt;free.prev, next are validated separately.</span></div><div class="line"><a name="l09761"></a><span class="lineno"> 9761</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize;</div><div class="line"><a name="l09762"></a><span class="lineno"> 9762</span>&#160;        ++ctx.calculatedFreeCount;</div><div class="line"><a name="l09763"></a><span class="lineno"> 9763</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09764"></a><span class="lineno"> 9764</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div><div class="line"><a name="l09765"></a><span class="lineno"> 9765</span>&#160;        ++ctx.calculatedAllocationCount;</div><div class="line"><a name="l09766"></a><span class="lineno"> 9766</span>&#160;        ctx.calculatedSumFreeSize += levelNodeSize - curr-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l09767"></a><span class="lineno"> 9767</span>&#160;        VMA_VALIDATE(curr-&gt;allocation.alloc != VK_NULL_HANDLE);</div><div class="line"><a name="l09768"></a><span class="lineno"> 9768</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09769"></a><span class="lineno"> 9769</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div><div class="line"><a name="l09770"></a><span class="lineno"> 9770</span>&#160;        {</div><div class="line"><a name="l09771"></a><span class="lineno"> 9771</span>&#160;            <span class="keyword">const</span> uint32_t childrenLevel = level + 1;</div><div class="line"><a name="l09772"></a><span class="lineno"> 9772</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenLevelNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l09773"></a><span class="lineno"> 9773</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = curr-&gt;split.leftChild;</div><div class="line"><a name="l09774"></a><span class="lineno"> 9774</span>&#160;            VMA_VALIDATE(leftChild != VMA_NULL);</div><div class="line"><a name="l09775"></a><span class="lineno"> 9775</span>&#160;            VMA_VALIDATE(leftChild-&gt;offset == curr-&gt;offset);</div><div class="line"><a name="l09776"></a><span class="lineno"> 9776</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, leftChild, childrenLevel, childrenLevelNodeSize))</div><div class="line"><a name="l09777"></a><span class="lineno"> 9777</span>&#160;            {</div><div class="line"><a name="l09778"></a><span class="lineno"> 9778</span>&#160;                VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode for left child failed.&quot;</span>);</div><div class="line"><a name="l09779"></a><span class="lineno"> 9779</span>&#160;            }</div><div class="line"><a name="l09780"></a><span class="lineno"> 9780</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l09781"></a><span class="lineno"> 9781</span>&#160;            VMA_VALIDATE(rightChild-&gt;offset == curr-&gt;offset + childrenLevelNodeSize);</div><div class="line"><a name="l09782"></a><span class="lineno"> 9782</span>&#160;            <span class="keywordflow">if</span>(!ValidateNode(ctx, curr, rightChild, childrenLevel, childrenLevelNodeSize))</div><div class="line"><a name="l09783"></a><span class="lineno"> 9783</span>&#160;            {</div><div class="line"><a name="l09784"></a><span class="lineno"> 9784</span>&#160;                VMA_VALIDATE(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;ValidateNode for right child failed.&quot;</span>);</div><div class="line"><a name="l09785"></a><span class="lineno"> 9785</span>&#160;            }</div><div class="line"><a name="l09786"></a><span class="lineno"> 9786</span>&#160;        }</div><div class="line"><a name="l09787"></a><span class="lineno"> 9787</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09788"></a><span class="lineno"> 9788</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09789"></a><span class="lineno"> 9789</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l09790"></a><span class="lineno"> 9790</span>&#160;    }</div><div class="line"><a name="l09791"></a><span class="lineno"> 9791</span>&#160;</div><div class="line"><a name="l09792"></a><span class="lineno"> 9792</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l09793"></a><span class="lineno"> 9793</span>&#160;}</div><div class="line"><a name="l09794"></a><span class="lineno"> 9794</span>&#160;</div><div class="line"><a name="l09795"></a><span class="lineno"> 9795</span>&#160;uint32_t VmaBlockMetadata_Buddy::AllocSizeToLevel(VkDeviceSize allocSize)<span class="keyword"> const</span></div><div class="line"><a name="l09796"></a><span class="lineno"> 9796</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09797"></a><span class="lineno"> 9797</span>&#160;    <span class="comment">// I know this could be optimized somehow e.g. by using std::log2p1 from C++20.</span></div><div class="line"><a name="l09798"></a><span class="lineno"> 9798</span>&#160;    uint32_t level = 0;</div><div class="line"><a name="l09799"></a><span class="lineno"> 9799</span>&#160;    VkDeviceSize currLevelNodeSize = m_UsableSize;</div><div class="line"><a name="l09800"></a><span class="lineno"> 9800</span>&#160;    VkDeviceSize nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l09801"></a><span class="lineno"> 9801</span>&#160;    <span class="keywordflow">while</span>(allocSize &lt;= nextLevelNodeSize &amp;&amp; level + 1 &lt; m_LevelCount)</div><div class="line"><a name="l09802"></a><span class="lineno"> 9802</span>&#160;    {</div><div class="line"><a name="l09803"></a><span class="lineno"> 9803</span>&#160;        ++level;</div><div class="line"><a name="l09804"></a><span class="lineno"> 9804</span>&#160;        currLevelNodeSize = nextLevelNodeSize;</div><div class="line"><a name="l09805"></a><span class="lineno"> 9805</span>&#160;        nextLevelNodeSize = currLevelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l09806"></a><span class="lineno"> 9806</span>&#160;    }</div><div class="line"><a name="l09807"></a><span class="lineno"> 9807</span>&#160;    <span class="keywordflow">return</span> level;</div><div class="line"><a name="l09808"></a><span class="lineno"> 9808</span>&#160;}</div><div class="line"><a name="l09809"></a><span class="lineno"> 9809</span>&#160;</div><div class="line"><a name="l09810"></a><span class="lineno"> 9810</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::FreeAtOffset(<a class="code" href="struct_vma_allocation.html">VmaAllocation</a> alloc, VkDeviceSize offset)</div><div class="line"><a name="l09811"></a><span class="lineno"> 9811</span>&#160;{</div><div class="line"><a name="l09812"></a><span class="lineno"> 9812</span>&#160;    <span class="comment">// Find node and level.</span></div><div class="line"><a name="l09813"></a><span class="lineno"> 9813</span>&#160;    Node* node = m_Root;</div><div class="line"><a name="l09814"></a><span class="lineno"> 9814</span>&#160;    VkDeviceSize nodeOffset = 0;</div><div class="line"><a name="l09815"></a><span class="lineno"> 9815</span>&#160;    uint32_t level = 0;</div><div class="line"><a name="l09816"></a><span class="lineno"> 9816</span>&#160;    VkDeviceSize levelNodeSize = LevelToNodeSize(0);</div><div class="line"><a name="l09817"></a><span class="lineno"> 9817</span>&#160;    <span class="keywordflow">while</span>(node-&gt;type == Node::TYPE_SPLIT)</div><div class="line"><a name="l09818"></a><span class="lineno"> 9818</span>&#160;    {</div><div class="line"><a name="l09819"></a><span class="lineno"> 9819</span>&#160;        <span class="keyword">const</span> VkDeviceSize nextLevelSize = levelNodeSize &gt;&gt; 1;</div><div class="line"><a name="l09820"></a><span class="lineno"> 9820</span>&#160;        <span class="keywordflow">if</span>(offset &lt; nodeOffset + nextLevelSize)</div><div class="line"><a name="l09821"></a><span class="lineno"> 9821</span>&#160;        {</div><div class="line"><a name="l09822"></a><span class="lineno"> 9822</span>&#160;            node = node-&gt;split.leftChild;</div><div class="line"><a name="l09823"></a><span class="lineno"> 9823</span>&#160;        }</div><div class="line"><a name="l09824"></a><span class="lineno"> 9824</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l09825"></a><span class="lineno"> 9825</span>&#160;        {</div><div class="line"><a name="l09826"></a><span class="lineno"> 9826</span>&#160;            node = node-&gt;split.leftChild-&gt;buddy;</div><div class="line"><a name="l09827"></a><span class="lineno"> 9827</span>&#160;            nodeOffset += nextLevelSize;</div><div class="line"><a name="l09828"></a><span class="lineno"> 9828</span>&#160;        }</div><div class="line"><a name="l09829"></a><span class="lineno"> 9829</span>&#160;        ++level;</div><div class="line"><a name="l09830"></a><span class="lineno"> 9830</span>&#160;        levelNodeSize = nextLevelSize;</div><div class="line"><a name="l09831"></a><span class="lineno"> 9831</span>&#160;    }</div><div class="line"><a name="l09832"></a><span class="lineno"> 9832</span>&#160;</div><div class="line"><a name="l09833"></a><span class="lineno"> 9833</span>&#160;    VMA_ASSERT(node != VMA_NULL &amp;&amp; node-&gt;type == Node::TYPE_ALLOCATION);</div><div class="line"><a name="l09834"></a><span class="lineno"> 9834</span>&#160;    VMA_ASSERT(alloc == VK_NULL_HANDLE || node-&gt;allocation.alloc == alloc);</div><div class="line"><a name="l09835"></a><span class="lineno"> 9835</span>&#160;</div><div class="line"><a name="l09836"></a><span class="lineno"> 9836</span>&#160;    ++m_FreeCount;</div><div class="line"><a name="l09837"></a><span class="lineno"> 9837</span>&#160;    --m_AllocationCount;</div><div class="line"><a name="l09838"></a><span class="lineno"> 9838</span>&#160;    m_SumFreeSize += alloc-&gt;GetSize();</div><div class="line"><a name="l09839"></a><span class="lineno"> 9839</span>&#160;</div><div class="line"><a name="l09840"></a><span class="lineno"> 9840</span>&#160;    node-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09841"></a><span class="lineno"> 9841</span>&#160;</div><div class="line"><a name="l09842"></a><span class="lineno"> 9842</span>&#160;    <span class="comment">// Join free nodes if possible.</span></div><div class="line"><a name="l09843"></a><span class="lineno"> 9843</span>&#160;    <span class="keywordflow">while</span>(level &gt; 0 &amp;&amp; node-&gt;buddy-&gt;type == Node::TYPE_FREE)</div><div class="line"><a name="l09844"></a><span class="lineno"> 9844</span>&#160;    {</div><div class="line"><a name="l09845"></a><span class="lineno"> 9845</span>&#160;        RemoveFromFreeList(level, node-&gt;buddy);</div><div class="line"><a name="l09846"></a><span class="lineno"> 9846</span>&#160;        Node* <span class="keyword">const</span> parent = node-&gt;parent;</div><div class="line"><a name="l09847"></a><span class="lineno"> 9847</span>&#160;</div><div class="line"><a name="l09848"></a><span class="lineno"> 9848</span>&#160;        vma_delete(GetAllocationCallbacks(), node-&gt;buddy);</div><div class="line"><a name="l09849"></a><span class="lineno"> 9849</span>&#160;        vma_delete(GetAllocationCallbacks(), node);</div><div class="line"><a name="l09850"></a><span class="lineno"> 9850</span>&#160;        parent-&gt;type = Node::TYPE_FREE;</div><div class="line"><a name="l09851"></a><span class="lineno"> 9851</span>&#160;        </div><div class="line"><a name="l09852"></a><span class="lineno"> 9852</span>&#160;        node = parent;</div><div class="line"><a name="l09853"></a><span class="lineno"> 9853</span>&#160;        --level;</div><div class="line"><a name="l09854"></a><span class="lineno"> 9854</span>&#160;        <span class="comment">//m_SumFreeSize += LevelToNodeSize(level) % 2; // Useful only when level node sizes can be non power of 2.</span></div><div class="line"><a name="l09855"></a><span class="lineno"> 9855</span>&#160;        --m_FreeCount;</div><div class="line"><a name="l09856"></a><span class="lineno"> 9856</span>&#160;    }</div><div class="line"><a name="l09857"></a><span class="lineno"> 9857</span>&#160;</div><div class="line"><a name="l09858"></a><span class="lineno"> 9858</span>&#160;    AddToFreeListFront(level, node);</div><div class="line"><a name="l09859"></a><span class="lineno"> 9859</span>&#160;}</div><div class="line"><a name="l09860"></a><span class="lineno"> 9860</span>&#160;</div><div class="line"><a name="l09861"></a><span class="lineno"> 9861</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::CalcAllocationStatInfoNode(<a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a>&amp; outInfo, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div><div class="line"><a name="l09862"></a><span class="lineno"> 9862</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09863"></a><span class="lineno"> 9863</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div><div class="line"><a name="l09864"></a><span class="lineno"> 9864</span>&#160;    {</div><div class="line"><a name="l09865"></a><span class="lineno"> 9865</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l09866"></a><span class="lineno"> 9866</span>&#160;        ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09867"></a><span class="lineno"> 9867</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += levelNodeSize;</div><div class="line"><a name="l09868"></a><span class="lineno"> 9868</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>, levelNodeSize);</div><div class="line"><a name="l09869"></a><span class="lineno"> 9869</span>&#160;        outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, levelNodeSize);</div><div class="line"><a name="l09870"></a><span class="lineno"> 9870</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09871"></a><span class="lineno"> 9871</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div><div class="line"><a name="l09872"></a><span class="lineno"> 9872</span>&#160;        {</div><div class="line"><a name="l09873"></a><span class="lineno"> 9873</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l09874"></a><span class="lineno"> 9874</span>&#160;            ++outInfo.<a class="code" href="struct_vma_stat_info.html#a537741e4d5cdddc1c0ab95ec650afaff">allocationCount</a>;</div><div class="line"><a name="l09875"></a><span class="lineno"> 9875</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ab0c6c73837e5a70c749fbd4f6064895a">usedBytes</a> += allocSize;</div><div class="line"><a name="l09876"></a><span class="lineno"> 9876</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>, allocSize);</div><div class="line"><a name="l09877"></a><span class="lineno"> 9877</span>&#160;            outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a>, allocSize);</div><div class="line"><a name="l09878"></a><span class="lineno"> 9878</span>&#160;</div><div class="line"><a name="l09879"></a><span class="lineno"> 9879</span>&#160;            <span class="keyword">const</span> VkDeviceSize unusedRangeSize = levelNodeSize - allocSize;</div><div class="line"><a name="l09880"></a><span class="lineno"> 9880</span>&#160;            <span class="keywordflow">if</span>(unusedRangeSize &gt; 0)</div><div class="line"><a name="l09881"></a><span class="lineno"> 9881</span>&#160;            {</div><div class="line"><a name="l09882"></a><span class="lineno"> 9882</span>&#160;                ++outInfo.<a class="code" href="struct_vma_stat_info.html#ae06129c771bfebfd6468a7f4276502a9">unusedRangeCount</a>;</div><div class="line"><a name="l09883"></a><span class="lineno"> 9883</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#a1859d290aca2cd582d8dc25922092669">unusedBytes</a> += unusedRangeSize;</div><div class="line"><a name="l09884"></a><span class="lineno"> 9884</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>, unusedRangeSize);</div><div class="line"><a name="l09885"></a><span class="lineno"> 9885</span>&#160;                outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = VMA_MAX(outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a>, unusedRangeSize);</div><div class="line"><a name="l09886"></a><span class="lineno"> 9886</span>&#160;            }</div><div class="line"><a name="l09887"></a><span class="lineno"> 9887</span>&#160;        }</div><div class="line"><a name="l09888"></a><span class="lineno"> 9888</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09889"></a><span class="lineno"> 9889</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div><div class="line"><a name="l09890"></a><span class="lineno"> 9890</span>&#160;        {</div><div class="line"><a name="l09891"></a><span class="lineno"> 9891</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l09892"></a><span class="lineno"> 9892</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div><div class="line"><a name="l09893"></a><span class="lineno"> 9893</span>&#160;            CalcAllocationStatInfoNode(outInfo, leftChild, childrenNodeSize);</div><div class="line"><a name="l09894"></a><span class="lineno"> 9894</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l09895"></a><span class="lineno"> 9895</span>&#160;            CalcAllocationStatInfoNode(outInfo, rightChild, childrenNodeSize);</div><div class="line"><a name="l09896"></a><span class="lineno"> 9896</span>&#160;        }</div><div class="line"><a name="l09897"></a><span class="lineno"> 9897</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09898"></a><span class="lineno"> 9898</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09899"></a><span class="lineno"> 9899</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09900"></a><span class="lineno"> 9900</span>&#160;    }</div><div class="line"><a name="l09901"></a><span class="lineno"> 9901</span>&#160;}</div><div class="line"><a name="l09902"></a><span class="lineno"> 9902</span>&#160;</div><div class="line"><a name="l09903"></a><span class="lineno"> 9903</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::AddToFreeListFront(uint32_t level, Node* node)</div><div class="line"><a name="l09904"></a><span class="lineno"> 9904</span>&#160;{</div><div class="line"><a name="l09905"></a><span class="lineno"> 9905</span>&#160;    VMA_ASSERT(node-&gt;type == Node::TYPE_FREE);</div><div class="line"><a name="l09906"></a><span class="lineno"> 9906</span>&#160;</div><div class="line"><a name="l09907"></a><span class="lineno"> 9907</span>&#160;    <span class="comment">// List is empty.</span></div><div class="line"><a name="l09908"></a><span class="lineno"> 9908</span>&#160;    Node* <span class="keyword">const</span> frontNode = m_FreeList[level].front;</div><div class="line"><a name="l09909"></a><span class="lineno"> 9909</span>&#160;    <span class="keywordflow">if</span>(frontNode == VMA_NULL)</div><div class="line"><a name="l09910"></a><span class="lineno"> 9910</span>&#160;    {</div><div class="line"><a name="l09911"></a><span class="lineno"> 9911</span>&#160;        VMA_ASSERT(m_FreeList[level].back == VMA_NULL);</div><div class="line"><a name="l09912"></a><span class="lineno"> 9912</span>&#160;        node-&gt;free.prev = node-&gt;free.next = VMA_NULL;</div><div class="line"><a name="l09913"></a><span class="lineno"> 9913</span>&#160;        m_FreeList[level].front = m_FreeList[level].back = node;</div><div class="line"><a name="l09914"></a><span class="lineno"> 9914</span>&#160;    }</div><div class="line"><a name="l09915"></a><span class="lineno"> 9915</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09916"></a><span class="lineno"> 9916</span>&#160;    {</div><div class="line"><a name="l09917"></a><span class="lineno"> 9917</span>&#160;        VMA_ASSERT(frontNode-&gt;free.prev == VMA_NULL);</div><div class="line"><a name="l09918"></a><span class="lineno"> 9918</span>&#160;        node-&gt;free.prev = VMA_NULL;</div><div class="line"><a name="l09919"></a><span class="lineno"> 9919</span>&#160;        node-&gt;free.next = frontNode;</div><div class="line"><a name="l09920"></a><span class="lineno"> 9920</span>&#160;        frontNode-&gt;free.prev = node;</div><div class="line"><a name="l09921"></a><span class="lineno"> 9921</span>&#160;        m_FreeList[level].front = node;</div><div class="line"><a name="l09922"></a><span class="lineno"> 9922</span>&#160;    }</div><div class="line"><a name="l09923"></a><span class="lineno"> 9923</span>&#160;}</div><div class="line"><a name="l09924"></a><span class="lineno"> 9924</span>&#160;</div><div class="line"><a name="l09925"></a><span class="lineno"> 9925</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::RemoveFromFreeList(uint32_t level, Node* node)</div><div class="line"><a name="l09926"></a><span class="lineno"> 9926</span>&#160;{</div><div class="line"><a name="l09927"></a><span class="lineno"> 9927</span>&#160;    VMA_ASSERT(m_FreeList[level].front != VMA_NULL);</div><div class="line"><a name="l09928"></a><span class="lineno"> 9928</span>&#160;</div><div class="line"><a name="l09929"></a><span class="lineno"> 9929</span>&#160;    <span class="comment">// It is at the front.</span></div><div class="line"><a name="l09930"></a><span class="lineno"> 9930</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.prev == VMA_NULL)</div><div class="line"><a name="l09931"></a><span class="lineno"> 9931</span>&#160;    {</div><div class="line"><a name="l09932"></a><span class="lineno"> 9932</span>&#160;        VMA_ASSERT(m_FreeList[level].front == node);</div><div class="line"><a name="l09933"></a><span class="lineno"> 9933</span>&#160;        m_FreeList[level].front = node-&gt;free.next;</div><div class="line"><a name="l09934"></a><span class="lineno"> 9934</span>&#160;    }</div><div class="line"><a name="l09935"></a><span class="lineno"> 9935</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09936"></a><span class="lineno"> 9936</span>&#160;    {</div><div class="line"><a name="l09937"></a><span class="lineno"> 9937</span>&#160;        Node* <span class="keyword">const</span> prevFreeNode = node-&gt;free.prev;</div><div class="line"><a name="l09938"></a><span class="lineno"> 9938</span>&#160;        VMA_ASSERT(prevFreeNode-&gt;free.next == node);</div><div class="line"><a name="l09939"></a><span class="lineno"> 9939</span>&#160;        prevFreeNode-&gt;free.next = node-&gt;free.next;</div><div class="line"><a name="l09940"></a><span class="lineno"> 9940</span>&#160;    }</div><div class="line"><a name="l09941"></a><span class="lineno"> 9941</span>&#160;</div><div class="line"><a name="l09942"></a><span class="lineno"> 9942</span>&#160;    <span class="comment">// It is at the back.</span></div><div class="line"><a name="l09943"></a><span class="lineno"> 9943</span>&#160;    <span class="keywordflow">if</span>(node-&gt;free.next == VMA_NULL)</div><div class="line"><a name="l09944"></a><span class="lineno"> 9944</span>&#160;    {</div><div class="line"><a name="l09945"></a><span class="lineno"> 9945</span>&#160;        VMA_ASSERT(m_FreeList[level].back == node);</div><div class="line"><a name="l09946"></a><span class="lineno"> 9946</span>&#160;        m_FreeList[level].back = node-&gt;free.prev;</div><div class="line"><a name="l09947"></a><span class="lineno"> 9947</span>&#160;    }</div><div class="line"><a name="l09948"></a><span class="lineno"> 9948</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l09949"></a><span class="lineno"> 9949</span>&#160;    {</div><div class="line"><a name="l09950"></a><span class="lineno"> 9950</span>&#160;        Node* <span class="keyword">const</span> nextFreeNode = node-&gt;free.next;</div><div class="line"><a name="l09951"></a><span class="lineno"> 9951</span>&#160;        VMA_ASSERT(nextFreeNode-&gt;free.prev == node);</div><div class="line"><a name="l09952"></a><span class="lineno"> 9952</span>&#160;        nextFreeNode-&gt;free.prev = node-&gt;free.prev;</div><div class="line"><a name="l09953"></a><span class="lineno"> 9953</span>&#160;    }</div><div class="line"><a name="l09954"></a><span class="lineno"> 9954</span>&#160;}</div><div class="line"><a name="l09955"></a><span class="lineno"> 9955</span>&#160;</div><div class="line"><a name="l09956"></a><span class="lineno"> 9956</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09957"></a><span class="lineno"> 9957</span>&#160;<span class="keywordtype">void</span> VmaBlockMetadata_Buddy::PrintDetailedMapNode(<span class="keyword">class</span> VmaJsonWriter&amp; json, <span class="keyword">const</span> Node* node, VkDeviceSize levelNodeSize)<span class="keyword"> const</span></div><div class="line"><a name="l09958"></a><span class="lineno"> 9958</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l09959"></a><span class="lineno"> 9959</span>&#160;    <span class="keywordflow">switch</span>(node-&gt;type)</div><div class="line"><a name="l09960"></a><span class="lineno"> 9960</span>&#160;    {</div><div class="line"><a name="l09961"></a><span class="lineno"> 9961</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_FREE:</div><div class="line"><a name="l09962"></a><span class="lineno"> 9962</span>&#160;        PrintDetailedMap_UnusedRange(json, node-&gt;offset, levelNodeSize);</div><div class="line"><a name="l09963"></a><span class="lineno"> 9963</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09964"></a><span class="lineno"> 9964</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_ALLOCATION:</div><div class="line"><a name="l09965"></a><span class="lineno"> 9965</span>&#160;        {   </div><div class="line"><a name="l09966"></a><span class="lineno"> 9966</span>&#160;            PrintDetailedMap_Allocation(json, node-&gt;offset, node-&gt;allocation.alloc);</div><div class="line"><a name="l09967"></a><span class="lineno"> 9967</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocSize = node-&gt;allocation.alloc-&gt;GetSize();</div><div class="line"><a name="l09968"></a><span class="lineno"> 9968</span>&#160;            <span class="keywordflow">if</span>(allocSize &lt; levelNodeSize)</div><div class="line"><a name="l09969"></a><span class="lineno"> 9969</span>&#160;            {</div><div class="line"><a name="l09970"></a><span class="lineno"> 9970</span>&#160;                PrintDetailedMap_UnusedRange(json, node-&gt;offset + allocSize, levelNodeSize - allocSize);</div><div class="line"><a name="l09971"></a><span class="lineno"> 9971</span>&#160;            }</div><div class="line"><a name="l09972"></a><span class="lineno"> 9972</span>&#160;        }</div><div class="line"><a name="l09973"></a><span class="lineno"> 9973</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09974"></a><span class="lineno"> 9974</span>&#160;    <span class="keywordflow">case</span> Node::TYPE_SPLIT:</div><div class="line"><a name="l09975"></a><span class="lineno"> 9975</span>&#160;        {</div><div class="line"><a name="l09976"></a><span class="lineno"> 9976</span>&#160;            <span class="keyword">const</span> VkDeviceSize childrenNodeSize = levelNodeSize / 2;</div><div class="line"><a name="l09977"></a><span class="lineno"> 9977</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> leftChild = node-&gt;split.leftChild;</div><div class="line"><a name="l09978"></a><span class="lineno"> 9978</span>&#160;            PrintDetailedMapNode(json, leftChild, childrenNodeSize);</div><div class="line"><a name="l09979"></a><span class="lineno"> 9979</span>&#160;            <span class="keyword">const</span> Node* <span class="keyword">const</span> rightChild = leftChild-&gt;buddy;</div><div class="line"><a name="l09980"></a><span class="lineno"> 9980</span>&#160;            PrintDetailedMapNode(json, rightChild, childrenNodeSize);</div><div class="line"><a name="l09981"></a><span class="lineno"> 9981</span>&#160;        }</div><div class="line"><a name="l09982"></a><span class="lineno"> 9982</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l09983"></a><span class="lineno"> 9983</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l09984"></a><span class="lineno"> 9984</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l09985"></a><span class="lineno"> 9985</span>&#160;    }</div><div class="line"><a name="l09986"></a><span class="lineno"> 9986</span>&#160;}</div><div class="line"><a name="l09987"></a><span class="lineno"> 9987</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l09988"></a><span class="lineno"> 9988</span>&#160;</div><div class="line"><a name="l09989"></a><span class="lineno"> 9989</span>&#160;</div><div class="line"><a name="l09991"></a><span class="lineno"> 9991</span>&#160;<span class="comment">// class VmaDeviceMemoryBlock</span></div><div class="line"><a name="l09992"></a><span class="lineno"> 9992</span>&#160;</div><div class="line"><a name="l09993"></a><span class="lineno"> 9993</span>&#160;VmaDeviceMemoryBlock::VmaDeviceMemoryBlock(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator) :</div><div class="line"><a name="l09994"></a><span class="lineno"> 9994</span>&#160;    m_pMetadata(VMA_NULL),</div><div class="line"><a name="l09995"></a><span class="lineno"> 9995</span>&#160;    m_MemoryTypeIndex(UINT32_MAX),</div><div class="line"><a name="l09996"></a><span class="lineno"> 9996</span>&#160;    m_Id(0),</div><div class="line"><a name="l09997"></a><span class="lineno"> 9997</span>&#160;    m_hMemory(VK_NULL_HANDLE),</div><div class="line"><a name="l09998"></a><span class="lineno"> 9998</span>&#160;    m_MapCount(0),</div><div class="line"><a name="l09999"></a><span class="lineno"> 9999</span>&#160;    m_pMappedData(VMA_NULL)</div><div class="line"><a name="l10000"></a><span class="lineno">10000</span>&#160;{</div><div class="line"><a name="l10001"></a><span class="lineno">10001</span>&#160;}</div><div class="line"><a name="l10002"></a><span class="lineno">10002</span>&#160;</div><div class="line"><a name="l10003"></a><span class="lineno">10003</span>&#160;<span class="keywordtype">void</span> VmaDeviceMemoryBlock::Init(</div><div class="line"><a name="l10004"></a><span class="lineno">10004</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10005"></a><span class="lineno">10005</span>&#160;    uint32_t newMemoryTypeIndex,</div><div class="line"><a name="l10006"></a><span class="lineno">10006</span>&#160;    VkDeviceMemory newMemory,</div><div class="line"><a name="l10007"></a><span class="lineno">10007</span>&#160;    VkDeviceSize newSize,</div><div class="line"><a name="l10008"></a><span class="lineno">10008</span>&#160;    uint32_t <span class="keywordtype">id</span>,</div><div class="line"><a name="l10009"></a><span class="lineno">10009</span>&#160;    uint32_t algorithm)</div><div class="line"><a name="l10010"></a><span class="lineno">10010</span>&#160;{</div><div class="line"><a name="l10011"></a><span class="lineno">10011</span>&#160;    VMA_ASSERT(m_hMemory == VK_NULL_HANDLE);</div><div class="line"><a name="l10012"></a><span class="lineno">10012</span>&#160;</div><div class="line"><a name="l10013"></a><span class="lineno">10013</span>&#160;    m_MemoryTypeIndex = newMemoryTypeIndex;</div><div class="line"><a name="l10014"></a><span class="lineno">10014</span>&#160;    m_Id = id;</div><div class="line"><a name="l10015"></a><span class="lineno">10015</span>&#160;    m_hMemory = newMemory;</div><div class="line"><a name="l10016"></a><span class="lineno">10016</span>&#160;</div><div class="line"><a name="l10017"></a><span class="lineno">10017</span>&#160;    <span class="keywordflow">switch</span>(algorithm)</div><div class="line"><a name="l10018"></a><span class="lineno">10018</span>&#160;    {</div><div class="line"><a name="l10019"></a><span class="lineno">10019</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>:</div><div class="line"><a name="l10020"></a><span class="lineno">10020</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Linear)(hAllocator);</div><div class="line"><a name="l10021"></a><span class="lineno">10021</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10022"></a><span class="lineno">10022</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a>:</div><div class="line"><a name="l10023"></a><span class="lineno">10023</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Buddy)(hAllocator);</div><div class="line"><a name="l10024"></a><span class="lineno">10024</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10025"></a><span class="lineno">10025</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l10026"></a><span class="lineno">10026</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l10027"></a><span class="lineno">10027</span>&#160;        <span class="comment">// Fall-through.</span></div><div class="line"><a name="l10028"></a><span class="lineno">10028</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l10029"></a><span class="lineno">10029</span>&#160;        m_pMetadata = vma_new(hAllocator, VmaBlockMetadata_Generic)(hAllocator);</div><div class="line"><a name="l10030"></a><span class="lineno">10030</span>&#160;    }</div><div class="line"><a name="l10031"></a><span class="lineno">10031</span>&#160;    m_pMetadata-&gt;Init(newSize);</div><div class="line"><a name="l10032"></a><span class="lineno">10032</span>&#160;}</div><div class="line"><a name="l10033"></a><span class="lineno">10033</span>&#160;</div><div class="line"><a name="l10034"></a><span class="lineno">10034</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="l10035"></a><span class="lineno">10035</span>&#160;{</div><div class="line"><a name="l10036"></a><span class="lineno">10036</span>&#160;    <span class="comment">// This is the most important assert in the entire library.</span></div><div class="line"><a name="l10037"></a><span class="lineno">10037</span>&#160;    <span class="comment">// Hitting it means you have some memory leak - unreleased VmaAllocation objects.</span></div><div class="line"><a name="l10038"></a><span class="lineno">10038</span>&#160;    VMA_ASSERT(m_pMetadata-&gt;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="l10039"></a><span class="lineno">10039</span>&#160;</div><div class="line"><a name="l10040"></a><span class="lineno">10040</span>&#160;    VMA_ASSERT(m_hMemory != VK_NULL_HANDLE);</div><div class="line"><a name="l10041"></a><span class="lineno">10041</span>&#160;    allocator-&gt;FreeVulkanMemory(m_MemoryTypeIndex, m_pMetadata-&gt;GetSize(), m_hMemory);</div><div class="line"><a name="l10042"></a><span class="lineno">10042</span>&#160;    m_hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l10043"></a><span class="lineno">10043</span>&#160;</div><div class="line"><a name="l10044"></a><span class="lineno">10044</span>&#160;    vma_delete(allocator, m_pMetadata);</div><div class="line"><a name="l10045"></a><span class="lineno">10045</span>&#160;    m_pMetadata = VMA_NULL;</div><div class="line"><a name="l10046"></a><span class="lineno">10046</span>&#160;}</div><div class="line"><a name="l10047"></a><span class="lineno">10047</span>&#160;</div><div class="line"><a name="l10048"></a><span class="lineno">10048</span>&#160;<span class="keywordtype">bool</span> VmaDeviceMemoryBlock::Validate()<span class="keyword"> const</span></div><div class="line"><a name="l10049"></a><span class="lineno">10049</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10050"></a><span class="lineno">10050</span>&#160;    VMA_VALIDATE((m_hMemory != VK_NULL_HANDLE) &amp;&amp;</div><div class="line"><a name="l10051"></a><span class="lineno">10051</span>&#160;        (m_pMetadata-&gt;GetSize() != 0));</div><div class="line"><a name="l10052"></a><span class="lineno">10052</span>&#160;    </div><div class="line"><a name="l10053"></a><span class="lineno">10053</span>&#160;    <span class="keywordflow">return</span> m_pMetadata-&gt;Validate();</div><div class="line"><a name="l10054"></a><span class="lineno">10054</span>&#160;}</div><div class="line"><a name="l10055"></a><span class="lineno">10055</span>&#160;</div><div class="line"><a name="l10056"></a><span class="lineno">10056</span>&#160;VkResult VmaDeviceMemoryBlock::CheckCorruption(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator)</div><div class="line"><a name="l10057"></a><span class="lineno">10057</span>&#160;{</div><div class="line"><a name="l10058"></a><span class="lineno">10058</span>&#160;    <span class="keywordtype">void</span>* pData = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l10059"></a><span class="lineno">10059</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l10060"></a><span class="lineno">10060</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10061"></a><span class="lineno">10061</span>&#160;    {</div><div class="line"><a name="l10062"></a><span class="lineno">10062</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10063"></a><span class="lineno">10063</span>&#160;    }</div><div class="line"><a name="l10064"></a><span class="lineno">10064</span>&#160;</div><div class="line"><a name="l10065"></a><span class="lineno">10065</span>&#160;    res = m_pMetadata-&gt;CheckCorruption(pData);</div><div class="line"><a name="l10066"></a><span class="lineno">10066</span>&#160;</div><div class="line"><a name="l10067"></a><span class="lineno">10067</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l10068"></a><span class="lineno">10068</span>&#160;</div><div class="line"><a name="l10069"></a><span class="lineno">10069</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10070"></a><span class="lineno">10070</span>&#160;}</div><div class="line"><a name="l10071"></a><span class="lineno">10071</span>&#160;</div><div class="line"><a name="l10072"></a><span class="lineno">10072</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="l10073"></a><span class="lineno">10073</span>&#160;{</div><div class="line"><a name="l10074"></a><span class="lineno">10074</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l10075"></a><span class="lineno">10075</span>&#160;    {</div><div class="line"><a name="l10076"></a><span class="lineno">10076</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10077"></a><span class="lineno">10077</span>&#160;    }</div><div class="line"><a name="l10078"></a><span class="lineno">10078</span>&#160;</div><div class="line"><a name="l10079"></a><span class="lineno">10079</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10080"></a><span class="lineno">10080</span>&#160;    <span class="keywordflow">if</span>(m_MapCount != 0)</div><div class="line"><a name="l10081"></a><span class="lineno">10081</span>&#160;    {</div><div class="line"><a name="l10082"></a><span class="lineno">10082</span>&#160;        m_MapCount += count;</div><div class="line"><a name="l10083"></a><span class="lineno">10083</span>&#160;        VMA_ASSERT(m_pMappedData != VMA_NULL);</div><div class="line"><a name="l10084"></a><span class="lineno">10084</span>&#160;        <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l10085"></a><span class="lineno">10085</span>&#160;        {</div><div class="line"><a name="l10086"></a><span class="lineno">10086</span>&#160;            *ppData = m_pMappedData;</div><div class="line"><a name="l10087"></a><span class="lineno">10087</span>&#160;        }</div><div class="line"><a name="l10088"></a><span class="lineno">10088</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10089"></a><span class="lineno">10089</span>&#160;    }</div><div class="line"><a name="l10090"></a><span class="lineno">10090</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l10091"></a><span class="lineno">10091</span>&#160;    {</div><div class="line"><a name="l10092"></a><span class="lineno">10092</span>&#160;        VkResult result = (*hAllocator-&gt;GetVulkanFunctions().vkMapMemory)(</div><div class="line"><a name="l10093"></a><span class="lineno">10093</span>&#160;            hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l10094"></a><span class="lineno">10094</span>&#160;            m_hMemory,</div><div class="line"><a name="l10095"></a><span class="lineno">10095</span>&#160;            0, <span class="comment">// offset</span></div><div class="line"><a name="l10096"></a><span class="lineno">10096</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l10097"></a><span class="lineno">10097</span>&#160;            0, <span class="comment">// flags</span></div><div class="line"><a name="l10098"></a><span class="lineno">10098</span>&#160;            &amp;m_pMappedData);</div><div class="line"><a name="l10099"></a><span class="lineno">10099</span>&#160;        <span class="keywordflow">if</span>(result == VK_SUCCESS)</div><div class="line"><a name="l10100"></a><span class="lineno">10100</span>&#160;        {</div><div class="line"><a name="l10101"></a><span class="lineno">10101</span>&#160;            <span class="keywordflow">if</span>(ppData != VMA_NULL)</div><div class="line"><a name="l10102"></a><span class="lineno">10102</span>&#160;            {</div><div class="line"><a name="l10103"></a><span class="lineno">10103</span>&#160;                *ppData = m_pMappedData;</div><div class="line"><a name="l10104"></a><span class="lineno">10104</span>&#160;            }</div><div class="line"><a name="l10105"></a><span class="lineno">10105</span>&#160;            m_MapCount = count;</div><div class="line"><a name="l10106"></a><span class="lineno">10106</span>&#160;        }</div><div class="line"><a name="l10107"></a><span class="lineno">10107</span>&#160;        <span class="keywordflow">return</span> result;</div><div class="line"><a name="l10108"></a><span class="lineno">10108</span>&#160;    }</div><div class="line"><a name="l10109"></a><span class="lineno">10109</span>&#160;}</div><div class="line"><a name="l10110"></a><span class="lineno">10110</span>&#160;</div><div class="line"><a name="l10111"></a><span class="lineno">10111</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="l10112"></a><span class="lineno">10112</span>&#160;{</div><div class="line"><a name="l10113"></a><span class="lineno">10113</span>&#160;    <span class="keywordflow">if</span>(count == 0)</div><div class="line"><a name="l10114"></a><span class="lineno">10114</span>&#160;    {</div><div class="line"><a name="l10115"></a><span class="lineno">10115</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l10116"></a><span class="lineno">10116</span>&#160;    }</div><div class="line"><a name="l10117"></a><span class="lineno">10117</span>&#160;</div><div class="line"><a name="l10118"></a><span class="lineno">10118</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10119"></a><span class="lineno">10119</span>&#160;    <span class="keywordflow">if</span>(m_MapCount &gt;= count)</div><div class="line"><a name="l10120"></a><span class="lineno">10120</span>&#160;    {</div><div class="line"><a name="l10121"></a><span class="lineno">10121</span>&#160;        m_MapCount -= count;</div><div class="line"><a name="l10122"></a><span class="lineno">10122</span>&#160;        <span class="keywordflow">if</span>(m_MapCount == 0)</div><div class="line"><a name="l10123"></a><span class="lineno">10123</span>&#160;        {</div><div class="line"><a name="l10124"></a><span class="lineno">10124</span>&#160;            m_pMappedData = VMA_NULL;</div><div class="line"><a name="l10125"></a><span class="lineno">10125</span>&#160;            (*hAllocator-&gt;GetVulkanFunctions().vkUnmapMemory)(hAllocator-&gt;m_hDevice, m_hMemory);</div><div class="line"><a name="l10126"></a><span class="lineno">10126</span>&#160;        }</div><div class="line"><a name="l10127"></a><span class="lineno">10127</span>&#160;    }</div><div class="line"><a name="l10128"></a><span class="lineno">10128</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l10129"></a><span class="lineno">10129</span>&#160;    {</div><div class="line"><a name="l10130"></a><span class="lineno">10130</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="l10131"></a><span class="lineno">10131</span>&#160;    }</div><div class="line"><a name="l10132"></a><span class="lineno">10132</span>&#160;}</div><div class="line"><a name="l10133"></a><span class="lineno">10133</span>&#160;</div><div class="line"><a name="l10134"></a><span class="lineno">10134</span>&#160;VkResult VmaDeviceMemoryBlock::WriteMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div><div class="line"><a name="l10135"></a><span class="lineno">10135</span>&#160;{</div><div class="line"><a name="l10136"></a><span class="lineno">10136</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div><div class="line"><a name="l10137"></a><span class="lineno">10137</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l10138"></a><span class="lineno">10138</span>&#160;</div><div class="line"><a name="l10139"></a><span class="lineno">10139</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l10140"></a><span class="lineno">10140</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l10141"></a><span class="lineno">10141</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10142"></a><span class="lineno">10142</span>&#160;    {</div><div class="line"><a name="l10143"></a><span class="lineno">10143</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10144"></a><span class="lineno">10144</span>&#160;    }</div><div class="line"><a name="l10145"></a><span class="lineno">10145</span>&#160;</div><div class="line"><a name="l10146"></a><span class="lineno">10146</span>&#160;    VmaWriteMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l10147"></a><span class="lineno">10147</span>&#160;    VmaWriteMagicValue(pData, allocOffset + allocSize);</div><div class="line"><a name="l10148"></a><span class="lineno">10148</span>&#160;</div><div class="line"><a name="l10149"></a><span class="lineno">10149</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l10150"></a><span class="lineno">10150</span>&#160;</div><div class="line"><a name="l10151"></a><span class="lineno">10151</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10152"></a><span class="lineno">10152</span>&#160;}</div><div class="line"><a name="l10153"></a><span class="lineno">10153</span>&#160;</div><div class="line"><a name="l10154"></a><span class="lineno">10154</span>&#160;VkResult VmaDeviceMemoryBlock::ValidateMagicValueAroundAllocation(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator, VkDeviceSize allocOffset, VkDeviceSize allocSize)</div><div class="line"><a name="l10155"></a><span class="lineno">10155</span>&#160;{</div><div class="line"><a name="l10156"></a><span class="lineno">10156</span>&#160;    VMA_ASSERT(VMA_DEBUG_MARGIN &gt; 0 &amp;&amp; VMA_DEBUG_MARGIN % 4 == 0 &amp;&amp; VMA_DEBUG_DETECT_CORRUPTION);</div><div class="line"><a name="l10157"></a><span class="lineno">10157</span>&#160;    VMA_ASSERT(allocOffset &gt;= VMA_DEBUG_MARGIN);</div><div class="line"><a name="l10158"></a><span class="lineno">10158</span>&#160;</div><div class="line"><a name="l10159"></a><span class="lineno">10159</span>&#160;    <span class="keywordtype">void</span>* pData;</div><div class="line"><a name="l10160"></a><span class="lineno">10160</span>&#160;    VkResult res = Map(hAllocator, 1, &amp;pData);</div><div class="line"><a name="l10161"></a><span class="lineno">10161</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10162"></a><span class="lineno">10162</span>&#160;    {</div><div class="line"><a name="l10163"></a><span class="lineno">10163</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10164"></a><span class="lineno">10164</span>&#160;    }</div><div class="line"><a name="l10165"></a><span class="lineno">10165</span>&#160;</div><div class="line"><a name="l10166"></a><span class="lineno">10166</span>&#160;    <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset - VMA_DEBUG_MARGIN))</div><div class="line"><a name="l10167"></a><span class="lineno">10167</span>&#160;    {</div><div class="line"><a name="l10168"></a><span class="lineno">10168</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED BEFORE FREED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l10169"></a><span class="lineno">10169</span>&#160;    }</div><div class="line"><a name="l10170"></a><span class="lineno">10170</span>&#160;    <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!VmaValidateMagicValue(pData, allocOffset + allocSize))</div><div class="line"><a name="l10171"></a><span class="lineno">10171</span>&#160;    {</div><div class="line"><a name="l10172"></a><span class="lineno">10172</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;MEMORY CORRUPTION DETECTED AFTER FREED ALLOCATION!&quot;</span>);</div><div class="line"><a name="l10173"></a><span class="lineno">10173</span>&#160;    }</div><div class="line"><a name="l10174"></a><span class="lineno">10174</span>&#160;</div><div class="line"><a name="l10175"></a><span class="lineno">10175</span>&#160;    Unmap(hAllocator, 1);</div><div class="line"><a name="l10176"></a><span class="lineno">10176</span>&#160;</div><div class="line"><a name="l10177"></a><span class="lineno">10177</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10178"></a><span class="lineno">10178</span>&#160;}</div><div class="line"><a name="l10179"></a><span class="lineno">10179</span>&#160;</div><div class="line"><a name="l10180"></a><span class="lineno">10180</span>&#160;VkResult VmaDeviceMemoryBlock::BindBufferMemory(</div><div class="line"><a name="l10181"></a><span class="lineno">10181</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10182"></a><span class="lineno">10182</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l10183"></a><span class="lineno">10183</span>&#160;    VkBuffer hBuffer)</div><div class="line"><a name="l10184"></a><span class="lineno">10184</span>&#160;{</div><div class="line"><a name="l10185"></a><span class="lineno">10185</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l10186"></a><span class="lineno">10186</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l10187"></a><span class="lineno">10187</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="l10188"></a><span class="lineno">10188</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10189"></a><span class="lineno">10189</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l10190"></a><span class="lineno">10190</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l10191"></a><span class="lineno">10191</span>&#160;        hBuffer,</div><div class="line"><a name="l10192"></a><span class="lineno">10192</span>&#160;        m_hMemory,</div><div class="line"><a name="l10193"></a><span class="lineno">10193</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l10194"></a><span class="lineno">10194</span>&#160;}</div><div class="line"><a name="l10195"></a><span class="lineno">10195</span>&#160;</div><div class="line"><a name="l10196"></a><span class="lineno">10196</span>&#160;VkResult VmaDeviceMemoryBlock::BindImageMemory(</div><div class="line"><a name="l10197"></a><span class="lineno">10197</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10198"></a><span class="lineno">10198</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l10199"></a><span class="lineno">10199</span>&#160;    VkImage hImage)</div><div class="line"><a name="l10200"></a><span class="lineno">10200</span>&#160;{</div><div class="line"><a name="l10201"></a><span class="lineno">10201</span>&#160;    VMA_ASSERT(hAllocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK &amp;&amp;</div><div class="line"><a name="l10202"></a><span class="lineno">10202</span>&#160;        hAllocation-&gt;GetBlock() == <span class="keyword">this</span>);</div><div class="line"><a name="l10203"></a><span class="lineno">10203</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="l10204"></a><span class="lineno">10204</span>&#160;    VmaMutexLock lock(m_Mutex, hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10205"></a><span class="lineno">10205</span>&#160;    <span class="keywordflow">return</span> hAllocator-&gt;GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l10206"></a><span class="lineno">10206</span>&#160;        hAllocator-&gt;m_hDevice,</div><div class="line"><a name="l10207"></a><span class="lineno">10207</span>&#160;        hImage,</div><div class="line"><a name="l10208"></a><span class="lineno">10208</span>&#160;        m_hMemory,</div><div class="line"><a name="l10209"></a><span class="lineno">10209</span>&#160;        hAllocation-&gt;GetOffset());</div><div class="line"><a name="l10210"></a><span class="lineno">10210</span>&#160;}</div><div class="line"><a name="l10211"></a><span class="lineno">10211</span>&#160;</div><div class="line"><a name="l10212"></a><span class="lineno">10212</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="l10213"></a><span class="lineno">10213</span>&#160;{</div><div class="line"><a name="l10214"></a><span class="lineno">10214</span>&#160;    memset(&amp;outInfo, 0, <span class="keyword">sizeof</span>(outInfo));</div><div class="line"><a name="l10215"></a><span class="lineno">10215</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#ade8b40bd3139c04aabd2fc538a356fea">allocationSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l10216"></a><span class="lineno">10216</span>&#160;    outInfo.<a class="code" href="struct_vma_stat_info.html#aedeba931324f16589cd2416c0d2dd0d4">unusedRangeSizeMin</a> = UINT64_MAX;</div><div class="line"><a name="l10217"></a><span class="lineno">10217</span>&#160;}</div><div class="line"><a name="l10218"></a><span class="lineno">10218</span>&#160;</div><div class="line"><a name="l10219"></a><span class="lineno">10219</span>&#160;<span class="comment">// Adds statistics srcInfo into inoutInfo, like: inoutInfo += srcInfo.</span></div><div class="line"><a name="l10220"></a><span class="lineno">10220</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="l10221"></a><span class="lineno">10221</span>&#160;{</div><div class="line"><a name="l10222"></a><span class="lineno">10222</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="l10223"></a><span class="lineno">10223</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="l10224"></a><span class="lineno">10224</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="l10225"></a><span class="lineno">10225</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="l10226"></a><span class="lineno">10226</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="l10227"></a><span class="lineno">10227</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="l10228"></a><span class="lineno">10228</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="l10229"></a><span class="lineno">10229</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="l10230"></a><span class="lineno">10230</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="l10231"></a><span class="lineno">10231</span>&#160;}</div><div class="line"><a name="l10232"></a><span class="lineno">10232</span>&#160;</div><div class="line"><a name="l10233"></a><span class="lineno">10233</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="l10234"></a><span class="lineno">10234</span>&#160;{</div><div class="line"><a name="l10235"></a><span class="lineno">10235</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="l10236"></a><span class="lineno">10236</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="l10237"></a><span class="lineno">10237</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="l10238"></a><span class="lineno">10238</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="l10239"></a><span class="lineno">10239</span>&#160;}</div><div class="line"><a name="l10240"></a><span class="lineno">10240</span>&#160;</div><div class="line"><a name="l10241"></a><span class="lineno">10241</span>&#160;VmaPool_T::VmaPool_T(</div><div class="line"><a name="l10242"></a><span class="lineno">10242</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10243"></a><span class="lineno">10243</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="l10244"></a><span class="lineno">10244</span>&#160;    VkDeviceSize preferredBlockSize) :</div><div class="line"><a name="l10245"></a><span class="lineno">10245</span>&#160;    m_BlockVector(</div><div class="line"><a name="l10246"></a><span class="lineno">10246</span>&#160;        hAllocator,</div><div class="line"><a name="l10247"></a><span class="lineno">10247</span>&#160;        createInfo.memoryTypeIndex,</div><div class="line"><a name="l10248"></a><span class="lineno">10248</span>&#160;        createInfo.blockSize != 0 ? createInfo.blockSize : preferredBlockSize,</div><div class="line"><a name="l10249"></a><span class="lineno">10249</span>&#160;        createInfo.minBlockCount,</div><div class="line"><a name="l10250"></a><span class="lineno">10250</span>&#160;        createInfo.maxBlockCount,</div><div class="line"><a name="l10251"></a><span class="lineno">10251</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="l10252"></a><span class="lineno">10252</span>&#160;        createInfo.frameInUseCount,</div><div class="line"><a name="l10253"></a><span class="lineno">10253</span>&#160;        true, <span class="comment">// isCustomPool</span></div><div class="line"><a name="l10254"></a><span class="lineno">10254</span>&#160;        createInfo.blockSize != 0, <span class="comment">// explicitBlockSize</span></div><div class="line"><a name="l10255"></a><span class="lineno">10255</span>&#160;        createInfo.flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a>), <span class="comment">// algorithm</span></div><div class="line"><a name="l10256"></a><span class="lineno">10256</span>&#160;    m_Id(0)</div><div class="line"><a name="l10257"></a><span class="lineno">10257</span>&#160;{</div><div class="line"><a name="l10258"></a><span class="lineno">10258</span>&#160;}</div><div class="line"><a name="l10259"></a><span class="lineno">10259</span>&#160;</div><div class="line"><a name="l10260"></a><span class="lineno">10260</span>&#160;VmaPool_T::~VmaPool_T()</div><div class="line"><a name="l10261"></a><span class="lineno">10261</span>&#160;{</div><div class="line"><a name="l10262"></a><span class="lineno">10262</span>&#160;}</div><div class="line"><a name="l10263"></a><span class="lineno">10263</span>&#160;</div><div class="line"><a name="l10264"></a><span class="lineno">10264</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10265"></a><span class="lineno">10265</span>&#160;</div><div class="line"><a name="l10266"></a><span class="lineno">10266</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10267"></a><span class="lineno">10267</span>&#160;</div><div class="line"><a name="l10268"></a><span class="lineno">10268</span>&#160;VmaBlockVector::VmaBlockVector(</div><div class="line"><a name="l10269"></a><span class="lineno">10269</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l10270"></a><span class="lineno">10270</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l10271"></a><span class="lineno">10271</span>&#160;    VkDeviceSize preferredBlockSize,</div><div class="line"><a name="l10272"></a><span class="lineno">10272</span>&#160;    <span class="keywordtype">size_t</span> minBlockCount,</div><div class="line"><a name="l10273"></a><span class="lineno">10273</span>&#160;    <span class="keywordtype">size_t</span> maxBlockCount,</div><div class="line"><a name="l10274"></a><span class="lineno">10274</span>&#160;    VkDeviceSize bufferImageGranularity,</div><div class="line"><a name="l10275"></a><span class="lineno">10275</span>&#160;    uint32_t frameInUseCount,</div><div class="line"><a name="l10276"></a><span class="lineno">10276</span>&#160;    <span class="keywordtype">bool</span> isCustomPool,</div><div class="line"><a name="l10277"></a><span class="lineno">10277</span>&#160;    <span class="keywordtype">bool</span> explicitBlockSize,</div><div class="line"><a name="l10278"></a><span class="lineno">10278</span>&#160;    uint32_t algorithm) :</div><div class="line"><a name="l10279"></a><span class="lineno">10279</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l10280"></a><span class="lineno">10280</span>&#160;    m_MemoryTypeIndex(memoryTypeIndex),</div><div class="line"><a name="l10281"></a><span class="lineno">10281</span>&#160;    m_PreferredBlockSize(preferredBlockSize),</div><div class="line"><a name="l10282"></a><span class="lineno">10282</span>&#160;    m_MinBlockCount(minBlockCount),</div><div class="line"><a name="l10283"></a><span class="lineno">10283</span>&#160;    m_MaxBlockCount(maxBlockCount),</div><div class="line"><a name="l10284"></a><span class="lineno">10284</span>&#160;    m_BufferImageGranularity(bufferImageGranularity),</div><div class="line"><a name="l10285"></a><span class="lineno">10285</span>&#160;    m_FrameInUseCount(frameInUseCount),</div><div class="line"><a name="l10286"></a><span class="lineno">10286</span>&#160;    m_IsCustomPool(isCustomPool),</div><div class="line"><a name="l10287"></a><span class="lineno">10287</span>&#160;    m_ExplicitBlockSize(explicitBlockSize),</div><div class="line"><a name="l10288"></a><span class="lineno">10288</span>&#160;    m_Algorithm(algorithm),</div><div class="line"><a name="l10289"></a><span class="lineno">10289</span>&#160;    m_HasEmptyBlock(false),</div><div class="line"><a name="l10290"></a><span class="lineno">10290</span>&#160;    m_Blocks(VmaStlAllocator&lt;VmaDeviceMemoryBlock*&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l10291"></a><span class="lineno">10291</span>&#160;    m_pDefragmentator(VMA_NULL),</div><div class="line"><a name="l10292"></a><span class="lineno">10292</span>&#160;    m_NextBlockId(0)</div><div class="line"><a name="l10293"></a><span class="lineno">10293</span>&#160;{</div><div class="line"><a name="l10294"></a><span class="lineno">10294</span>&#160;}</div><div class="line"><a name="l10295"></a><span class="lineno">10295</span>&#160;</div><div class="line"><a name="l10296"></a><span class="lineno">10296</span>&#160;VmaBlockVector::~VmaBlockVector()</div><div class="line"><a name="l10297"></a><span class="lineno">10297</span>&#160;{</div><div class="line"><a name="l10298"></a><span class="lineno">10298</span>&#160;    VMA_ASSERT(m_pDefragmentator == VMA_NULL);</div><div class="line"><a name="l10299"></a><span class="lineno">10299</span>&#160;</div><div class="line"><a name="l10300"></a><span class="lineno">10300</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l10301"></a><span class="lineno">10301</span>&#160;    {</div><div class="line"><a name="l10302"></a><span class="lineno">10302</span>&#160;        m_Blocks[i]-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l10303"></a><span class="lineno">10303</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l10304"></a><span class="lineno">10304</span>&#160;    }</div><div class="line"><a name="l10305"></a><span class="lineno">10305</span>&#160;}</div><div class="line"><a name="l10306"></a><span class="lineno">10306</span>&#160;</div><div class="line"><a name="l10307"></a><span class="lineno">10307</span>&#160;VkResult VmaBlockVector::CreateMinBlocks()</div><div class="line"><a name="l10308"></a><span class="lineno">10308</span>&#160;{</div><div class="line"><a name="l10309"></a><span class="lineno">10309</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="l10310"></a><span class="lineno">10310</span>&#160;    {</div><div class="line"><a name="l10311"></a><span class="lineno">10311</span>&#160;        VkResult res = CreateBlock(m_PreferredBlockSize, VMA_NULL);</div><div class="line"><a name="l10312"></a><span class="lineno">10312</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10313"></a><span class="lineno">10313</span>&#160;        {</div><div class="line"><a name="l10314"></a><span class="lineno">10314</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10315"></a><span class="lineno">10315</span>&#160;        }</div><div class="line"><a name="l10316"></a><span class="lineno">10316</span>&#160;    }</div><div class="line"><a name="l10317"></a><span class="lineno">10317</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10318"></a><span class="lineno">10318</span>&#160;}</div><div class="line"><a name="l10319"></a><span class="lineno">10319</span>&#160;</div><div class="line"><a name="l10320"></a><span class="lineno">10320</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="l10321"></a><span class="lineno">10321</span>&#160;{</div><div class="line"><a name="l10322"></a><span class="lineno">10322</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10323"></a><span class="lineno">10323</span>&#160;</div><div class="line"><a name="l10324"></a><span class="lineno">10324</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> blockCount = m_Blocks.size();</div><div class="line"><a name="l10325"></a><span class="lineno">10325</span>&#160;</div><div class="line"><a name="l10326"></a><span class="lineno">10326</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#a326807b2de2b0931cee4ed9a5f2e420c">size</a> = 0;</div><div class="line"><a name="l10327"></a><span class="lineno">10327</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad7c54874724fce7b06aba526202d82a8">unusedSize</a> = 0;</div><div class="line"><a name="l10328"></a><span class="lineno">10328</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ad1924eb54fffa45e9e0e65670c8fe5eb">allocationCount</a> = 0;</div><div class="line"><a name="l10329"></a><span class="lineno">10329</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ae4f3546ffa4d1e598b64d8e6134854f4">unusedRangeCount</a> = 0;</div><div class="line"><a name="l10330"></a><span class="lineno">10330</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#ab4c8f52dd42ab01998f60f0b6acc722b">unusedRangeSizeMax</a> = 0;</div><div class="line"><a name="l10331"></a><span class="lineno">10331</span>&#160;    pStats-&gt;<a class="code" href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">blockCount</a> = blockCount;</div><div class="line"><a name="l10332"></a><span class="lineno">10332</span>&#160;</div><div class="line"><a name="l10333"></a><span class="lineno">10333</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; blockCount; ++blockIndex)</div><div class="line"><a name="l10334"></a><span class="lineno">10334</span>&#160;    {</div><div class="line"><a name="l10335"></a><span class="lineno">10335</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10336"></a><span class="lineno">10336</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l10337"></a><span class="lineno">10337</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l10338"></a><span class="lineno">10338</span>&#160;        pBlock-&gt;m_pMetadata-&gt;AddPoolStats(*pStats);</div><div class="line"><a name="l10339"></a><span class="lineno">10339</span>&#160;    }</div><div class="line"><a name="l10340"></a><span class="lineno">10340</span>&#160;}</div><div class="line"><a name="l10341"></a><span class="lineno">10341</span>&#160;</div><div class="line"><a name="l10342"></a><span class="lineno">10342</span>&#160;<span class="keywordtype">bool</span> VmaBlockVector::IsCorruptionDetectionEnabled()<span class="keyword"> const</span></div><div class="line"><a name="l10343"></a><span class="lineno">10343</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10344"></a><span class="lineno">10344</span>&#160;    <span class="keyword">const</span> uint32_t requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l10345"></a><span class="lineno">10345</span>&#160;    <span class="keywordflow">return</span> (VMA_DEBUG_DETECT_CORRUPTION != 0) &amp;&amp;</div><div class="line"><a name="l10346"></a><span class="lineno">10346</span>&#160;        (VMA_DEBUG_MARGIN &gt; 0) &amp;&amp;</div><div class="line"><a name="l10347"></a><span class="lineno">10347</span>&#160;        (m_hAllocator-&gt;m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags;</div><div class="line"><a name="l10348"></a><span class="lineno">10348</span>&#160;}</div><div class="line"><a name="l10349"></a><span class="lineno">10349</span>&#160;</div><div class="line"><a name="l10350"></a><span class="lineno">10350</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="l10351"></a><span class="lineno">10351</span>&#160;</div><div class="line"><a name="l10352"></a><span class="lineno">10352</span>&#160;VkResult VmaBlockVector::Allocate(</div><div class="line"><a name="l10353"></a><span class="lineno">10353</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l10354"></a><span class="lineno">10354</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l10355"></a><span class="lineno">10355</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l10356"></a><span class="lineno">10356</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l10357"></a><span class="lineno">10357</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="l10358"></a><span class="lineno">10358</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l10359"></a><span class="lineno">10359</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l10360"></a><span class="lineno">10360</span>&#160;{</div><div class="line"><a name="l10361"></a><span class="lineno">10361</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div><div class="line"><a name="l10362"></a><span class="lineno">10362</span>&#160;    <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="l10363"></a><span class="lineno">10363</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="l10364"></a><span class="lineno">10364</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="l10365"></a><span class="lineno">10365</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> canCreateNewBlock =</div><div class="line"><a name="l10366"></a><span class="lineno">10366</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="l10367"></a><span class="lineno">10367</span>&#160;        (m_Blocks.size() &lt; m_MaxBlockCount);</div><div class="line"><a name="l10368"></a><span class="lineno">10368</span>&#160;    uint32_t strategy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a> &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a>;</div><div class="line"><a name="l10369"></a><span class="lineno">10369</span>&#160;</div><div class="line"><a name="l10370"></a><span class="lineno">10370</span>&#160;    <span class="comment">// If linearAlgorithm is used, canMakeOtherLost is available only when used as ring buffer.</span></div><div class="line"><a name="l10371"></a><span class="lineno">10371</span>&#160;    <span class="comment">// Which in turn is available only when maxBlockCount = 1.</span></div><div class="line"><a name="l10372"></a><span class="lineno">10372</span>&#160;    <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> &amp;&amp; m_MaxBlockCount &gt; 1)</div><div class="line"><a name="l10373"></a><span class="lineno">10373</span>&#160;    {</div><div class="line"><a name="l10374"></a><span class="lineno">10374</span>&#160;        canMakeOtherLost = <span class="keyword">false</span>;</div><div class="line"><a name="l10375"></a><span class="lineno">10375</span>&#160;    }</div><div class="line"><a name="l10376"></a><span class="lineno">10376</span>&#160;</div><div class="line"><a name="l10377"></a><span class="lineno">10377</span>&#160;    <span class="comment">// Upper address can only be used with linear allocator and within single memory block.</span></div><div class="line"><a name="l10378"></a><span class="lineno">10378</span>&#160;    <span class="keywordflow">if</span>(isUpperAddress &amp;&amp;</div><div class="line"><a name="l10379"></a><span class="lineno">10379</span>&#160;        (m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a> || m_MaxBlockCount &gt; 1))</div><div class="line"><a name="l10380"></a><span class="lineno">10380</span>&#160;    {</div><div class="line"><a name="l10381"></a><span class="lineno">10381</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l10382"></a><span class="lineno">10382</span>&#160;    }</div><div class="line"><a name="l10383"></a><span class="lineno">10383</span>&#160;</div><div class="line"><a name="l10384"></a><span class="lineno">10384</span>&#160;    <span class="comment">// Validate strategy.</span></div><div class="line"><a name="l10385"></a><span class="lineno">10385</span>&#160;    <span class="keywordflow">switch</span>(strategy)</div><div class="line"><a name="l10386"></a><span class="lineno">10386</span>&#160;    {</div><div class="line"><a name="l10387"></a><span class="lineno">10387</span>&#160;    <span class="keywordflow">case</span> 0:</div><div class="line"><a name="l10388"></a><span class="lineno">10388</span>&#160;        strategy = <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>;</div><div class="line"><a name="l10389"></a><span class="lineno">10389</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10390"></a><span class="lineno">10390</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>:</div><div class="line"><a name="l10391"></a><span class="lineno">10391</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a>:</div><div class="line"><a name="l10392"></a><span class="lineno">10392</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>:</div><div class="line"><a name="l10393"></a><span class="lineno">10393</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10394"></a><span class="lineno">10394</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l10395"></a><span class="lineno">10395</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l10396"></a><span class="lineno">10396</span>&#160;    }</div><div class="line"><a name="l10397"></a><span class="lineno">10397</span>&#160;</div><div class="line"><a name="l10398"></a><span class="lineno">10398</span>&#160;    <span class="comment">// Early reject: requested allocation size is larger that maximum block size for this block vector.</span></div><div class="line"><a name="l10399"></a><span class="lineno">10399</span>&#160;    <span class="keywordflow">if</span>(size + 2 * VMA_DEBUG_MARGIN &gt; m_PreferredBlockSize)</div><div class="line"><a name="l10400"></a><span class="lineno">10400</span>&#160;    {</div><div class="line"><a name="l10401"></a><span class="lineno">10401</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l10402"></a><span class="lineno">10402</span>&#160;    }</div><div class="line"><a name="l10403"></a><span class="lineno">10403</span>&#160;</div><div class="line"><a name="l10404"></a><span class="lineno">10404</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10405"></a><span class="lineno">10405</span>&#160;</div><div class="line"><a name="l10406"></a><span class="lineno">10406</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l10407"></a><span class="lineno">10407</span>&#160;<span class="comment">    Under certain condition, this whole section can be skipped for optimization, so</span></div><div class="line"><a name="l10408"></a><span class="lineno">10408</span>&#160;<span class="comment">    we move on directly to trying to allocate with canMakeOtherLost. That&#39;s the case</span></div><div class="line"><a name="l10409"></a><span class="lineno">10409</span>&#160;<span class="comment">    e.g. for custom pools with linear algorithm.</span></div><div class="line"><a name="l10410"></a><span class="lineno">10410</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l10411"></a><span class="lineno">10411</span>&#160;    <span class="keywordflow">if</span>(!canMakeOtherLost || canCreateNewBlock)</div><div class="line"><a name="l10412"></a><span class="lineno">10412</span>&#160;    {</div><div class="line"><a name="l10413"></a><span class="lineno">10413</span>&#160;        <span class="comment">// 1. Search existing allocations. Try to allocate without making other allocations lost.</span></div><div class="line"><a name="l10414"></a><span class="lineno">10414</span>&#160;        <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlagsCopy = createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>;</div><div class="line"><a name="l10415"></a><span class="lineno">10415</span>&#160;        allocFlagsCopy &amp;= ~<a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a68686d0ce9beb0d4d1b9f2b8b1389a7e">VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT</a>;</div><div class="line"><a name="l10416"></a><span class="lineno">10416</span>&#160;</div><div class="line"><a name="l10417"></a><span class="lineno">10417</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm == <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>)</div><div class="line"><a name="l10418"></a><span class="lineno">10418</span>&#160;        {</div><div class="line"><a name="l10419"></a><span class="lineno">10419</span>&#160;            <span class="comment">// Use only last block.</span></div><div class="line"><a name="l10420"></a><span class="lineno">10420</span>&#160;            <span class="keywordflow">if</span>(!m_Blocks.empty())</div><div class="line"><a name="l10421"></a><span class="lineno">10421</span>&#160;            {</div><div class="line"><a name="l10422"></a><span class="lineno">10422</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks.back();</div><div class="line"><a name="l10423"></a><span class="lineno">10423</span>&#160;                VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10424"></a><span class="lineno">10424</span>&#160;                VkResult res = AllocateFromBlock(</div><div class="line"><a name="l10425"></a><span class="lineno">10425</span>&#160;                    pCurrBlock,</div><div class="line"><a name="l10426"></a><span class="lineno">10426</span>&#160;                    hCurrentPool,</div><div class="line"><a name="l10427"></a><span class="lineno">10427</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l10428"></a><span class="lineno">10428</span>&#160;                    size,</div><div class="line"><a name="l10429"></a><span class="lineno">10429</span>&#160;                    alignment,</div><div class="line"><a name="l10430"></a><span class="lineno">10430</span>&#160;                    allocFlagsCopy,</div><div class="line"><a name="l10431"></a><span class="lineno">10431</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l10432"></a><span class="lineno">10432</span>&#160;                    suballocType,</div><div class="line"><a name="l10433"></a><span class="lineno">10433</span>&#160;                    strategy,</div><div class="line"><a name="l10434"></a><span class="lineno">10434</span>&#160;                    pAllocation);</div><div class="line"><a name="l10435"></a><span class="lineno">10435</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10436"></a><span class="lineno">10436</span>&#160;                {</div><div class="line"><a name="l10437"></a><span class="lineno">10437</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from last block #%u&quot;</span>, (uint32_t)(m_Blocks.size() - 1));</div><div class="line"><a name="l10438"></a><span class="lineno">10438</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10439"></a><span class="lineno">10439</span>&#160;                }</div><div class="line"><a name="l10440"></a><span class="lineno">10440</span>&#160;            }</div><div class="line"><a name="l10441"></a><span class="lineno">10441</span>&#160;        }</div><div class="line"><a name="l10442"></a><span class="lineno">10442</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l10443"></a><span class="lineno">10443</span>&#160;        {</div><div class="line"><a name="l10444"></a><span class="lineno">10444</span>&#160;            <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div><div class="line"><a name="l10445"></a><span class="lineno">10445</span>&#160;            {</div><div class="line"><a name="l10446"></a><span class="lineno">10446</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="l10447"></a><span class="lineno">10447</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="l10448"></a><span class="lineno">10448</span>&#160;                {</div><div class="line"><a name="l10449"></a><span class="lineno">10449</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10450"></a><span class="lineno">10450</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10451"></a><span class="lineno">10451</span>&#160;                    VkResult res = AllocateFromBlock(</div><div class="line"><a name="l10452"></a><span class="lineno">10452</span>&#160;                        pCurrBlock,</div><div class="line"><a name="l10453"></a><span class="lineno">10453</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l10454"></a><span class="lineno">10454</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l10455"></a><span class="lineno">10455</span>&#160;                        size,</div><div class="line"><a name="l10456"></a><span class="lineno">10456</span>&#160;                        alignment,</div><div class="line"><a name="l10457"></a><span class="lineno">10457</span>&#160;                        allocFlagsCopy,</div><div class="line"><a name="l10458"></a><span class="lineno">10458</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l10459"></a><span class="lineno">10459</span>&#160;                        suballocType,</div><div class="line"><a name="l10460"></a><span class="lineno">10460</span>&#160;                        strategy,</div><div class="line"><a name="l10461"></a><span class="lineno">10461</span>&#160;                        pAllocation);</div><div class="line"><a name="l10462"></a><span class="lineno">10462</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10463"></a><span class="lineno">10463</span>&#160;                    {</div><div class="line"><a name="l10464"></a><span class="lineno">10464</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l10465"></a><span class="lineno">10465</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10466"></a><span class="lineno">10466</span>&#160;                    }</div><div class="line"><a name="l10467"></a><span class="lineno">10467</span>&#160;                }</div><div class="line"><a name="l10468"></a><span class="lineno">10468</span>&#160;            }</div><div class="line"><a name="l10469"></a><span class="lineno">10469</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div><div class="line"><a name="l10470"></a><span class="lineno">10470</span>&#160;            {</div><div class="line"><a name="l10471"></a><span class="lineno">10471</span>&#160;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div><div class="line"><a name="l10472"></a><span class="lineno">10472</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l10473"></a><span class="lineno">10473</span>&#160;                {</div><div class="line"><a name="l10474"></a><span class="lineno">10474</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10475"></a><span class="lineno">10475</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10476"></a><span class="lineno">10476</span>&#160;                    VkResult res = AllocateFromBlock(</div><div class="line"><a name="l10477"></a><span class="lineno">10477</span>&#160;                        pCurrBlock,</div><div class="line"><a name="l10478"></a><span class="lineno">10478</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l10479"></a><span class="lineno">10479</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l10480"></a><span class="lineno">10480</span>&#160;                        size,</div><div class="line"><a name="l10481"></a><span class="lineno">10481</span>&#160;                        alignment,</div><div class="line"><a name="l10482"></a><span class="lineno">10482</span>&#160;                        allocFlagsCopy,</div><div class="line"><a name="l10483"></a><span class="lineno">10483</span>&#160;                        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l10484"></a><span class="lineno">10484</span>&#160;                        suballocType,</div><div class="line"><a name="l10485"></a><span class="lineno">10485</span>&#160;                        strategy,</div><div class="line"><a name="l10486"></a><span class="lineno">10486</span>&#160;                        pAllocation);</div><div class="line"><a name="l10487"></a><span class="lineno">10487</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10488"></a><span class="lineno">10488</span>&#160;                    {</div><div class="line"><a name="l10489"></a><span class="lineno">10489</span>&#160;                        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Returned from existing block #%u&quot;</span>, (uint32_t)blockIndex);</div><div class="line"><a name="l10490"></a><span class="lineno">10490</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10491"></a><span class="lineno">10491</span>&#160;                    }</div><div class="line"><a name="l10492"></a><span class="lineno">10492</span>&#160;                }</div><div class="line"><a name="l10493"></a><span class="lineno">10493</span>&#160;            }</div><div class="line"><a name="l10494"></a><span class="lineno">10494</span>&#160;        }</div><div class="line"><a name="l10495"></a><span class="lineno">10495</span>&#160;</div><div class="line"><a name="l10496"></a><span class="lineno">10496</span>&#160;        <span class="comment">// 2. Try to create new block.</span></div><div class="line"><a name="l10497"></a><span class="lineno">10497</span>&#160;        <span class="keywordflow">if</span>(canCreateNewBlock)</div><div class="line"><a name="l10498"></a><span class="lineno">10498</span>&#160;        {</div><div class="line"><a name="l10499"></a><span class="lineno">10499</span>&#160;            <span class="comment">// Calculate optimal size for new block.</span></div><div class="line"><a name="l10500"></a><span class="lineno">10500</span>&#160;            VkDeviceSize newBlockSize = m_PreferredBlockSize;</div><div class="line"><a name="l10501"></a><span class="lineno">10501</span>&#160;            uint32_t newBlockSizeShift = 0;</div><div class="line"><a name="l10502"></a><span class="lineno">10502</span>&#160;            <span class="keyword">const</span> uint32_t NEW_BLOCK_SIZE_SHIFT_MAX = 3;</div><div class="line"><a name="l10503"></a><span class="lineno">10503</span>&#160;</div><div class="line"><a name="l10504"></a><span class="lineno">10504</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div><div class="line"><a name="l10505"></a><span class="lineno">10505</span>&#160;            {</div><div class="line"><a name="l10506"></a><span class="lineno">10506</span>&#160;                <span class="comment">// Allocate 1/8, 1/4, 1/2 as first blocks.</span></div><div class="line"><a name="l10507"></a><span class="lineno">10507</span>&#160;                <span class="keyword">const</span> VkDeviceSize maxExistingBlockSize = CalcMaxBlockSize();</div><div class="line"><a name="l10508"></a><span class="lineno">10508</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="l10509"></a><span class="lineno">10509</span>&#160;                {</div><div class="line"><a name="l10510"></a><span class="lineno">10510</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l10511"></a><span class="lineno">10511</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt; maxExistingBlockSize &amp;&amp; smallerNewBlockSize &gt;= size * 2)</div><div class="line"><a name="l10512"></a><span class="lineno">10512</span>&#160;                    {</div><div class="line"><a name="l10513"></a><span class="lineno">10513</span>&#160;                        newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l10514"></a><span class="lineno">10514</span>&#160;                        ++newBlockSizeShift;</div><div class="line"><a name="l10515"></a><span class="lineno">10515</span>&#160;                    }</div><div class="line"><a name="l10516"></a><span class="lineno">10516</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l10517"></a><span class="lineno">10517</span>&#160;                    {</div><div class="line"><a name="l10518"></a><span class="lineno">10518</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10519"></a><span class="lineno">10519</span>&#160;                    }</div><div class="line"><a name="l10520"></a><span class="lineno">10520</span>&#160;                }</div><div class="line"><a name="l10521"></a><span class="lineno">10521</span>&#160;            }</div><div class="line"><a name="l10522"></a><span class="lineno">10522</span>&#160;</div><div class="line"><a name="l10523"></a><span class="lineno">10523</span>&#160;            <span class="keywordtype">size_t</span> newBlockIndex = 0;</div><div class="line"><a name="l10524"></a><span class="lineno">10524</span>&#160;            VkResult res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l10525"></a><span class="lineno">10525</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="l10526"></a><span class="lineno">10526</span>&#160;            <span class="keywordflow">if</span>(!m_ExplicitBlockSize)</div><div class="line"><a name="l10527"></a><span class="lineno">10527</span>&#160;            {</div><div class="line"><a name="l10528"></a><span class="lineno">10528</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="l10529"></a><span class="lineno">10529</span>&#160;                {</div><div class="line"><a name="l10530"></a><span class="lineno">10530</span>&#160;                    <span class="keyword">const</span> VkDeviceSize smallerNewBlockSize = newBlockSize / 2;</div><div class="line"><a name="l10531"></a><span class="lineno">10531</span>&#160;                    <span class="keywordflow">if</span>(smallerNewBlockSize &gt;= size)</div><div class="line"><a name="l10532"></a><span class="lineno">10532</span>&#160;                    {</div><div class="line"><a name="l10533"></a><span class="lineno">10533</span>&#160;                        newBlockSize = smallerNewBlockSize;</div><div class="line"><a name="l10534"></a><span class="lineno">10534</span>&#160;                        ++newBlockSizeShift;</div><div class="line"><a name="l10535"></a><span class="lineno">10535</span>&#160;                        res = CreateBlock(newBlockSize, &amp;newBlockIndex);</div><div class="line"><a name="l10536"></a><span class="lineno">10536</span>&#160;                    }</div><div class="line"><a name="l10537"></a><span class="lineno">10537</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l10538"></a><span class="lineno">10538</span>&#160;                    {</div><div class="line"><a name="l10539"></a><span class="lineno">10539</span>&#160;                        <span class="keywordflow">break</span>;</div><div class="line"><a name="l10540"></a><span class="lineno">10540</span>&#160;                    }</div><div class="line"><a name="l10541"></a><span class="lineno">10541</span>&#160;                }</div><div class="line"><a name="l10542"></a><span class="lineno">10542</span>&#160;            }</div><div class="line"><a name="l10543"></a><span class="lineno">10543</span>&#160;</div><div class="line"><a name="l10544"></a><span class="lineno">10544</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10545"></a><span class="lineno">10545</span>&#160;            {</div><div class="line"><a name="l10546"></a><span class="lineno">10546</span>&#160;                VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[newBlockIndex];</div><div class="line"><a name="l10547"></a><span class="lineno">10547</span>&#160;                VMA_ASSERT(pBlock-&gt;m_pMetadata-&gt;GetSize() &gt;= size);</div><div class="line"><a name="l10548"></a><span class="lineno">10548</span>&#160;</div><div class="line"><a name="l10549"></a><span class="lineno">10549</span>&#160;                res = AllocateFromBlock(</div><div class="line"><a name="l10550"></a><span class="lineno">10550</span>&#160;                    pBlock,</div><div class="line"><a name="l10551"></a><span class="lineno">10551</span>&#160;                    hCurrentPool,</div><div class="line"><a name="l10552"></a><span class="lineno">10552</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l10553"></a><span class="lineno">10553</span>&#160;                    size,</div><div class="line"><a name="l10554"></a><span class="lineno">10554</span>&#160;                    alignment,</div><div class="line"><a name="l10555"></a><span class="lineno">10555</span>&#160;                    allocFlagsCopy,</div><div class="line"><a name="l10556"></a><span class="lineno">10556</span>&#160;                    createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l10557"></a><span class="lineno">10557</span>&#160;                    suballocType,</div><div class="line"><a name="l10558"></a><span class="lineno">10558</span>&#160;                    strategy,</div><div class="line"><a name="l10559"></a><span class="lineno">10559</span>&#160;                    pAllocation);</div><div class="line"><a name="l10560"></a><span class="lineno">10560</span>&#160;                <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l10561"></a><span class="lineno">10561</span>&#160;                {</div><div class="line"><a name="l10562"></a><span class="lineno">10562</span>&#160;                    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Created new block Size=%llu&quot;</span>, newBlockSize);</div><div class="line"><a name="l10563"></a><span class="lineno">10563</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10564"></a><span class="lineno">10564</span>&#160;                }</div><div class="line"><a name="l10565"></a><span class="lineno">10565</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l10566"></a><span class="lineno">10566</span>&#160;                {</div><div class="line"><a name="l10567"></a><span class="lineno">10567</span>&#160;                    <span class="comment">// Allocation from new block failed, possibly due to VMA_DEBUG_MARGIN or alignment.</span></div><div class="line"><a name="l10568"></a><span class="lineno">10568</span>&#160;                    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l10569"></a><span class="lineno">10569</span>&#160;                }</div><div class="line"><a name="l10570"></a><span class="lineno">10570</span>&#160;            }</div><div class="line"><a name="l10571"></a><span class="lineno">10571</span>&#160;        }</div><div class="line"><a name="l10572"></a><span class="lineno">10572</span>&#160;    }</div><div class="line"><a name="l10573"></a><span class="lineno">10573</span>&#160;</div><div class="line"><a name="l10574"></a><span class="lineno">10574</span>&#160;    <span class="comment">// 3. Try to allocate from existing blocks with making other allocations lost.</span></div><div class="line"><a name="l10575"></a><span class="lineno">10575</span>&#160;    <span class="keywordflow">if</span>(canMakeOtherLost)</div><div class="line"><a name="l10576"></a><span class="lineno">10576</span>&#160;    {</div><div class="line"><a name="l10577"></a><span class="lineno">10577</span>&#160;        uint32_t tryIndex = 0;</div><div class="line"><a name="l10578"></a><span class="lineno">10578</span>&#160;        <span class="keywordflow">for</span>(; tryIndex &lt; VMA_ALLOCATION_TRY_COUNT; ++tryIndex)</div><div class="line"><a name="l10579"></a><span class="lineno">10579</span>&#160;        {</div><div class="line"><a name="l10580"></a><span class="lineno">10580</span>&#160;            VmaDeviceMemoryBlock* pBestRequestBlock = VMA_NULL;</div><div class="line"><a name="l10581"></a><span class="lineno">10581</span>&#160;            VmaAllocationRequest bestRequest = {};</div><div class="line"><a name="l10582"></a><span class="lineno">10582</span>&#160;            VkDeviceSize bestRequestCost = VK_WHOLE_SIZE;</div><div class="line"><a name="l10583"></a><span class="lineno">10583</span>&#160;</div><div class="line"><a name="l10584"></a><span class="lineno">10584</span>&#160;            <span class="comment">// 1. Search existing allocations.</span></div><div class="line"><a name="l10585"></a><span class="lineno">10585</span>&#160;            <span class="keywordflow">if</span>(strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>)</div><div class="line"><a name="l10586"></a><span class="lineno">10586</span>&#160;            {</div><div class="line"><a name="l10587"></a><span class="lineno">10587</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="l10588"></a><span class="lineno">10588</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="l10589"></a><span class="lineno">10589</span>&#160;                {</div><div class="line"><a name="l10590"></a><span class="lineno">10590</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10591"></a><span class="lineno">10591</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10592"></a><span class="lineno">10592</span>&#160;                    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l10593"></a><span class="lineno">10593</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l10594"></a><span class="lineno">10594</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l10595"></a><span class="lineno">10595</span>&#160;                        m_FrameInUseCount,</div><div class="line"><a name="l10596"></a><span class="lineno">10596</span>&#160;                        m_BufferImageGranularity,</div><div class="line"><a name="l10597"></a><span class="lineno">10597</span>&#160;                        size,</div><div class="line"><a name="l10598"></a><span class="lineno">10598</span>&#160;                        alignment,</div><div class="line"><a name="l10599"></a><span class="lineno">10599</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#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div><div class="line"><a name="l10600"></a><span class="lineno">10600</span>&#160;                        suballocType,</div><div class="line"><a name="l10601"></a><span class="lineno">10601</span>&#160;                        canMakeOtherLost,</div><div class="line"><a name="l10602"></a><span class="lineno">10602</span>&#160;                        strategy,</div><div class="line"><a name="l10603"></a><span class="lineno">10603</span>&#160;                        &amp;currRequest))</div><div class="line"><a name="l10604"></a><span class="lineno">10604</span>&#160;                    {</div><div class="line"><a name="l10605"></a><span class="lineno">10605</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l10606"></a><span class="lineno">10606</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l10607"></a><span class="lineno">10607</span>&#160;                            currRequestCost &lt; bestRequestCost)</div><div class="line"><a name="l10608"></a><span class="lineno">10608</span>&#160;                        {</div><div class="line"><a name="l10609"></a><span class="lineno">10609</span>&#160;                            pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l10610"></a><span class="lineno">10610</span>&#160;                            bestRequest = currRequest;</div><div class="line"><a name="l10611"></a><span class="lineno">10611</span>&#160;                            bestRequestCost = currRequestCost;</div><div class="line"><a name="l10612"></a><span class="lineno">10612</span>&#160;</div><div class="line"><a name="l10613"></a><span class="lineno">10613</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0)</div><div class="line"><a name="l10614"></a><span class="lineno">10614</span>&#160;                            {</div><div class="line"><a name="l10615"></a><span class="lineno">10615</span>&#160;                                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10616"></a><span class="lineno">10616</span>&#160;                            }</div><div class="line"><a name="l10617"></a><span class="lineno">10617</span>&#160;                        }</div><div class="line"><a name="l10618"></a><span class="lineno">10618</span>&#160;                    }</div><div class="line"><a name="l10619"></a><span class="lineno">10619</span>&#160;                }</div><div class="line"><a name="l10620"></a><span class="lineno">10620</span>&#160;            }</div><div class="line"><a name="l10621"></a><span class="lineno">10621</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// WORST_FIT, FIRST_FIT</span></div><div class="line"><a name="l10622"></a><span class="lineno">10622</span>&#160;            {</div><div class="line"><a name="l10623"></a><span class="lineno">10623</span>&#160;                <span class="comment">// Backward order in m_Blocks - prefer blocks with largest amount of free space.</span></div><div class="line"><a name="l10624"></a><span class="lineno">10624</span>&#160;                <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l10625"></a><span class="lineno">10625</span>&#160;                {</div><div class="line"><a name="l10626"></a><span class="lineno">10626</span>&#160;                    VmaDeviceMemoryBlock* <span class="keyword">const</span> pCurrBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l10627"></a><span class="lineno">10627</span>&#160;                    VMA_ASSERT(pCurrBlock);</div><div class="line"><a name="l10628"></a><span class="lineno">10628</span>&#160;                    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l10629"></a><span class="lineno">10629</span>&#160;                    <span class="keywordflow">if</span>(pCurrBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l10630"></a><span class="lineno">10630</span>&#160;                        currentFrameIndex,</div><div class="line"><a name="l10631"></a><span class="lineno">10631</span>&#160;                        m_FrameInUseCount,</div><div class="line"><a name="l10632"></a><span class="lineno">10632</span>&#160;                        m_BufferImageGranularity,</div><div class="line"><a name="l10633"></a><span class="lineno">10633</span>&#160;                        size,</div><div class="line"><a name="l10634"></a><span class="lineno">10634</span>&#160;                        alignment,</div><div class="line"><a name="l10635"></a><span class="lineno">10635</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#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0,</div><div class="line"><a name="l10636"></a><span class="lineno">10636</span>&#160;                        suballocType,</div><div class="line"><a name="l10637"></a><span class="lineno">10637</span>&#160;                        canMakeOtherLost,</div><div class="line"><a name="l10638"></a><span class="lineno">10638</span>&#160;                        strategy,</div><div class="line"><a name="l10639"></a><span class="lineno">10639</span>&#160;                        &amp;currRequest))</div><div class="line"><a name="l10640"></a><span class="lineno">10640</span>&#160;                    {</div><div class="line"><a name="l10641"></a><span class="lineno">10641</span>&#160;                        <span class="keyword">const</span> VkDeviceSize currRequestCost = currRequest.CalcCost();</div><div class="line"><a name="l10642"></a><span class="lineno">10642</span>&#160;                        <span class="keywordflow">if</span>(pBestRequestBlock == VMA_NULL ||</div><div class="line"><a name="l10643"></a><span class="lineno">10643</span>&#160;                            currRequestCost &lt; bestRequestCost ||</div><div class="line"><a name="l10644"></a><span class="lineno">10644</span>&#160;                            strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div><div class="line"><a name="l10645"></a><span class="lineno">10645</span>&#160;                        {</div><div class="line"><a name="l10646"></a><span class="lineno">10646</span>&#160;                            pBestRequestBlock = pCurrBlock;</div><div class="line"><a name="l10647"></a><span class="lineno">10647</span>&#160;                            bestRequest = currRequest;</div><div class="line"><a name="l10648"></a><span class="lineno">10648</span>&#160;                            bestRequestCost = currRequestCost;</div><div class="line"><a name="l10649"></a><span class="lineno">10649</span>&#160;</div><div class="line"><a name="l10650"></a><span class="lineno">10650</span>&#160;                            <span class="keywordflow">if</span>(bestRequestCost == 0 ||</div><div class="line"><a name="l10651"></a><span class="lineno">10651</span>&#160;                                strategy == <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a>)</div><div class="line"><a name="l10652"></a><span class="lineno">10652</span>&#160;                            {</div><div class="line"><a name="l10653"></a><span class="lineno">10653</span>&#160;                                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10654"></a><span class="lineno">10654</span>&#160;                            }</div><div class="line"><a name="l10655"></a><span class="lineno">10655</span>&#160;                        }</div><div class="line"><a name="l10656"></a><span class="lineno">10656</span>&#160;                    }</div><div class="line"><a name="l10657"></a><span class="lineno">10657</span>&#160;                }</div><div class="line"><a name="l10658"></a><span class="lineno">10658</span>&#160;            }</div><div class="line"><a name="l10659"></a><span class="lineno">10659</span>&#160;</div><div class="line"><a name="l10660"></a><span class="lineno">10660</span>&#160;            <span class="keywordflow">if</span>(pBestRequestBlock != VMA_NULL)</div><div class="line"><a name="l10661"></a><span class="lineno">10661</span>&#160;            {</div><div class="line"><a name="l10662"></a><span class="lineno">10662</span>&#160;                <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l10663"></a><span class="lineno">10663</span>&#160;                {</div><div class="line"><a name="l10664"></a><span class="lineno">10664</span>&#160;                    VkResult res = pBestRequestBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l10665"></a><span class="lineno">10665</span>&#160;                    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10666"></a><span class="lineno">10666</span>&#160;                    {</div><div class="line"><a name="l10667"></a><span class="lineno">10667</span>&#160;                        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10668"></a><span class="lineno">10668</span>&#160;                    }</div><div class="line"><a name="l10669"></a><span class="lineno">10669</span>&#160;                }</div><div class="line"><a name="l10670"></a><span class="lineno">10670</span>&#160;</div><div class="line"><a name="l10671"></a><span class="lineno">10671</span>&#160;                <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;MakeRequestedAllocationsLost(</div><div class="line"><a name="l10672"></a><span class="lineno">10672</span>&#160;                    currentFrameIndex,</div><div class="line"><a name="l10673"></a><span class="lineno">10673</span>&#160;                    m_FrameInUseCount,</div><div class="line"><a name="l10674"></a><span class="lineno">10674</span>&#160;                    &amp;bestRequest))</div><div class="line"><a name="l10675"></a><span class="lineno">10675</span>&#160;                {</div><div class="line"><a name="l10676"></a><span class="lineno">10676</span>&#160;                    <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l10677"></a><span class="lineno">10677</span>&#160;                    <span class="keywordflow">if</span>(pBestRequestBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l10678"></a><span class="lineno">10678</span>&#160;                    {</div><div class="line"><a name="l10679"></a><span class="lineno">10679</span>&#160;                        m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l10680"></a><span class="lineno">10680</span>&#160;                    }</div><div class="line"><a name="l10681"></a><span class="lineno">10681</span>&#160;                    <span class="comment">// Allocate from this pBlock.</span></div><div class="line"><a name="l10682"></a><span class="lineno">10682</span>&#160;                    *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l10683"></a><span class="lineno">10683</span>&#160;                    pBestRequestBlock-&gt;m_pMetadata-&gt;Alloc(bestRequest, suballocType, size, isUpperAddress, *pAllocation);</div><div class="line"><a name="l10684"></a><span class="lineno">10684</span>&#160;                    (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l10685"></a><span class="lineno">10685</span>&#160;                        hCurrentPool,</div><div class="line"><a name="l10686"></a><span class="lineno">10686</span>&#160;                        pBestRequestBlock,</div><div class="line"><a name="l10687"></a><span class="lineno">10687</span>&#160;                        bestRequest.offset,</div><div class="line"><a name="l10688"></a><span class="lineno">10688</span>&#160;                        alignment,</div><div class="line"><a name="l10689"></a><span class="lineno">10689</span>&#160;                        size,</div><div class="line"><a name="l10690"></a><span class="lineno">10690</span>&#160;                        suballocType,</div><div class="line"><a name="l10691"></a><span class="lineno">10691</span>&#160;                        mapped,</div><div class="line"><a name="l10692"></a><span class="lineno">10692</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="l10693"></a><span class="lineno">10693</span>&#160;                    VMA_HEAVY_ASSERT(pBestRequestBlock-&gt;Validate());</div><div class="line"><a name="l10694"></a><span class="lineno">10694</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="l10695"></a><span class="lineno">10695</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="l10696"></a><span class="lineno">10696</span>&#160;                    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l10697"></a><span class="lineno">10697</span>&#160;                    {</div><div class="line"><a name="l10698"></a><span class="lineno">10698</span>&#160;                        m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l10699"></a><span class="lineno">10699</span>&#160;                    }</div><div class="line"><a name="l10700"></a><span class="lineno">10700</span>&#160;                    <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l10701"></a><span class="lineno">10701</span>&#160;                    {</div><div class="line"><a name="l10702"></a><span class="lineno">10702</span>&#160;                        VkResult res = pBestRequestBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, bestRequest.offset, size);</div><div class="line"><a name="l10703"></a><span class="lineno">10703</span>&#160;                        VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l10704"></a><span class="lineno">10704</span>&#160;                    }</div><div class="line"><a name="l10705"></a><span class="lineno">10705</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10706"></a><span class="lineno">10706</span>&#160;                }</div><div class="line"><a name="l10707"></a><span class="lineno">10707</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="l10708"></a><span class="lineno">10708</span>&#160;            }</div><div class="line"><a name="l10709"></a><span class="lineno">10709</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l10710"></a><span class="lineno">10710</span>&#160;            {</div><div class="line"><a name="l10711"></a><span class="lineno">10711</span>&#160;                <span class="comment">// Could not find place in any of the blocks - break outer loop.</span></div><div class="line"><a name="l10712"></a><span class="lineno">10712</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l10713"></a><span class="lineno">10713</span>&#160;            }</div><div class="line"><a name="l10714"></a><span class="lineno">10714</span>&#160;        }</div><div class="line"><a name="l10715"></a><span class="lineno">10715</span>&#160;        <span class="comment">/* Maximum number of tries exceeded - a very unlike event when many other</span></div><div class="line"><a name="l10716"></a><span class="lineno">10716</span>&#160;<span class="comment">        threads are simultaneously touching allocations making it impossible to make</span></div><div class="line"><a name="l10717"></a><span class="lineno">10717</span>&#160;<span class="comment">        lost at the same time as we try to allocate. */</span></div><div class="line"><a name="l10718"></a><span class="lineno">10718</span>&#160;        <span class="keywordflow">if</span>(tryIndex == VMA_ALLOCATION_TRY_COUNT)</div><div class="line"><a name="l10719"></a><span class="lineno">10719</span>&#160;        {</div><div class="line"><a name="l10720"></a><span class="lineno">10720</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_TOO_MANY_OBJECTS;</div><div class="line"><a name="l10721"></a><span class="lineno">10721</span>&#160;        }</div><div class="line"><a name="l10722"></a><span class="lineno">10722</span>&#160;    }</div><div class="line"><a name="l10723"></a><span class="lineno">10723</span>&#160;</div><div class="line"><a name="l10724"></a><span class="lineno">10724</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l10725"></a><span class="lineno">10725</span>&#160;}</div><div class="line"><a name="l10726"></a><span class="lineno">10726</span>&#160;</div><div class="line"><a name="l10727"></a><span class="lineno">10727</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Free(</div><div class="line"><a name="l10728"></a><span class="lineno">10728</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation)</div><div class="line"><a name="l10729"></a><span class="lineno">10729</span>&#160;{</div><div class="line"><a name="l10730"></a><span class="lineno">10730</span>&#160;    VmaDeviceMemoryBlock* pBlockToDelete = VMA_NULL;</div><div class="line"><a name="l10731"></a><span class="lineno">10731</span>&#160;</div><div class="line"><a name="l10732"></a><span class="lineno">10732</span>&#160;    <span class="comment">// Scope for lock.</span></div><div class="line"><a name="l10733"></a><span class="lineno">10733</span>&#160;    {</div><div class="line"><a name="l10734"></a><span class="lineno">10734</span>&#160;        VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10735"></a><span class="lineno">10735</span>&#160;</div><div class="line"><a name="l10736"></a><span class="lineno">10736</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l10737"></a><span class="lineno">10737</span>&#160;</div><div class="line"><a name="l10738"></a><span class="lineno">10738</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l10739"></a><span class="lineno">10739</span>&#160;        {</div><div class="line"><a name="l10740"></a><span class="lineno">10740</span>&#160;            VkResult res = pBlock-&gt;ValidateMagicValueAroundAllocation(m_hAllocator, hAllocation-&gt;GetOffset(), hAllocation-&gt;GetSize());</div><div class="line"><a name="l10741"></a><span class="lineno">10741</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to validate magic value.&quot;</span>);</div><div class="line"><a name="l10742"></a><span class="lineno">10742</span>&#160;        }</div><div class="line"><a name="l10743"></a><span class="lineno">10743</span>&#160;</div><div class="line"><a name="l10744"></a><span class="lineno">10744</span>&#160;        <span class="keywordflow">if</span>(hAllocation-&gt;IsPersistentMap())</div><div class="line"><a name="l10745"></a><span class="lineno">10745</span>&#160;        {</div><div class="line"><a name="l10746"></a><span class="lineno">10746</span>&#160;            pBlock-&gt;Unmap(m_hAllocator, 1);</div><div class="line"><a name="l10747"></a><span class="lineno">10747</span>&#160;        }</div><div class="line"><a name="l10748"></a><span class="lineno">10748</span>&#160;</div><div class="line"><a name="l10749"></a><span class="lineno">10749</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Free(hAllocation);</div><div class="line"><a name="l10750"></a><span class="lineno">10750</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l10751"></a><span class="lineno">10751</span>&#160;</div><div class="line"><a name="l10752"></a><span class="lineno">10752</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;  Freed from MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l10753"></a><span class="lineno">10753</span>&#160;</div><div class="line"><a name="l10754"></a><span class="lineno">10754</span>&#160;        <span class="comment">// pBlock became empty after this deallocation.</span></div><div class="line"><a name="l10755"></a><span class="lineno">10755</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l10756"></a><span class="lineno">10756</span>&#160;        {</div><div class="line"><a name="l10757"></a><span class="lineno">10757</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="l10758"></a><span class="lineno">10758</span>&#160;            <span class="keywordflow">if</span>(m_HasEmptyBlock &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l10759"></a><span class="lineno">10759</span>&#160;            {</div><div class="line"><a name="l10760"></a><span class="lineno">10760</span>&#160;                pBlockToDelete = pBlock;</div><div class="line"><a name="l10761"></a><span class="lineno">10761</span>&#160;                Remove(pBlock);</div><div class="line"><a name="l10762"></a><span class="lineno">10762</span>&#160;            }</div><div class="line"><a name="l10763"></a><span class="lineno">10763</span>&#160;            <span class="comment">// We now have first empty block.</span></div><div class="line"><a name="l10764"></a><span class="lineno">10764</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l10765"></a><span class="lineno">10765</span>&#160;            {</div><div class="line"><a name="l10766"></a><span class="lineno">10766</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l10767"></a><span class="lineno">10767</span>&#160;            }</div><div class="line"><a name="l10768"></a><span class="lineno">10768</span>&#160;        }</div><div class="line"><a name="l10769"></a><span class="lineno">10769</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="l10770"></a><span class="lineno">10770</span>&#160;        <span class="comment">// (This is optional, heuristics.)</span></div><div class="line"><a name="l10771"></a><span class="lineno">10771</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_HasEmptyBlock)</div><div class="line"><a name="l10772"></a><span class="lineno">10772</span>&#160;        {</div><div class="line"><a name="l10773"></a><span class="lineno">10773</span>&#160;            VmaDeviceMemoryBlock* pLastBlock = m_Blocks.back();</div><div class="line"><a name="l10774"></a><span class="lineno">10774</span>&#160;            <span class="keywordflow">if</span>(pLastBlock-&gt;m_pMetadata-&gt;IsEmpty() &amp;&amp; m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l10775"></a><span class="lineno">10775</span>&#160;            {</div><div class="line"><a name="l10776"></a><span class="lineno">10776</span>&#160;                pBlockToDelete = pLastBlock;</div><div class="line"><a name="l10777"></a><span class="lineno">10777</span>&#160;                m_Blocks.pop_back();</div><div class="line"><a name="l10778"></a><span class="lineno">10778</span>&#160;                m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l10779"></a><span class="lineno">10779</span>&#160;            }</div><div class="line"><a name="l10780"></a><span class="lineno">10780</span>&#160;        }</div><div class="line"><a name="l10781"></a><span class="lineno">10781</span>&#160;</div><div class="line"><a name="l10782"></a><span class="lineno">10782</span>&#160;        IncrementallySortBlocks();</div><div class="line"><a name="l10783"></a><span class="lineno">10783</span>&#160;    }</div><div class="line"><a name="l10784"></a><span class="lineno">10784</span>&#160;</div><div class="line"><a name="l10785"></a><span class="lineno">10785</span>&#160;    <span class="comment">// Destruction of a free Allocation. Deferred until this point, outside of mutex</span></div><div class="line"><a name="l10786"></a><span class="lineno">10786</span>&#160;    <span class="comment">// lock, for performance reason.</span></div><div class="line"><a name="l10787"></a><span class="lineno">10787</span>&#160;    <span class="keywordflow">if</span>(pBlockToDelete != VMA_NULL)</div><div class="line"><a name="l10788"></a><span class="lineno">10788</span>&#160;    {</div><div class="line"><a name="l10789"></a><span class="lineno">10789</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Deleted empty allocation&quot;</span>);</div><div class="line"><a name="l10790"></a><span class="lineno">10790</span>&#160;        pBlockToDelete-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l10791"></a><span class="lineno">10791</span>&#160;        vma_delete(m_hAllocator, pBlockToDelete);</div><div class="line"><a name="l10792"></a><span class="lineno">10792</span>&#160;    }</div><div class="line"><a name="l10793"></a><span class="lineno">10793</span>&#160;}</div><div class="line"><a name="l10794"></a><span class="lineno">10794</span>&#160;</div><div class="line"><a name="l10795"></a><span class="lineno">10795</span>&#160;VkDeviceSize VmaBlockVector::CalcMaxBlockSize()<span class="keyword"> const</span></div><div class="line"><a name="l10796"></a><span class="lineno">10796</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l10797"></a><span class="lineno">10797</span>&#160;    VkDeviceSize result = 0;</div><div class="line"><a name="l10798"></a><span class="lineno">10798</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l10799"></a><span class="lineno">10799</span>&#160;    {</div><div class="line"><a name="l10800"></a><span class="lineno">10800</span>&#160;        result = VMA_MAX(result, m_Blocks[i]-&gt;m_pMetadata-&gt;GetSize());</div><div class="line"><a name="l10801"></a><span class="lineno">10801</span>&#160;        <span class="keywordflow">if</span>(result &gt;= m_PreferredBlockSize)</div><div class="line"><a name="l10802"></a><span class="lineno">10802</span>&#160;        {</div><div class="line"><a name="l10803"></a><span class="lineno">10803</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l10804"></a><span class="lineno">10804</span>&#160;        }</div><div class="line"><a name="l10805"></a><span class="lineno">10805</span>&#160;    }</div><div class="line"><a name="l10806"></a><span class="lineno">10806</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l10807"></a><span class="lineno">10807</span>&#160;}</div><div class="line"><a name="l10808"></a><span class="lineno">10808</span>&#160;</div><div class="line"><a name="l10809"></a><span class="lineno">10809</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::Remove(VmaDeviceMemoryBlock* pBlock)</div><div class="line"><a name="l10810"></a><span class="lineno">10810</span>&#160;{</div><div class="line"><a name="l10811"></a><span class="lineno">10811</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l10812"></a><span class="lineno">10812</span>&#160;    {</div><div class="line"><a name="l10813"></a><span class="lineno">10813</span>&#160;        <span class="keywordflow">if</span>(m_Blocks[blockIndex] == pBlock)</div><div class="line"><a name="l10814"></a><span class="lineno">10814</span>&#160;        {</div><div class="line"><a name="l10815"></a><span class="lineno">10815</span>&#160;            VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l10816"></a><span class="lineno">10816</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l10817"></a><span class="lineno">10817</span>&#160;        }</div><div class="line"><a name="l10818"></a><span class="lineno">10818</span>&#160;    }</div><div class="line"><a name="l10819"></a><span class="lineno">10819</span>&#160;    VMA_ASSERT(0);</div><div class="line"><a name="l10820"></a><span class="lineno">10820</span>&#160;}</div><div class="line"><a name="l10821"></a><span class="lineno">10821</span>&#160;</div><div class="line"><a name="l10822"></a><span class="lineno">10822</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::IncrementallySortBlocks()</div><div class="line"><a name="l10823"></a><span class="lineno">10823</span>&#160;{</div><div class="line"><a name="l10824"></a><span class="lineno">10824</span>&#160;    <span class="keywordflow">if</span>(m_Algorithm != <a class="code" href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a>)</div><div class="line"><a name="l10825"></a><span class="lineno">10825</span>&#160;    {</div><div class="line"><a name="l10826"></a><span class="lineno">10826</span>&#160;        <span class="comment">// Bubble sort only until first swap.</span></div><div class="line"><a name="l10827"></a><span class="lineno">10827</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="l10828"></a><span class="lineno">10828</span>&#160;        {</div><div class="line"><a name="l10829"></a><span class="lineno">10829</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[i - 1]-&gt;m_pMetadata-&gt;GetSumFreeSize() &gt; m_Blocks[i]-&gt;m_pMetadata-&gt;GetSumFreeSize())</div><div class="line"><a name="l10830"></a><span class="lineno">10830</span>&#160;            {</div><div class="line"><a name="l10831"></a><span class="lineno">10831</span>&#160;                VMA_SWAP(m_Blocks[i - 1], m_Blocks[i]);</div><div class="line"><a name="l10832"></a><span class="lineno">10832</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l10833"></a><span class="lineno">10833</span>&#160;            }</div><div class="line"><a name="l10834"></a><span class="lineno">10834</span>&#160;        }</div><div class="line"><a name="l10835"></a><span class="lineno">10835</span>&#160;    }</div><div class="line"><a name="l10836"></a><span class="lineno">10836</span>&#160;}</div><div class="line"><a name="l10837"></a><span class="lineno">10837</span>&#160;</div><div class="line"><a name="l10838"></a><span class="lineno">10838</span>&#160;VkResult VmaBlockVector::AllocateFromBlock(</div><div class="line"><a name="l10839"></a><span class="lineno">10839</span>&#160;    VmaDeviceMemoryBlock* pBlock,</div><div class="line"><a name="l10840"></a><span class="lineno">10840</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hCurrentPool,</div><div class="line"><a name="l10841"></a><span class="lineno">10841</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l10842"></a><span class="lineno">10842</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l10843"></a><span class="lineno">10843</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l10844"></a><span class="lineno">10844</span>&#160;    <a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags,</div><div class="line"><a name="l10845"></a><span class="lineno">10845</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l10846"></a><span class="lineno">10846</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l10847"></a><span class="lineno">10847</span>&#160;    uint32_t strategy,</div><div class="line"><a name="l10848"></a><span class="lineno">10848</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l10849"></a><span class="lineno">10849</span>&#160;{</div><div class="line"><a name="l10850"></a><span class="lineno">10850</span>&#160;    VMA_ASSERT((allocFlags &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="l10851"></a><span class="lineno">10851</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUpperAddress = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a>) != 0;</div><div class="line"><a name="l10852"></a><span class="lineno">10852</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (allocFlags &amp; <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a11da372cc3a82931c5e5d6146cd9dd1f">VMA_ALLOCATION_CREATE_MAPPED_BIT</a>) != 0;</div><div class="line"><a name="l10853"></a><span class="lineno">10853</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> isUserDataString = (allocFlags &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="l10854"></a><span class="lineno">10854</span>&#160;</div><div class="line"><a name="l10855"></a><span class="lineno">10855</span>&#160;    VmaAllocationRequest currRequest = {};</div><div class="line"><a name="l10856"></a><span class="lineno">10856</span>&#160;    <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l10857"></a><span class="lineno">10857</span>&#160;        currentFrameIndex,</div><div class="line"><a name="l10858"></a><span class="lineno">10858</span>&#160;        m_FrameInUseCount,</div><div class="line"><a name="l10859"></a><span class="lineno">10859</span>&#160;        m_BufferImageGranularity,</div><div class="line"><a name="l10860"></a><span class="lineno">10860</span>&#160;        size,</div><div class="line"><a name="l10861"></a><span class="lineno">10861</span>&#160;        alignment,</div><div class="line"><a name="l10862"></a><span class="lineno">10862</span>&#160;        isUpperAddress,</div><div class="line"><a name="l10863"></a><span class="lineno">10863</span>&#160;        suballocType,</div><div class="line"><a name="l10864"></a><span class="lineno">10864</span>&#160;        <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l10865"></a><span class="lineno">10865</span>&#160;        strategy,</div><div class="line"><a name="l10866"></a><span class="lineno">10866</span>&#160;        &amp;currRequest))</div><div class="line"><a name="l10867"></a><span class="lineno">10867</span>&#160;    {</div><div class="line"><a name="l10868"></a><span class="lineno">10868</span>&#160;        <span class="comment">// Allocate from pCurrBlock.</span></div><div class="line"><a name="l10869"></a><span class="lineno">10869</span>&#160;        VMA_ASSERT(currRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l10870"></a><span class="lineno">10870</span>&#160;</div><div class="line"><a name="l10871"></a><span class="lineno">10871</span>&#160;        <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l10872"></a><span class="lineno">10872</span>&#160;        {</div><div class="line"><a name="l10873"></a><span class="lineno">10873</span>&#160;            VkResult res = pBlock-&gt;Map(m_hAllocator, 1, VMA_NULL);</div><div class="line"><a name="l10874"></a><span class="lineno">10874</span>&#160;            <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l10875"></a><span class="lineno">10875</span>&#160;            {</div><div class="line"><a name="l10876"></a><span class="lineno">10876</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10877"></a><span class="lineno">10877</span>&#160;            }</div><div class="line"><a name="l10878"></a><span class="lineno">10878</span>&#160;        }</div><div class="line"><a name="l10879"></a><span class="lineno">10879</span>&#160;            </div><div class="line"><a name="l10880"></a><span class="lineno">10880</span>&#160;        <span class="comment">// We no longer have an empty Allocation.</span></div><div class="line"><a name="l10881"></a><span class="lineno">10881</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l10882"></a><span class="lineno">10882</span>&#160;        {</div><div class="line"><a name="l10883"></a><span class="lineno">10883</span>&#160;            m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l10884"></a><span class="lineno">10884</span>&#160;        }</div><div class="line"><a name="l10885"></a><span class="lineno">10885</span>&#160;            </div><div class="line"><a name="l10886"></a><span class="lineno">10886</span>&#160;        *pAllocation = vma_new(m_hAllocator, VmaAllocation_T)(currentFrameIndex, isUserDataString);</div><div class="line"><a name="l10887"></a><span class="lineno">10887</span>&#160;        pBlock-&gt;m_pMetadata-&gt;Alloc(currRequest, suballocType, size, isUpperAddress, *pAllocation);</div><div class="line"><a name="l10888"></a><span class="lineno">10888</span>&#160;        (*pAllocation)-&gt;InitBlockAllocation(</div><div class="line"><a name="l10889"></a><span class="lineno">10889</span>&#160;            hCurrentPool,</div><div class="line"><a name="l10890"></a><span class="lineno">10890</span>&#160;            pBlock,</div><div class="line"><a name="l10891"></a><span class="lineno">10891</span>&#160;            currRequest.offset,</div><div class="line"><a name="l10892"></a><span class="lineno">10892</span>&#160;            alignment,</div><div class="line"><a name="l10893"></a><span class="lineno">10893</span>&#160;            size,</div><div class="line"><a name="l10894"></a><span class="lineno">10894</span>&#160;            suballocType,</div><div class="line"><a name="l10895"></a><span class="lineno">10895</span>&#160;            mapped,</div><div class="line"><a name="l10896"></a><span class="lineno">10896</span>&#160;            (allocFlags &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="l10897"></a><span class="lineno">10897</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l10898"></a><span class="lineno">10898</span>&#160;        (*pAllocation)-&gt;SetUserData(m_hAllocator, pUserData);</div><div class="line"><a name="l10899"></a><span class="lineno">10899</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l10900"></a><span class="lineno">10900</span>&#160;        {</div><div class="line"><a name="l10901"></a><span class="lineno">10901</span>&#160;            m_hAllocator-&gt;FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l10902"></a><span class="lineno">10902</span>&#160;        }</div><div class="line"><a name="l10903"></a><span class="lineno">10903</span>&#160;        <span class="keywordflow">if</span>(IsCorruptionDetectionEnabled())</div><div class="line"><a name="l10904"></a><span class="lineno">10904</span>&#160;        {</div><div class="line"><a name="l10905"></a><span class="lineno">10905</span>&#160;            VkResult res = pBlock-&gt;WriteMagicValueAroundAllocation(m_hAllocator, currRequest.offset, size);</div><div class="line"><a name="l10906"></a><span class="lineno">10906</span>&#160;            VMA_ASSERT(res == VK_SUCCESS &amp;&amp; <span class="stringliteral">&quot;Couldn&#39;t map block memory to write magic value.&quot;</span>);</div><div class="line"><a name="l10907"></a><span class="lineno">10907</span>&#160;        }</div><div class="line"><a name="l10908"></a><span class="lineno">10908</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10909"></a><span class="lineno">10909</span>&#160;    }</div><div class="line"><a name="l10910"></a><span class="lineno">10910</span>&#160;    <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l10911"></a><span class="lineno">10911</span>&#160;}</div><div class="line"><a name="l10912"></a><span class="lineno">10912</span>&#160;</div><div class="line"><a name="l10913"></a><span class="lineno">10913</span>&#160;VkResult VmaBlockVector::CreateBlock(VkDeviceSize blockSize, <span class="keywordtype">size_t</span>* pNewBlockIndex)</div><div class="line"><a name="l10914"></a><span class="lineno">10914</span>&#160;{</div><div class="line"><a name="l10915"></a><span class="lineno">10915</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l10916"></a><span class="lineno">10916</span>&#160;    allocInfo.memoryTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l10917"></a><span class="lineno">10917</span>&#160;    allocInfo.allocationSize = blockSize;</div><div class="line"><a name="l10918"></a><span class="lineno">10918</span>&#160;    VkDeviceMemory mem = VK_NULL_HANDLE;</div><div class="line"><a name="l10919"></a><span class="lineno">10919</span>&#160;    VkResult res = m_hAllocator-&gt;AllocateVulkanMemory(&amp;allocInfo, &amp;mem);</div><div class="line"><a name="l10920"></a><span class="lineno">10920</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l10921"></a><span class="lineno">10921</span>&#160;    {</div><div class="line"><a name="l10922"></a><span class="lineno">10922</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l10923"></a><span class="lineno">10923</span>&#160;    }</div><div class="line"><a name="l10924"></a><span class="lineno">10924</span>&#160;</div><div class="line"><a name="l10925"></a><span class="lineno">10925</span>&#160;    <span class="comment">// New VkDeviceMemory successfully created.</span></div><div class="line"><a name="l10926"></a><span class="lineno">10926</span>&#160;</div><div class="line"><a name="l10927"></a><span class="lineno">10927</span>&#160;    <span class="comment">// Create new Allocation for it.</span></div><div class="line"><a name="l10928"></a><span class="lineno">10928</span>&#160;    VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = vma_new(m_hAllocator, VmaDeviceMemoryBlock)(m_hAllocator);</div><div class="line"><a name="l10929"></a><span class="lineno">10929</span>&#160;    pBlock-&gt;Init(</div><div class="line"><a name="l10930"></a><span class="lineno">10930</span>&#160;        m_hAllocator,</div><div class="line"><a name="l10931"></a><span class="lineno">10931</span>&#160;        m_MemoryTypeIndex,</div><div class="line"><a name="l10932"></a><span class="lineno">10932</span>&#160;        mem,</div><div class="line"><a name="l10933"></a><span class="lineno">10933</span>&#160;        allocInfo.allocationSize,</div><div class="line"><a name="l10934"></a><span class="lineno">10934</span>&#160;        m_NextBlockId++,</div><div class="line"><a name="l10935"></a><span class="lineno">10935</span>&#160;        m_Algorithm);</div><div class="line"><a name="l10936"></a><span class="lineno">10936</span>&#160;</div><div class="line"><a name="l10937"></a><span class="lineno">10937</span>&#160;    m_Blocks.push_back(pBlock);</div><div class="line"><a name="l10938"></a><span class="lineno">10938</span>&#160;    <span class="keywordflow">if</span>(pNewBlockIndex != VMA_NULL)</div><div class="line"><a name="l10939"></a><span class="lineno">10939</span>&#160;    {</div><div class="line"><a name="l10940"></a><span class="lineno">10940</span>&#160;        *pNewBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l10941"></a><span class="lineno">10941</span>&#160;    }</div><div class="line"><a name="l10942"></a><span class="lineno">10942</span>&#160;</div><div class="line"><a name="l10943"></a><span class="lineno">10943</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l10944"></a><span class="lineno">10944</span>&#160;}</div><div class="line"><a name="l10945"></a><span class="lineno">10945</span>&#160;</div><div class="line"><a name="l10946"></a><span class="lineno">10946</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l10947"></a><span class="lineno">10947</span>&#160;</div><div class="line"><a name="l10948"></a><span class="lineno">10948</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::PrintDetailedMap(<span class="keyword">class</span> VmaJsonWriter&amp; json)</div><div class="line"><a name="l10949"></a><span class="lineno">10949</span>&#160;{</div><div class="line"><a name="l10950"></a><span class="lineno">10950</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l10951"></a><span class="lineno">10951</span>&#160;</div><div class="line"><a name="l10952"></a><span class="lineno">10952</span>&#160;    json.BeginObject();</div><div class="line"><a name="l10953"></a><span class="lineno">10953</span>&#160;</div><div class="line"><a name="l10954"></a><span class="lineno">10954</span>&#160;    <span class="keywordflow">if</span>(m_IsCustomPool)</div><div class="line"><a name="l10955"></a><span class="lineno">10955</span>&#160;    {</div><div class="line"><a name="l10956"></a><span class="lineno">10956</span>&#160;        json.WriteString(<span class="stringliteral">&quot;MemoryTypeIndex&quot;</span>);</div><div class="line"><a name="l10957"></a><span class="lineno">10957</span>&#160;        json.WriteNumber(m_MemoryTypeIndex);</div><div class="line"><a name="l10958"></a><span class="lineno">10958</span>&#160;</div><div class="line"><a name="l10959"></a><span class="lineno">10959</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockSize&quot;</span>);</div><div class="line"><a name="l10960"></a><span class="lineno">10960</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l10961"></a><span class="lineno">10961</span>&#160;</div><div class="line"><a name="l10962"></a><span class="lineno">10962</span>&#160;        json.WriteString(<span class="stringliteral">&quot;BlockCount&quot;</span>);</div><div class="line"><a name="l10963"></a><span class="lineno">10963</span>&#160;        json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l10964"></a><span class="lineno">10964</span>&#160;        <span class="keywordflow">if</span>(m_MinBlockCount &gt; 0)</div><div class="line"><a name="l10965"></a><span class="lineno">10965</span>&#160;        {</div><div class="line"><a name="l10966"></a><span class="lineno">10966</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Min&quot;</span>);</div><div class="line"><a name="l10967"></a><span class="lineno">10967</span>&#160;            json.WriteNumber((uint64_t)m_MinBlockCount);</div><div class="line"><a name="l10968"></a><span class="lineno">10968</span>&#160;        }</div><div class="line"><a name="l10969"></a><span class="lineno">10969</span>&#160;        <span class="keywordflow">if</span>(m_MaxBlockCount &lt; SIZE_MAX)</div><div class="line"><a name="l10970"></a><span class="lineno">10970</span>&#160;        {</div><div class="line"><a name="l10971"></a><span class="lineno">10971</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Max&quot;</span>);</div><div class="line"><a name="l10972"></a><span class="lineno">10972</span>&#160;            json.WriteNumber((uint64_t)m_MaxBlockCount);</div><div class="line"><a name="l10973"></a><span class="lineno">10973</span>&#160;        }</div><div class="line"><a name="l10974"></a><span class="lineno">10974</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Cur&quot;</span>);</div><div class="line"><a name="l10975"></a><span class="lineno">10975</span>&#160;        json.WriteNumber((uint64_t)m_Blocks.size());</div><div class="line"><a name="l10976"></a><span class="lineno">10976</span>&#160;        json.EndObject();</div><div class="line"><a name="l10977"></a><span class="lineno">10977</span>&#160;</div><div class="line"><a name="l10978"></a><span class="lineno">10978</span>&#160;        <span class="keywordflow">if</span>(m_FrameInUseCount &gt; 0)</div><div class="line"><a name="l10979"></a><span class="lineno">10979</span>&#160;        {</div><div class="line"><a name="l10980"></a><span class="lineno">10980</span>&#160;            json.WriteString(<span class="stringliteral">&quot;FrameInUseCount&quot;</span>);</div><div class="line"><a name="l10981"></a><span class="lineno">10981</span>&#160;            json.WriteNumber(m_FrameInUseCount);</div><div class="line"><a name="l10982"></a><span class="lineno">10982</span>&#160;        }</div><div class="line"><a name="l10983"></a><span class="lineno">10983</span>&#160;</div><div class="line"><a name="l10984"></a><span class="lineno">10984</span>&#160;        <span class="keywordflow">if</span>(m_Algorithm != 0)</div><div class="line"><a name="l10985"></a><span class="lineno">10985</span>&#160;        {</div><div class="line"><a name="l10986"></a><span class="lineno">10986</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Algorithm&quot;</span>);</div><div class="line"><a name="l10987"></a><span class="lineno">10987</span>&#160;            json.WriteString(VmaAlgorithmToStr(m_Algorithm));</div><div class="line"><a name="l10988"></a><span class="lineno">10988</span>&#160;        }</div><div class="line"><a name="l10989"></a><span class="lineno">10989</span>&#160;    }</div><div class="line"><a name="l10990"></a><span class="lineno">10990</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l10991"></a><span class="lineno">10991</span>&#160;    {</div><div class="line"><a name="l10992"></a><span class="lineno">10992</span>&#160;        json.WriteString(<span class="stringliteral">&quot;PreferredBlockSize&quot;</span>);</div><div class="line"><a name="l10993"></a><span class="lineno">10993</span>&#160;        json.WriteNumber(m_PreferredBlockSize);</div><div class="line"><a name="l10994"></a><span class="lineno">10994</span>&#160;    }</div><div class="line"><a name="l10995"></a><span class="lineno">10995</span>&#160;</div><div class="line"><a name="l10996"></a><span class="lineno">10996</span>&#160;    json.WriteString(<span class="stringliteral">&quot;Blocks&quot;</span>);</div><div class="line"><a name="l10997"></a><span class="lineno">10997</span>&#160;    json.BeginObject();</div><div class="line"><a name="l10998"></a><span class="lineno">10998</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="l10999"></a><span class="lineno">10999</span>&#160;    {</div><div class="line"><a name="l11000"></a><span class="lineno">11000</span>&#160;        json.BeginString();</div><div class="line"><a name="l11001"></a><span class="lineno">11001</span>&#160;        json.ContinueString(m_Blocks[i]-&gt;GetId());</div><div class="line"><a name="l11002"></a><span class="lineno">11002</span>&#160;        json.EndString();</div><div class="line"><a name="l11003"></a><span class="lineno">11003</span>&#160;</div><div class="line"><a name="l11004"></a><span class="lineno">11004</span>&#160;        m_Blocks[i]-&gt;m_pMetadata-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l11005"></a><span class="lineno">11005</span>&#160;    }</div><div class="line"><a name="l11006"></a><span class="lineno">11006</span>&#160;    json.EndObject();</div><div class="line"><a name="l11007"></a><span class="lineno">11007</span>&#160;</div><div class="line"><a name="l11008"></a><span class="lineno">11008</span>&#160;    json.EndObject();</div><div class="line"><a name="l11009"></a><span class="lineno">11009</span>&#160;}</div><div class="line"><a name="l11010"></a><span class="lineno">11010</span>&#160;</div><div class="line"><a name="l11011"></a><span class="lineno">11011</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l11012"></a><span class="lineno">11012</span>&#160;</div><div class="line"><a name="l11013"></a><span class="lineno">11013</span>&#160;VmaDefragmentator* VmaBlockVector::EnsureDefragmentator(</div><div class="line"><a name="l11014"></a><span class="lineno">11014</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11015"></a><span class="lineno">11015</span>&#160;    uint32_t currentFrameIndex)</div><div class="line"><a name="l11016"></a><span class="lineno">11016</span>&#160;{</div><div class="line"><a name="l11017"></a><span class="lineno">11017</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l11018"></a><span class="lineno">11018</span>&#160;    {</div><div class="line"><a name="l11019"></a><span class="lineno">11019</span>&#160;        m_pDefragmentator = vma_new(m_hAllocator, VmaDefragmentator)(</div><div class="line"><a name="l11020"></a><span class="lineno">11020</span>&#160;            hAllocator,</div><div class="line"><a name="l11021"></a><span class="lineno">11021</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l11022"></a><span class="lineno">11022</span>&#160;            currentFrameIndex);</div><div class="line"><a name="l11023"></a><span class="lineno">11023</span>&#160;    }</div><div class="line"><a name="l11024"></a><span class="lineno">11024</span>&#160;</div><div class="line"><a name="l11025"></a><span class="lineno">11025</span>&#160;    <span class="keywordflow">return</span> m_pDefragmentator;</div><div class="line"><a name="l11026"></a><span class="lineno">11026</span>&#160;}</div><div class="line"><a name="l11027"></a><span class="lineno">11027</span>&#160;</div><div class="line"><a name="l11028"></a><span class="lineno">11028</span>&#160;VkResult VmaBlockVector::Defragment(</div><div class="line"><a name="l11029"></a><span class="lineno">11029</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats,</div><div class="line"><a name="l11030"></a><span class="lineno">11030</span>&#160;    VkDeviceSize&amp; maxBytesToMove,</div><div class="line"><a name="l11031"></a><span class="lineno">11031</span>&#160;    uint32_t&amp; maxAllocationsToMove)</div><div class="line"><a name="l11032"></a><span class="lineno">11032</span>&#160;{</div><div class="line"><a name="l11033"></a><span class="lineno">11033</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator == VMA_NULL)</div><div class="line"><a name="l11034"></a><span class="lineno">11034</span>&#160;    {</div><div class="line"><a name="l11035"></a><span class="lineno">11035</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11036"></a><span class="lineno">11036</span>&#160;    }</div><div class="line"><a name="l11037"></a><span class="lineno">11037</span>&#160;</div><div class="line"><a name="l11038"></a><span class="lineno">11038</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11039"></a><span class="lineno">11039</span>&#160;</div><div class="line"><a name="l11040"></a><span class="lineno">11040</span>&#160;    <span class="comment">// Defragment.</span></div><div class="line"><a name="l11041"></a><span class="lineno">11041</span>&#160;    VkResult result = m_pDefragmentator-&gt;Defragment(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l11042"></a><span class="lineno">11042</span>&#160;</div><div class="line"><a name="l11043"></a><span class="lineno">11043</span>&#160;    <span class="comment">// Accumulate statistics.</span></div><div class="line"><a name="l11044"></a><span class="lineno">11044</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l11045"></a><span class="lineno">11045</span>&#160;    {</div><div class="line"><a name="l11046"></a><span class="lineno">11046</span>&#160;        <span class="keyword">const</span> VkDeviceSize bytesMoved = m_pDefragmentator-&gt;GetBytesMoved();</div><div class="line"><a name="l11047"></a><span class="lineno">11047</span>&#160;        <span class="keyword">const</span> uint32_t allocationsMoved = m_pDefragmentator-&gt;GetAllocationsMoved();</div><div class="line"><a name="l11048"></a><span class="lineno">11048</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a36f9d5df2a10ba2a36b16e126d60572d">bytesMoved</a> += bytesMoved;</div><div class="line"><a name="l11049"></a><span class="lineno">11049</span>&#160;        pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#aefeabf130022008eadd75999478af3f9">allocationsMoved</a> += allocationsMoved;</div><div class="line"><a name="l11050"></a><span class="lineno">11050</span>&#160;        VMA_ASSERT(bytesMoved &lt;= maxBytesToMove);</div><div class="line"><a name="l11051"></a><span class="lineno">11051</span>&#160;        VMA_ASSERT(allocationsMoved &lt;= maxAllocationsToMove);</div><div class="line"><a name="l11052"></a><span class="lineno">11052</span>&#160;        maxBytesToMove -= bytesMoved;</div><div class="line"><a name="l11053"></a><span class="lineno">11053</span>&#160;        maxAllocationsToMove -= allocationsMoved;</div><div class="line"><a name="l11054"></a><span class="lineno">11054</span>&#160;    }</div><div class="line"><a name="l11055"></a><span class="lineno">11055</span>&#160;    </div><div class="line"><a name="l11056"></a><span class="lineno">11056</span>&#160;    <span class="comment">// Free empty blocks.</span></div><div class="line"><a name="l11057"></a><span class="lineno">11057</span>&#160;    m_HasEmptyBlock = <span class="keyword">false</span>;</div><div class="line"><a name="l11058"></a><span class="lineno">11058</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> blockIndex = m_Blocks.size(); blockIndex--; )</div><div class="line"><a name="l11059"></a><span class="lineno">11059</span>&#160;    {</div><div class="line"><a name="l11060"></a><span class="lineno">11060</span>&#160;        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11061"></a><span class="lineno">11061</span>&#160;        <span class="keywordflow">if</span>(pBlock-&gt;m_pMetadata-&gt;IsEmpty())</div><div class="line"><a name="l11062"></a><span class="lineno">11062</span>&#160;        {</div><div class="line"><a name="l11063"></a><span class="lineno">11063</span>&#160;            <span class="keywordflow">if</span>(m_Blocks.size() &gt; m_MinBlockCount)</div><div class="line"><a name="l11064"></a><span class="lineno">11064</span>&#160;            {</div><div class="line"><a name="l11065"></a><span class="lineno">11065</span>&#160;                <span class="keywordflow">if</span>(pDefragmentationStats != VMA_NULL)</div><div class="line"><a name="l11066"></a><span class="lineno">11066</span>&#160;                {</div><div class="line"><a name="l11067"></a><span class="lineno">11067</span>&#160;                    ++pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#a0113f1877904a5d1ee8f409216ff276b">deviceMemoryBlocksFreed</a>;</div><div class="line"><a name="l11068"></a><span class="lineno">11068</span>&#160;                    pDefragmentationStats-&gt;<a class="code" href="struct_vma_defragmentation_stats.html#ab0cb9ac0dbc106c77e384ea676422f28">bytesFreed</a> += pBlock-&gt;m_pMetadata-&gt;GetSize();</div><div class="line"><a name="l11069"></a><span class="lineno">11069</span>&#160;                }</div><div class="line"><a name="l11070"></a><span class="lineno">11070</span>&#160;</div><div class="line"><a name="l11071"></a><span class="lineno">11071</span>&#160;                VmaVectorRemove(m_Blocks, blockIndex);</div><div class="line"><a name="l11072"></a><span class="lineno">11072</span>&#160;                pBlock-&gt;Destroy(m_hAllocator);</div><div class="line"><a name="l11073"></a><span class="lineno">11073</span>&#160;                vma_delete(m_hAllocator, pBlock);</div><div class="line"><a name="l11074"></a><span class="lineno">11074</span>&#160;            }</div><div class="line"><a name="l11075"></a><span class="lineno">11075</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l11076"></a><span class="lineno">11076</span>&#160;            {</div><div class="line"><a name="l11077"></a><span class="lineno">11077</span>&#160;                m_HasEmptyBlock = <span class="keyword">true</span>;</div><div class="line"><a name="l11078"></a><span class="lineno">11078</span>&#160;            }</div><div class="line"><a name="l11079"></a><span class="lineno">11079</span>&#160;        }</div><div class="line"><a name="l11080"></a><span class="lineno">11080</span>&#160;    }</div><div class="line"><a name="l11081"></a><span class="lineno">11081</span>&#160;</div><div class="line"><a name="l11082"></a><span class="lineno">11082</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l11083"></a><span class="lineno">11083</span>&#160;}</div><div class="line"><a name="l11084"></a><span class="lineno">11084</span>&#160;</div><div class="line"><a name="l11085"></a><span class="lineno">11085</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::DestroyDefragmentator()</div><div class="line"><a name="l11086"></a><span class="lineno">11086</span>&#160;{</div><div class="line"><a name="l11087"></a><span class="lineno">11087</span>&#160;    <span class="keywordflow">if</span>(m_pDefragmentator != VMA_NULL)</div><div class="line"><a name="l11088"></a><span class="lineno">11088</span>&#160;    {</div><div class="line"><a name="l11089"></a><span class="lineno">11089</span>&#160;        vma_delete(m_hAllocator, m_pDefragmentator);</div><div class="line"><a name="l11090"></a><span class="lineno">11090</span>&#160;        m_pDefragmentator = VMA_NULL;</div><div class="line"><a name="l11091"></a><span class="lineno">11091</span>&#160;    }</div><div class="line"><a name="l11092"></a><span class="lineno">11092</span>&#160;}</div><div class="line"><a name="l11093"></a><span class="lineno">11093</span>&#160;</div><div class="line"><a name="l11094"></a><span class="lineno">11094</span>&#160;<span class="keywordtype">void</span> VmaBlockVector::MakePoolAllocationsLost(</div><div class="line"><a name="l11095"></a><span class="lineno">11095</span>&#160;    uint32_t currentFrameIndex,</div><div class="line"><a name="l11096"></a><span class="lineno">11096</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l11097"></a><span class="lineno">11097</span>&#160;{</div><div class="line"><a name="l11098"></a><span class="lineno">11098</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11099"></a><span class="lineno">11099</span>&#160;    <span class="keywordtype">size_t</span> lostAllocationCount = 0;</div><div class="line"><a name="l11100"></a><span class="lineno">11100</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l11101"></a><span class="lineno">11101</span>&#160;    {</div><div class="line"><a name="l11102"></a><span class="lineno">11102</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11103"></a><span class="lineno">11103</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l11104"></a><span class="lineno">11104</span>&#160;        lostAllocationCount += pBlock-&gt;m_pMetadata-&gt;MakeAllocationsLost(currentFrameIndex, m_FrameInUseCount);</div><div class="line"><a name="l11105"></a><span class="lineno">11105</span>&#160;    }</div><div class="line"><a name="l11106"></a><span class="lineno">11106</span>&#160;    <span class="keywordflow">if</span>(pLostAllocationCount != VMA_NULL)</div><div class="line"><a name="l11107"></a><span class="lineno">11107</span>&#160;    {</div><div class="line"><a name="l11108"></a><span class="lineno">11108</span>&#160;        *pLostAllocationCount = lostAllocationCount;</div><div class="line"><a name="l11109"></a><span class="lineno">11109</span>&#160;    }</div><div class="line"><a name="l11110"></a><span class="lineno">11110</span>&#160;}</div><div class="line"><a name="l11111"></a><span class="lineno">11111</span>&#160;</div><div class="line"><a name="l11112"></a><span class="lineno">11112</span>&#160;VkResult VmaBlockVector::CheckCorruption()</div><div class="line"><a name="l11113"></a><span class="lineno">11113</span>&#160;{</div><div class="line"><a name="l11114"></a><span class="lineno">11114</span>&#160;    <span class="keywordflow">if</span>(!IsCorruptionDetectionEnabled())</div><div class="line"><a name="l11115"></a><span class="lineno">11115</span>&#160;    {</div><div class="line"><a name="l11116"></a><span class="lineno">11116</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l11117"></a><span class="lineno">11117</span>&#160;    }</div><div class="line"><a name="l11118"></a><span class="lineno">11118</span>&#160;</div><div class="line"><a name="l11119"></a><span class="lineno">11119</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11120"></a><span class="lineno">11120</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l11121"></a><span class="lineno">11121</span>&#160;    {</div><div class="line"><a name="l11122"></a><span class="lineno">11122</span>&#160;        VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11123"></a><span class="lineno">11123</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l11124"></a><span class="lineno">11124</span>&#160;        VkResult res = pBlock-&gt;CheckCorruption(m_hAllocator);</div><div class="line"><a name="l11125"></a><span class="lineno">11125</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l11126"></a><span class="lineno">11126</span>&#160;        {</div><div class="line"><a name="l11127"></a><span class="lineno">11127</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11128"></a><span class="lineno">11128</span>&#160;        }</div><div class="line"><a name="l11129"></a><span class="lineno">11129</span>&#160;    }</div><div class="line"><a name="l11130"></a><span class="lineno">11130</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11131"></a><span class="lineno">11131</span>&#160;}</div><div class="line"><a name="l11132"></a><span class="lineno">11132</span>&#160;</div><div class="line"><a name="l11133"></a><span class="lineno">11133</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="l11134"></a><span class="lineno">11134</span>&#160;{</div><div class="line"><a name="l11135"></a><span class="lineno">11135</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = m_MemoryTypeIndex;</div><div class="line"><a name="l11136"></a><span class="lineno">11136</span>&#160;    <span class="keyword">const</span> uint32_t memHeapIndex = m_hAllocator-&gt;MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l11137"></a><span class="lineno">11137</span>&#160;</div><div class="line"><a name="l11138"></a><span class="lineno">11138</span>&#160;    VmaMutexLock lock(m_Mutex, m_hAllocator-&gt;m_UseMutex);</div><div class="line"><a name="l11139"></a><span class="lineno">11139</span>&#160;</div><div class="line"><a name="l11140"></a><span class="lineno">11140</span>&#160;    <span class="keywordflow">for</span>(uint32_t blockIndex = 0; blockIndex &lt; m_Blocks.size(); ++blockIndex)</div><div class="line"><a name="l11141"></a><span class="lineno">11141</span>&#160;    {</div><div class="line"><a name="l11142"></a><span class="lineno">11142</span>&#160;        <span class="keyword">const</span> VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = m_Blocks[blockIndex];</div><div class="line"><a name="l11143"></a><span class="lineno">11143</span>&#160;        VMA_ASSERT(pBlock);</div><div class="line"><a name="l11144"></a><span class="lineno">11144</span>&#160;        VMA_HEAVY_ASSERT(pBlock-&gt;Validate());</div><div class="line"><a name="l11145"></a><span class="lineno">11145</span>&#160;        <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l11146"></a><span class="lineno">11146</span>&#160;        pBlock-&gt;m_pMetadata-&gt;CalcAllocationStatInfo(allocationStatInfo);</div><div class="line"><a name="l11147"></a><span class="lineno">11147</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l11148"></a><span class="lineno">11148</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l11149"></a><span class="lineno">11149</span>&#160;        VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l11150"></a><span class="lineno">11150</span>&#160;    }</div><div class="line"><a name="l11151"></a><span class="lineno">11151</span>&#160;}</div><div class="line"><a name="l11152"></a><span class="lineno">11152</span>&#160;</div><div class="line"><a name="l11154"></a><span class="lineno">11154</span>&#160;<span class="comment">// VmaDefragmentator members definition</span></div><div class="line"><a name="l11155"></a><span class="lineno">11155</span>&#160;</div><div class="line"><a name="l11156"></a><span class="lineno">11156</span>&#160;VmaDefragmentator::VmaDefragmentator(</div><div class="line"><a name="l11157"></a><span class="lineno">11157</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> hAllocator,</div><div class="line"><a name="l11158"></a><span class="lineno">11158</span>&#160;    VmaBlockVector* pBlockVector,</div><div class="line"><a name="l11159"></a><span class="lineno">11159</span>&#160;    uint32_t currentFrameIndex) :</div><div class="line"><a name="l11160"></a><span class="lineno">11160</span>&#160;    m_hAllocator(hAllocator),</div><div class="line"><a name="l11161"></a><span class="lineno">11161</span>&#160;    m_pBlockVector(pBlockVector),</div><div class="line"><a name="l11162"></a><span class="lineno">11162</span>&#160;    m_CurrentFrameIndex(currentFrameIndex),</div><div class="line"><a name="l11163"></a><span class="lineno">11163</span>&#160;    m_BytesMoved(0),</div><div class="line"><a name="l11164"></a><span class="lineno">11164</span>&#160;    m_AllocationsMoved(0),</div><div class="line"><a name="l11165"></a><span class="lineno">11165</span>&#160;    m_Allocations(VmaStlAllocator&lt;AllocationInfo&gt;(hAllocator-&gt;GetAllocationCallbacks())),</div><div class="line"><a name="l11166"></a><span class="lineno">11166</span>&#160;    m_Blocks(VmaStlAllocator&lt;BlockInfo*&gt;(hAllocator-&gt;GetAllocationCallbacks()))</div><div class="line"><a name="l11167"></a><span class="lineno">11167</span>&#160;{</div><div class="line"><a name="l11168"></a><span class="lineno">11168</span>&#160;    VMA_ASSERT(pBlockVector-&gt;GetAlgorithm() == 0);</div><div class="line"><a name="l11169"></a><span class="lineno">11169</span>&#160;}</div><div class="line"><a name="l11170"></a><span class="lineno">11170</span>&#160;</div><div class="line"><a name="l11171"></a><span class="lineno">11171</span>&#160;VmaDefragmentator::~VmaDefragmentator()</div><div class="line"><a name="l11172"></a><span class="lineno">11172</span>&#160;{</div><div class="line"><a name="l11173"></a><span class="lineno">11173</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = m_Blocks.size(); i--; )</div><div class="line"><a name="l11174"></a><span class="lineno">11174</span>&#160;    {</div><div class="line"><a name="l11175"></a><span class="lineno">11175</span>&#160;        vma_delete(m_hAllocator, m_Blocks[i]);</div><div class="line"><a name="l11176"></a><span class="lineno">11176</span>&#160;    }</div><div class="line"><a name="l11177"></a><span class="lineno">11177</span>&#160;}</div><div class="line"><a name="l11178"></a><span class="lineno">11178</span>&#160;</div><div class="line"><a name="l11179"></a><span class="lineno">11179</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="l11180"></a><span class="lineno">11180</span>&#160;{</div><div class="line"><a name="l11181"></a><span class="lineno">11181</span>&#160;    AllocationInfo allocInfo;</div><div class="line"><a name="l11182"></a><span class="lineno">11182</span>&#160;    allocInfo.m_hAllocation = hAlloc;</div><div class="line"><a name="l11183"></a><span class="lineno">11183</span>&#160;    allocInfo.m_pChanged = pChanged;</div><div class="line"><a name="l11184"></a><span class="lineno">11184</span>&#160;    m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l11185"></a><span class="lineno">11185</span>&#160;}</div><div class="line"><a name="l11186"></a><span class="lineno">11186</span>&#160;</div><div class="line"><a name="l11187"></a><span class="lineno">11187</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="l11188"></a><span class="lineno">11188</span>&#160;{</div><div class="line"><a name="l11189"></a><span class="lineno">11189</span>&#160;    <span class="comment">// It has already been mapped for defragmentation.</span></div><div class="line"><a name="l11190"></a><span class="lineno">11190</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation)</div><div class="line"><a name="l11191"></a><span class="lineno">11191</span>&#160;    {</div><div class="line"><a name="l11192"></a><span class="lineno">11192</span>&#160;        *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l11193"></a><span class="lineno">11193</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11194"></a><span class="lineno">11194</span>&#160;    }</div><div class="line"><a name="l11195"></a><span class="lineno">11195</span>&#160;            </div><div class="line"><a name="l11196"></a><span class="lineno">11196</span>&#160;    <span class="comment">// It is originally mapped.</span></div><div class="line"><a name="l11197"></a><span class="lineno">11197</span>&#160;    <span class="keywordflow">if</span>(m_pBlock-&gt;GetMappedData())</div><div class="line"><a name="l11198"></a><span class="lineno">11198</span>&#160;    {</div><div class="line"><a name="l11199"></a><span class="lineno">11199</span>&#160;        *ppMappedData = m_pBlock-&gt;GetMappedData();</div><div class="line"><a name="l11200"></a><span class="lineno">11200</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11201"></a><span class="lineno">11201</span>&#160;    }</div><div class="line"><a name="l11202"></a><span class="lineno">11202</span>&#160;            </div><div class="line"><a name="l11203"></a><span class="lineno">11203</span>&#160;    <span class="comment">// Map on first usage.</span></div><div class="line"><a name="l11204"></a><span class="lineno">11204</span>&#160;    VkResult res = m_pBlock-&gt;Map(hAllocator, 1, &amp;m_pMappedDataForDefragmentation);</div><div class="line"><a name="l11205"></a><span class="lineno">11205</span>&#160;    *ppMappedData = m_pMappedDataForDefragmentation;</div><div class="line"><a name="l11206"></a><span class="lineno">11206</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11207"></a><span class="lineno">11207</span>&#160;}</div><div class="line"><a name="l11208"></a><span class="lineno">11208</span>&#160;</div><div class="line"><a name="l11209"></a><span class="lineno">11209</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="l11210"></a><span class="lineno">11210</span>&#160;{</div><div class="line"><a name="l11211"></a><span class="lineno">11211</span>&#160;    <span class="keywordflow">if</span>(m_pMappedDataForDefragmentation != VMA_NULL)</div><div class="line"><a name="l11212"></a><span class="lineno">11212</span>&#160;    {</div><div class="line"><a name="l11213"></a><span class="lineno">11213</span>&#160;        m_pBlock-&gt;Unmap(hAllocator, 1);</div><div class="line"><a name="l11214"></a><span class="lineno">11214</span>&#160;    }</div><div class="line"><a name="l11215"></a><span class="lineno">11215</span>&#160;}</div><div class="line"><a name="l11216"></a><span class="lineno">11216</span>&#160;</div><div class="line"><a name="l11217"></a><span class="lineno">11217</span>&#160;VkResult VmaDefragmentator::DefragmentRound(</div><div class="line"><a name="l11218"></a><span class="lineno">11218</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l11219"></a><span class="lineno">11219</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l11220"></a><span class="lineno">11220</span>&#160;{</div><div class="line"><a name="l11221"></a><span class="lineno">11221</span>&#160;    <span class="keywordflow">if</span>(m_Blocks.empty())</div><div class="line"><a name="l11222"></a><span class="lineno">11222</span>&#160;    {</div><div class="line"><a name="l11223"></a><span class="lineno">11223</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11224"></a><span class="lineno">11224</span>&#160;    }</div><div class="line"><a name="l11225"></a><span class="lineno">11225</span>&#160;</div><div class="line"><a name="l11226"></a><span class="lineno">11226</span>&#160;    <span class="keywordtype">size_t</span> srcBlockIndex = m_Blocks.size() - 1;</div><div class="line"><a name="l11227"></a><span class="lineno">11227</span>&#160;    <span class="keywordtype">size_t</span> srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l11228"></a><span class="lineno">11228</span>&#160;    <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l11229"></a><span class="lineno">11229</span>&#160;    {</div><div class="line"><a name="l11230"></a><span class="lineno">11230</span>&#160;        <span class="comment">// 1. Find next allocation to move.</span></div><div class="line"><a name="l11231"></a><span class="lineno">11231</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="l11232"></a><span class="lineno">11232</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="l11233"></a><span class="lineno">11233</span>&#160;        <span class="keywordflow">while</span>(srcAllocIndex &gt;= m_Blocks[srcBlockIndex]-&gt;m_Allocations.size())</div><div class="line"><a name="l11234"></a><span class="lineno">11234</span>&#160;        {</div><div class="line"><a name="l11235"></a><span class="lineno">11235</span>&#160;            <span class="keywordflow">if</span>(m_Blocks[srcBlockIndex]-&gt;m_Allocations.empty())</div><div class="line"><a name="l11236"></a><span class="lineno">11236</span>&#160;            {</div><div class="line"><a name="l11237"></a><span class="lineno">11237</span>&#160;                <span class="comment">// Finished: no more allocations to process.</span></div><div class="line"><a name="l11238"></a><span class="lineno">11238</span>&#160;                <span class="keywordflow">if</span>(srcBlockIndex == 0)</div><div class="line"><a name="l11239"></a><span class="lineno">11239</span>&#160;                {</div><div class="line"><a name="l11240"></a><span class="lineno">11240</span>&#160;                    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11241"></a><span class="lineno">11241</span>&#160;                }</div><div class="line"><a name="l11242"></a><span class="lineno">11242</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l11243"></a><span class="lineno">11243</span>&#160;                {</div><div class="line"><a name="l11244"></a><span class="lineno">11244</span>&#160;                    --srcBlockIndex;</div><div class="line"><a name="l11245"></a><span class="lineno">11245</span>&#160;                    srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l11246"></a><span class="lineno">11246</span>&#160;                }</div><div class="line"><a name="l11247"></a><span class="lineno">11247</span>&#160;            }</div><div class="line"><a name="l11248"></a><span class="lineno">11248</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l11249"></a><span class="lineno">11249</span>&#160;            {</div><div class="line"><a name="l11250"></a><span class="lineno">11250</span>&#160;                srcAllocIndex = m_Blocks[srcBlockIndex]-&gt;m_Allocations.size() - 1;</div><div class="line"><a name="l11251"></a><span class="lineno">11251</span>&#160;            }</div><div class="line"><a name="l11252"></a><span class="lineno">11252</span>&#160;        }</div><div class="line"><a name="l11253"></a><span class="lineno">11253</span>&#160;        </div><div class="line"><a name="l11254"></a><span class="lineno">11254</span>&#160;        BlockInfo* pSrcBlockInfo = m_Blocks[srcBlockIndex];</div><div class="line"><a name="l11255"></a><span class="lineno">11255</span>&#160;        AllocationInfo&amp; allocInfo = pSrcBlockInfo-&gt;m_Allocations[srcAllocIndex];</div><div class="line"><a name="l11256"></a><span class="lineno">11256</span>&#160;</div><div class="line"><a name="l11257"></a><span class="lineno">11257</span>&#160;        <span class="keyword">const</span> VkDeviceSize size = allocInfo.m_hAllocation-&gt;GetSize();</div><div class="line"><a name="l11258"></a><span class="lineno">11258</span>&#160;        <span class="keyword">const</span> VkDeviceSize srcOffset = allocInfo.m_hAllocation-&gt;GetOffset();</div><div class="line"><a name="l11259"></a><span class="lineno">11259</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignment = allocInfo.m_hAllocation-&gt;GetAlignment();</div><div class="line"><a name="l11260"></a><span class="lineno">11260</span>&#160;        <span class="keyword">const</span> VmaSuballocationType suballocType = allocInfo.m_hAllocation-&gt;GetSuballocationType();</div><div class="line"><a name="l11261"></a><span class="lineno">11261</span>&#160;</div><div class="line"><a name="l11262"></a><span class="lineno">11262</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="l11263"></a><span class="lineno">11263</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="l11264"></a><span class="lineno">11264</span>&#160;        {</div><div class="line"><a name="l11265"></a><span class="lineno">11265</span>&#160;            BlockInfo* pDstBlockInfo = m_Blocks[dstBlockIndex];</div><div class="line"><a name="l11266"></a><span class="lineno">11266</span>&#160;            VmaAllocationRequest dstAllocRequest;</div><div class="line"><a name="l11267"></a><span class="lineno">11267</span>&#160;            <span class="keywordflow">if</span>(pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;CreateAllocationRequest(</div><div class="line"><a name="l11268"></a><span class="lineno">11268</span>&#160;                m_CurrentFrameIndex,</div><div class="line"><a name="l11269"></a><span class="lineno">11269</span>&#160;                m_pBlockVector-&gt;GetFrameInUseCount(),</div><div class="line"><a name="l11270"></a><span class="lineno">11270</span>&#160;                m_pBlockVector-&gt;GetBufferImageGranularity(),</div><div class="line"><a name="l11271"></a><span class="lineno">11271</span>&#160;                size,</div><div class="line"><a name="l11272"></a><span class="lineno">11272</span>&#160;                alignment,</div><div class="line"><a name="l11273"></a><span class="lineno">11273</span>&#160;                <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div><div class="line"><a name="l11274"></a><span class="lineno">11274</span>&#160;                suballocType,</div><div class="line"><a name="l11275"></a><span class="lineno">11275</span>&#160;                <span class="keyword">false</span>, <span class="comment">// canMakeOtherLost</span></div><div class="line"><a name="l11276"></a><span class="lineno">11276</span>&#160;                <a class="code" href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a>,</div><div class="line"><a name="l11277"></a><span class="lineno">11277</span>&#160;                &amp;dstAllocRequest) &amp;&amp;</div><div class="line"><a name="l11278"></a><span class="lineno">11278</span>&#160;            MoveMakesSense(</div><div class="line"><a name="l11279"></a><span class="lineno">11279</span>&#160;                dstBlockIndex, dstAllocRequest.offset, srcBlockIndex, srcOffset))</div><div class="line"><a name="l11280"></a><span class="lineno">11280</span>&#160;            {</div><div class="line"><a name="l11281"></a><span class="lineno">11281</span>&#160;                VMA_ASSERT(dstAllocRequest.itemsToMakeLostCount == 0);</div><div class="line"><a name="l11282"></a><span class="lineno">11282</span>&#160;</div><div class="line"><a name="l11283"></a><span class="lineno">11283</span>&#160;                <span class="comment">// Reached limit on number of allocations or bytes to move.</span></div><div class="line"><a name="l11284"></a><span class="lineno">11284</span>&#160;                <span class="keywordflow">if</span>((m_AllocationsMoved + 1 &gt; maxAllocationsToMove) ||</div><div class="line"><a name="l11285"></a><span class="lineno">11285</span>&#160;                    (m_BytesMoved + size &gt; maxBytesToMove))</div><div class="line"><a name="l11286"></a><span class="lineno">11286</span>&#160;                {</div><div class="line"><a name="l11287"></a><span class="lineno">11287</span>&#160;                    <span class="keywordflow">return</span> VK_INCOMPLETE;</div><div class="line"><a name="l11288"></a><span class="lineno">11288</span>&#160;                }</div><div class="line"><a name="l11289"></a><span class="lineno">11289</span>&#160;</div><div class="line"><a name="l11290"></a><span class="lineno">11290</span>&#160;                <span class="keywordtype">void</span>* pDstMappedData = VMA_NULL;</div><div class="line"><a name="l11291"></a><span class="lineno">11291</span>&#160;                VkResult res = pDstBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pDstMappedData);</div><div class="line"><a name="l11292"></a><span class="lineno">11292</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l11293"></a><span class="lineno">11293</span>&#160;                {</div><div class="line"><a name="l11294"></a><span class="lineno">11294</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11295"></a><span class="lineno">11295</span>&#160;                }</div><div class="line"><a name="l11296"></a><span class="lineno">11296</span>&#160;</div><div class="line"><a name="l11297"></a><span class="lineno">11297</span>&#160;                <span class="keywordtype">void</span>* pSrcMappedData = VMA_NULL;</div><div class="line"><a name="l11298"></a><span class="lineno">11298</span>&#160;                res = pSrcBlockInfo-&gt;EnsureMapping(m_hAllocator, &amp;pSrcMappedData);</div><div class="line"><a name="l11299"></a><span class="lineno">11299</span>&#160;                <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l11300"></a><span class="lineno">11300</span>&#160;                {</div><div class="line"><a name="l11301"></a><span class="lineno">11301</span>&#160;                    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l11302"></a><span class="lineno">11302</span>&#160;                }</div><div class="line"><a name="l11303"></a><span class="lineno">11303</span>&#160;                </div><div class="line"><a name="l11304"></a><span class="lineno">11304</span>&#160;                <span class="comment">// THE PLACE WHERE ACTUAL DATA COPY HAPPENS.</span></div><div class="line"><a name="l11305"></a><span class="lineno">11305</span>&#160;                memcpy(</div><div class="line"><a name="l11306"></a><span class="lineno">11306</span>&#160;                    reinterpret_cast&lt;char*&gt;(pDstMappedData) + dstAllocRequest.offset,</div><div class="line"><a name="l11307"></a><span class="lineno">11307</span>&#160;                    reinterpret_cast&lt;char*&gt;(pSrcMappedData) + srcOffset,</div><div class="line"><a name="l11308"></a><span class="lineno">11308</span>&#160;                    static_cast&lt;size_t&gt;(size));</div><div class="line"><a name="l11309"></a><span class="lineno">11309</span>&#160;</div><div class="line"><a name="l11310"></a><span class="lineno">11310</span>&#160;                <span class="keywordflow">if</span>(VMA_DEBUG_MARGIN &gt; 0)</div><div class="line"><a name="l11311"></a><span class="lineno">11311</span>&#160;                {</div><div class="line"><a name="l11312"></a><span class="lineno">11312</span>&#160;                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset - VMA_DEBUG_MARGIN);</div><div class="line"><a name="l11313"></a><span class="lineno">11313</span>&#160;                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset + size);</div><div class="line"><a name="l11314"></a><span class="lineno">11314</span>&#160;                }</div><div class="line"><a name="l11315"></a><span class="lineno">11315</span>&#160;                </div><div class="line"><a name="l11316"></a><span class="lineno">11316</span>&#160;                pDstBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;Alloc(</div><div class="line"><a name="l11317"></a><span class="lineno">11317</span>&#160;                    dstAllocRequest,</div><div class="line"><a name="l11318"></a><span class="lineno">11318</span>&#160;                    suballocType,</div><div class="line"><a name="l11319"></a><span class="lineno">11319</span>&#160;                    size,</div><div class="line"><a name="l11320"></a><span class="lineno">11320</span>&#160;                    <span class="keyword">false</span>, <span class="comment">// upperAddress</span></div><div class="line"><a name="l11321"></a><span class="lineno">11321</span>&#160;                    allocInfo.m_hAllocation);</div><div class="line"><a name="l11322"></a><span class="lineno">11322</span>&#160;                pSrcBlockInfo-&gt;m_pBlock-&gt;m_pMetadata-&gt;FreeAtOffset(srcOffset);</div><div class="line"><a name="l11323"></a><span class="lineno">11323</span>&#160;                </div><div class="line"><a name="l11324"></a><span class="lineno">11324</span>&#160;                allocInfo.m_hAllocation-&gt;ChangeBlockAllocation(m_hAllocator, pDstBlockInfo-&gt;m_pBlock, dstAllocRequest.offset);</div><div class="line"><a name="l11325"></a><span class="lineno">11325</span>&#160;</div><div class="line"><a name="l11326"></a><span class="lineno">11326</span>&#160;                <span class="keywordflow">if</span>(allocInfo.m_pChanged != VMA_NULL)</div><div class="line"><a name="l11327"></a><span class="lineno">11327</span>&#160;                {</div><div class="line"><a name="l11328"></a><span class="lineno">11328</span>&#160;                    *allocInfo.m_pChanged = VK_TRUE;</div><div class="line"><a name="l11329"></a><span class="lineno">11329</span>&#160;                }</div><div class="line"><a name="l11330"></a><span class="lineno">11330</span>&#160;</div><div class="line"><a name="l11331"></a><span class="lineno">11331</span>&#160;                ++m_AllocationsMoved;</div><div class="line"><a name="l11332"></a><span class="lineno">11332</span>&#160;                m_BytesMoved += size;</div><div class="line"><a name="l11333"></a><span class="lineno">11333</span>&#160;</div><div class="line"><a name="l11334"></a><span class="lineno">11334</span>&#160;                VmaVectorRemove(pSrcBlockInfo-&gt;m_Allocations, srcAllocIndex);</div><div class="line"><a name="l11335"></a><span class="lineno">11335</span>&#160;</div><div class="line"><a name="l11336"></a><span class="lineno">11336</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l11337"></a><span class="lineno">11337</span>&#160;            }</div><div class="line"><a name="l11338"></a><span class="lineno">11338</span>&#160;        }</div><div class="line"><a name="l11339"></a><span class="lineno">11339</span>&#160;</div><div class="line"><a name="l11340"></a><span class="lineno">11340</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="l11341"></a><span class="lineno">11341</span>&#160;</div><div class="line"><a name="l11342"></a><span class="lineno">11342</span>&#160;        <span class="keywordflow">if</span>(srcAllocIndex &gt; 0)</div><div class="line"><a name="l11343"></a><span class="lineno">11343</span>&#160;        {</div><div class="line"><a name="l11344"></a><span class="lineno">11344</span>&#160;            --srcAllocIndex;</div><div class="line"><a name="l11345"></a><span class="lineno">11345</span>&#160;        }</div><div class="line"><a name="l11346"></a><span class="lineno">11346</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l11347"></a><span class="lineno">11347</span>&#160;        {</div><div class="line"><a name="l11348"></a><span class="lineno">11348</span>&#160;            <span class="keywordflow">if</span>(srcBlockIndex &gt; 0)</div><div class="line"><a name="l11349"></a><span class="lineno">11349</span>&#160;            {</div><div class="line"><a name="l11350"></a><span class="lineno">11350</span>&#160;                --srcBlockIndex;</div><div class="line"><a name="l11351"></a><span class="lineno">11351</span>&#160;                srcAllocIndex = SIZE_MAX;</div><div class="line"><a name="l11352"></a><span class="lineno">11352</span>&#160;            }</div><div class="line"><a name="l11353"></a><span class="lineno">11353</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l11354"></a><span class="lineno">11354</span>&#160;            {</div><div class="line"><a name="l11355"></a><span class="lineno">11355</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11356"></a><span class="lineno">11356</span>&#160;            }</div><div class="line"><a name="l11357"></a><span class="lineno">11357</span>&#160;        }</div><div class="line"><a name="l11358"></a><span class="lineno">11358</span>&#160;    }</div><div class="line"><a name="l11359"></a><span class="lineno">11359</span>&#160;}</div><div class="line"><a name="l11360"></a><span class="lineno">11360</span>&#160;</div><div class="line"><a name="l11361"></a><span class="lineno">11361</span>&#160;VkResult VmaDefragmentator::Defragment(</div><div class="line"><a name="l11362"></a><span class="lineno">11362</span>&#160;    VkDeviceSize maxBytesToMove,</div><div class="line"><a name="l11363"></a><span class="lineno">11363</span>&#160;    uint32_t maxAllocationsToMove)</div><div class="line"><a name="l11364"></a><span class="lineno">11364</span>&#160;{</div><div class="line"><a name="l11365"></a><span class="lineno">11365</span>&#160;    <span class="keywordflow">if</span>(m_Allocations.empty())</div><div class="line"><a name="l11366"></a><span class="lineno">11366</span>&#160;    {</div><div class="line"><a name="l11367"></a><span class="lineno">11367</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11368"></a><span class="lineno">11368</span>&#160;    }</div><div class="line"><a name="l11369"></a><span class="lineno">11369</span>&#160;</div><div class="line"><a name="l11370"></a><span class="lineno">11370</span>&#160;    <span class="comment">// Create block info for each block.</span></div><div class="line"><a name="l11371"></a><span class="lineno">11371</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="l11372"></a><span class="lineno">11372</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="l11373"></a><span class="lineno">11373</span>&#160;    {</div><div class="line"><a name="l11374"></a><span class="lineno">11374</span>&#160;        BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l11375"></a><span class="lineno">11375</span>&#160;        pBlockInfo-&gt;m_pBlock = m_pBlockVector-&gt;m_Blocks[blockIndex];</div><div class="line"><a name="l11376"></a><span class="lineno">11376</span>&#160;        m_Blocks.push_back(pBlockInfo);</div><div class="line"><a name="l11377"></a><span class="lineno">11377</span>&#160;    }</div><div class="line"><a name="l11378"></a><span class="lineno">11378</span>&#160;</div><div class="line"><a name="l11379"></a><span class="lineno">11379</span>&#160;    <span class="comment">// Sort them by m_pBlock pointer value.</span></div><div class="line"><a name="l11380"></a><span class="lineno">11380</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockPointerLess());</div><div class="line"><a name="l11381"></a><span class="lineno">11381</span>&#160;</div><div class="line"><a name="l11382"></a><span class="lineno">11382</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="l11383"></a><span class="lineno">11383</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="l11384"></a><span class="lineno">11384</span>&#160;    {</div><div class="line"><a name="l11385"></a><span class="lineno">11385</span>&#160;        AllocationInfo&amp; allocInfo = m_Allocations[blockIndex];</div><div class="line"><a name="l11386"></a><span class="lineno">11386</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="l11387"></a><span class="lineno">11387</span>&#160;        <span class="keywordflow">if</span>(allocInfo.m_hAllocation-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l11388"></a><span class="lineno">11388</span>&#160;        {</div><div class="line"><a name="l11389"></a><span class="lineno">11389</span>&#160;            VmaDeviceMemoryBlock* pBlock = allocInfo.m_hAllocation-&gt;GetBlock();</div><div class="line"><a name="l11390"></a><span class="lineno">11390</span>&#160;            BlockInfoVector::iterator it = VmaBinaryFindFirstNotLess(m_Blocks.begin(), m_Blocks.end(), pBlock, BlockPointerLess());</div><div class="line"><a name="l11391"></a><span class="lineno">11391</span>&#160;            <span class="keywordflow">if</span>(it != m_Blocks.end() &amp;&amp; (*it)-&gt;m_pBlock == pBlock)</div><div class="line"><a name="l11392"></a><span class="lineno">11392</span>&#160;            {</div><div class="line"><a name="l11393"></a><span class="lineno">11393</span>&#160;                (*it)-&gt;m_Allocations.push_back(allocInfo);</div><div class="line"><a name="l11394"></a><span class="lineno">11394</span>&#160;            }</div><div class="line"><a name="l11395"></a><span class="lineno">11395</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l11396"></a><span class="lineno">11396</span>&#160;            {</div><div class="line"><a name="l11397"></a><span class="lineno">11397</span>&#160;                VMA_ASSERT(0);</div><div class="line"><a name="l11398"></a><span class="lineno">11398</span>&#160;            }</div><div class="line"><a name="l11399"></a><span class="lineno">11399</span>&#160;        }</div><div class="line"><a name="l11400"></a><span class="lineno">11400</span>&#160;    }</div><div class="line"><a name="l11401"></a><span class="lineno">11401</span>&#160;    m_Allocations.clear();</div><div class="line"><a name="l11402"></a><span class="lineno">11402</span>&#160;</div><div class="line"><a name="l11403"></a><span class="lineno">11403</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="l11404"></a><span class="lineno">11404</span>&#160;    {</div><div class="line"><a name="l11405"></a><span class="lineno">11405</span>&#160;        BlockInfo* pBlockInfo = m_Blocks[blockIndex];</div><div class="line"><a name="l11406"></a><span class="lineno">11406</span>&#160;        pBlockInfo-&gt;CalcHasNonMovableAllocations();</div><div class="line"><a name="l11407"></a><span class="lineno">11407</span>&#160;        pBlockInfo-&gt;SortAllocationsBySizeDescecnding();</div><div class="line"><a name="l11408"></a><span class="lineno">11408</span>&#160;    }</div><div class="line"><a name="l11409"></a><span class="lineno">11409</span>&#160;</div><div class="line"><a name="l11410"></a><span class="lineno">11410</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="l11411"></a><span class="lineno">11411</span>&#160;    VMA_SORT(m_Blocks.begin(), m_Blocks.end(), BlockInfoCompareMoveDestination());</div><div class="line"><a name="l11412"></a><span class="lineno">11412</span>&#160;</div><div class="line"><a name="l11413"></a><span class="lineno">11413</span>&#160;    <span class="comment">// Execute defragmentation rounds (the main part).</span></div><div class="line"><a name="l11414"></a><span class="lineno">11414</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l11415"></a><span class="lineno">11415</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="l11416"></a><span class="lineno">11416</span>&#160;    {</div><div class="line"><a name="l11417"></a><span class="lineno">11417</span>&#160;        result = DefragmentRound(maxBytesToMove, maxAllocationsToMove);</div><div class="line"><a name="l11418"></a><span class="lineno">11418</span>&#160;    }</div><div class="line"><a name="l11419"></a><span class="lineno">11419</span>&#160;</div><div class="line"><a name="l11420"></a><span class="lineno">11420</span>&#160;    <span class="comment">// Unmap blocks that were mapped for defragmentation.</span></div><div class="line"><a name="l11421"></a><span class="lineno">11421</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="l11422"></a><span class="lineno">11422</span>&#160;    {</div><div class="line"><a name="l11423"></a><span class="lineno">11423</span>&#160;        m_Blocks[blockIndex]-&gt;Unmap(m_hAllocator);</div><div class="line"><a name="l11424"></a><span class="lineno">11424</span>&#160;    }</div><div class="line"><a name="l11425"></a><span class="lineno">11425</span>&#160;</div><div class="line"><a name="l11426"></a><span class="lineno">11426</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l11427"></a><span class="lineno">11427</span>&#160;}</div><div class="line"><a name="l11428"></a><span class="lineno">11428</span>&#160;</div><div class="line"><a name="l11429"></a><span class="lineno">11429</span>&#160;<span class="keywordtype">bool</span> VmaDefragmentator::MoveMakesSense(</div><div class="line"><a name="l11430"></a><span class="lineno">11430</span>&#160;        <span class="keywordtype">size_t</span> dstBlockIndex, VkDeviceSize dstOffset,</div><div class="line"><a name="l11431"></a><span class="lineno">11431</span>&#160;        <span class="keywordtype">size_t</span> srcBlockIndex, VkDeviceSize srcOffset)</div><div class="line"><a name="l11432"></a><span class="lineno">11432</span>&#160;{</div><div class="line"><a name="l11433"></a><span class="lineno">11433</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &lt; srcBlockIndex)</div><div class="line"><a name="l11434"></a><span class="lineno">11434</span>&#160;    {</div><div class="line"><a name="l11435"></a><span class="lineno">11435</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l11436"></a><span class="lineno">11436</span>&#160;    }</div><div class="line"><a name="l11437"></a><span class="lineno">11437</span>&#160;    <span class="keywordflow">if</span>(dstBlockIndex &gt; srcBlockIndex)</div><div class="line"><a name="l11438"></a><span class="lineno">11438</span>&#160;    {</div><div class="line"><a name="l11439"></a><span class="lineno">11439</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l11440"></a><span class="lineno">11440</span>&#160;    }</div><div class="line"><a name="l11441"></a><span class="lineno">11441</span>&#160;    <span class="keywordflow">if</span>(dstOffset &lt; srcOffset)</div><div class="line"><a name="l11442"></a><span class="lineno">11442</span>&#160;    {</div><div class="line"><a name="l11443"></a><span class="lineno">11443</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l11444"></a><span class="lineno">11444</span>&#160;    }</div><div class="line"><a name="l11445"></a><span class="lineno">11445</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l11446"></a><span class="lineno">11446</span>&#160;}</div><div class="line"><a name="l11447"></a><span class="lineno">11447</span>&#160;</div><div class="line"><a name="l11449"></a><span class="lineno">11449</span>&#160;<span class="comment">// VmaDefragmentationContext</span></div><div class="line"><a name="l11450"></a><span class="lineno">11450</span>&#160;</div><div class="line"><a name="l11451"></a><span class="lineno">11451</span>&#160;VmaDefragmentationContext_T::VmaDefragmentationContext_T()</div><div class="line"><a name="l11452"></a><span class="lineno">11452</span>&#160;{</div><div class="line"><a name="l11453"></a><span class="lineno">11453</span>&#160;}</div><div class="line"><a name="l11454"></a><span class="lineno">11454</span>&#160;</div><div class="line"><a name="l11455"></a><span class="lineno">11455</span>&#160;VmaDefragmentationContext_T::~VmaDefragmentationContext_T()</div><div class="line"><a name="l11456"></a><span class="lineno">11456</span>&#160;{</div><div class="line"><a name="l11457"></a><span class="lineno">11457</span>&#160;}</div><div class="line"><a name="l11458"></a><span class="lineno">11458</span>&#160;</div><div class="line"><a name="l11460"></a><span class="lineno">11460</span>&#160;<span class="comment">// VmaRecorder</span></div><div class="line"><a name="l11461"></a><span class="lineno">11461</span>&#160;</div><div class="line"><a name="l11462"></a><span class="lineno">11462</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l11463"></a><span class="lineno">11463</span>&#160;</div><div class="line"><a name="l11464"></a><span class="lineno">11464</span>&#160;VmaRecorder::VmaRecorder() :</div><div class="line"><a name="l11465"></a><span class="lineno">11465</span>&#160;    m_UseMutex(true),</div><div class="line"><a name="l11466"></a><span class="lineno">11466</span>&#160;    m_Flags(0),</div><div class="line"><a name="l11467"></a><span class="lineno">11467</span>&#160;    m_File(VMA_NULL),</div><div class="line"><a name="l11468"></a><span class="lineno">11468</span>&#160;    m_Freq(INT64_MAX),</div><div class="line"><a name="l11469"></a><span class="lineno">11469</span>&#160;    m_StartCounter(INT64_MAX)</div><div class="line"><a name="l11470"></a><span class="lineno">11470</span>&#160;{</div><div class="line"><a name="l11471"></a><span class="lineno">11471</span>&#160;}</div><div class="line"><a name="l11472"></a><span class="lineno">11472</span>&#160;</div><div class="line"><a name="l11473"></a><span class="lineno">11473</span>&#160;VkResult VmaRecorder::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_record_settings.html">VmaRecordSettings</a>&amp; settings, <span class="keywordtype">bool</span> useMutex)</div><div class="line"><a name="l11474"></a><span class="lineno">11474</span>&#160;{</div><div class="line"><a name="l11475"></a><span class="lineno">11475</span>&#160;    m_UseMutex = useMutex;</div><div class="line"><a name="l11476"></a><span class="lineno">11476</span>&#160;    m_Flags = settings.<a class="code" href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">flags</a>;</div><div class="line"><a name="l11477"></a><span class="lineno">11477</span>&#160;</div><div class="line"><a name="l11478"></a><span class="lineno">11478</span>&#160;    QueryPerformanceFrequency((LARGE_INTEGER*)&amp;m_Freq);</div><div class="line"><a name="l11479"></a><span class="lineno">11479</span>&#160;    QueryPerformanceCounter((LARGE_INTEGER*)&amp;m_StartCounter);</div><div class="line"><a name="l11480"></a><span class="lineno">11480</span>&#160;</div><div class="line"><a name="l11481"></a><span class="lineno">11481</span>&#160;    <span class="comment">// Open file for writing.</span></div><div class="line"><a name="l11482"></a><span class="lineno">11482</span>&#160;    errno_t err = fopen_s(&amp;m_File, settings.<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>, <span class="stringliteral">&quot;wb&quot;</span>);</div><div class="line"><a name="l11483"></a><span class="lineno">11483</span>&#160;    <span class="keywordflow">if</span>(err != 0)</div><div class="line"><a name="l11484"></a><span class="lineno">11484</span>&#160;    {</div><div class="line"><a name="l11485"></a><span class="lineno">11485</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div><div class="line"><a name="l11486"></a><span class="lineno">11486</span>&#160;    }</div><div class="line"><a name="l11487"></a><span class="lineno">11487</span>&#160;</div><div class="line"><a name="l11488"></a><span class="lineno">11488</span>&#160;    <span class="comment">// Write header.</span></div><div class="line"><a name="l11489"></a><span class="lineno">11489</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;Vulkan Memory Allocator,Calls recording&quot;</span>);</div><div class="line"><a name="l11490"></a><span class="lineno">11490</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%s\n&quot;</span>, <span class="stringliteral">&quot;1,3&quot;</span>);</div><div class="line"><a name="l11491"></a><span class="lineno">11491</span>&#160;</div><div class="line"><a name="l11492"></a><span class="lineno">11492</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l11493"></a><span class="lineno">11493</span>&#160;}</div><div class="line"><a name="l11494"></a><span class="lineno">11494</span>&#160;</div><div class="line"><a name="l11495"></a><span class="lineno">11495</span>&#160;VmaRecorder::~VmaRecorder()</div><div class="line"><a name="l11496"></a><span class="lineno">11496</span>&#160;{</div><div class="line"><a name="l11497"></a><span class="lineno">11497</span>&#160;    <span class="keywordflow">if</span>(m_File != VMA_NULL)</div><div class="line"><a name="l11498"></a><span class="lineno">11498</span>&#160;    {</div><div class="line"><a name="l11499"></a><span class="lineno">11499</span>&#160;        fclose(m_File);</div><div class="line"><a name="l11500"></a><span class="lineno">11500</span>&#160;    }</div><div class="line"><a name="l11501"></a><span class="lineno">11501</span>&#160;}</div><div class="line"><a name="l11502"></a><span class="lineno">11502</span>&#160;</div><div class="line"><a name="l11503"></a><span class="lineno">11503</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateAllocator(uint32_t frameIndex)</div><div class="line"><a name="l11504"></a><span class="lineno">11504</span>&#160;{</div><div class="line"><a name="l11505"></a><span class="lineno">11505</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11506"></a><span class="lineno">11506</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11507"></a><span class="lineno">11507</span>&#160;</div><div class="line"><a name="l11508"></a><span class="lineno">11508</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11509"></a><span class="lineno">11509</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div><div class="line"><a name="l11510"></a><span class="lineno">11510</span>&#160;    Flush();</div><div class="line"><a name="l11511"></a><span class="lineno">11511</span>&#160;}</div><div class="line"><a name="l11512"></a><span class="lineno">11512</span>&#160;</div><div class="line"><a name="l11513"></a><span class="lineno">11513</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyAllocator(uint32_t frameIndex)</div><div class="line"><a name="l11514"></a><span class="lineno">11514</span>&#160;{</div><div class="line"><a name="l11515"></a><span class="lineno">11515</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11516"></a><span class="lineno">11516</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11517"></a><span class="lineno">11517</span>&#160;</div><div class="line"><a name="l11518"></a><span class="lineno">11518</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11519"></a><span class="lineno">11519</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyAllocator\n&quot;</span>, callParams.threadId, callParams.time, frameIndex);</div><div class="line"><a name="l11520"></a><span class="lineno">11520</span>&#160;    Flush();</div><div class="line"><a name="l11521"></a><span class="lineno">11521</span>&#160;}</div><div class="line"><a name="l11522"></a><span class="lineno">11522</span>&#160;</div><div class="line"><a name="l11523"></a><span class="lineno">11523</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreatePool(uint32_t frameIndex, <span class="keyword">const</span> <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a>&amp; createInfo, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l11524"></a><span class="lineno">11524</span>&#160;{</div><div class="line"><a name="l11525"></a><span class="lineno">11525</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11526"></a><span class="lineno">11526</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11527"></a><span class="lineno">11527</span>&#160;</div><div class="line"><a name="l11528"></a><span class="lineno">11528</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11529"></a><span class="lineno">11529</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreatePool,%u,%u,%llu,%llu,%llu,%u,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11530"></a><span class="lineno">11530</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>,</div><div class="line"><a name="l11531"></a><span class="lineno">11531</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>,</div><div class="line"><a name="l11532"></a><span class="lineno">11532</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#aa4265160536cdb9be821b7686c16c676">blockSize</a>,</div><div class="line"><a name="l11533"></a><span class="lineno">11533</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a>,</div><div class="line"><a name="l11534"></a><span class="lineno">11534</span>&#160;        (uint64_t)createInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>,</div><div class="line"><a name="l11535"></a><span class="lineno">11535</span>&#160;        createInfo.<a class="code" href="struct_vma_pool_create_info.html#a9437e43ffbb644dbbf7fc4e50cfad6aa">frameInUseCount</a>,</div><div class="line"><a name="l11536"></a><span class="lineno">11536</span>&#160;        pool);</div><div class="line"><a name="l11537"></a><span class="lineno">11537</span>&#160;    Flush();</div><div class="line"><a name="l11538"></a><span class="lineno">11538</span>&#160;}</div><div class="line"><a name="l11539"></a><span class="lineno">11539</span>&#160;</div><div class="line"><a name="l11540"></a><span class="lineno">11540</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyPool(uint32_t frameIndex, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l11541"></a><span class="lineno">11541</span>&#160;{</div><div class="line"><a name="l11542"></a><span class="lineno">11542</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11543"></a><span class="lineno">11543</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11544"></a><span class="lineno">11544</span>&#160;</div><div class="line"><a name="l11545"></a><span class="lineno">11545</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11546"></a><span class="lineno">11546</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyPool,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11547"></a><span class="lineno">11547</span>&#160;        pool);</div><div class="line"><a name="l11548"></a><span class="lineno">11548</span>&#160;    Flush();</div><div class="line"><a name="l11549"></a><span class="lineno">11549</span>&#160;}</div><div class="line"><a name="l11550"></a><span class="lineno">11550</span>&#160;</div><div class="line"><a name="l11551"></a><span class="lineno">11551</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemory(uint32_t frameIndex,</div><div class="line"><a name="l11552"></a><span class="lineno">11552</span>&#160;        <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l11553"></a><span class="lineno">11553</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="l11554"></a><span class="lineno">11554</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11555"></a><span class="lineno">11555</span>&#160;{</div><div class="line"><a name="l11556"></a><span class="lineno">11556</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11557"></a><span class="lineno">11557</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11558"></a><span class="lineno">11558</span>&#160;</div><div class="line"><a name="l11559"></a><span class="lineno">11559</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11560"></a><span class="lineno">11560</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11561"></a><span class="lineno">11561</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemory,%llu,%llu,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11562"></a><span class="lineno">11562</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l11563"></a><span class="lineno">11563</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l11564"></a><span class="lineno">11564</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l11565"></a><span class="lineno">11565</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11566"></a><span class="lineno">11566</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11567"></a><span class="lineno">11567</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11568"></a><span class="lineno">11568</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11569"></a><span class="lineno">11569</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11570"></a><span class="lineno">11570</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11571"></a><span class="lineno">11571</span>&#160;        allocation,</div><div class="line"><a name="l11572"></a><span class="lineno">11572</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11573"></a><span class="lineno">11573</span>&#160;    Flush();</div><div class="line"><a name="l11574"></a><span class="lineno">11574</span>&#160;}</div><div class="line"><a name="l11575"></a><span class="lineno">11575</span>&#160;</div><div class="line"><a name="l11576"></a><span class="lineno">11576</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForBuffer(uint32_t frameIndex,</div><div class="line"><a name="l11577"></a><span class="lineno">11577</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l11578"></a><span class="lineno">11578</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l11579"></a><span class="lineno">11579</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l11580"></a><span class="lineno">11580</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="l11581"></a><span class="lineno">11581</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11582"></a><span class="lineno">11582</span>&#160;{</div><div class="line"><a name="l11583"></a><span class="lineno">11583</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11584"></a><span class="lineno">11584</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11585"></a><span class="lineno">11585</span>&#160;</div><div class="line"><a name="l11586"></a><span class="lineno">11586</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11587"></a><span class="lineno">11587</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11588"></a><span class="lineno">11588</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForBuffer,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11589"></a><span class="lineno">11589</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l11590"></a><span class="lineno">11590</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l11591"></a><span class="lineno">11591</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l11592"></a><span class="lineno">11592</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l11593"></a><span class="lineno">11593</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l11594"></a><span class="lineno">11594</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11595"></a><span class="lineno">11595</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11596"></a><span class="lineno">11596</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11597"></a><span class="lineno">11597</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11598"></a><span class="lineno">11598</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11599"></a><span class="lineno">11599</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11600"></a><span class="lineno">11600</span>&#160;        allocation,</div><div class="line"><a name="l11601"></a><span class="lineno">11601</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11602"></a><span class="lineno">11602</span>&#160;    Flush();</div><div class="line"><a name="l11603"></a><span class="lineno">11603</span>&#160;}</div><div class="line"><a name="l11604"></a><span class="lineno">11604</span>&#160;</div><div class="line"><a name="l11605"></a><span class="lineno">11605</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordAllocateMemoryForImage(uint32_t frameIndex,</div><div class="line"><a name="l11606"></a><span class="lineno">11606</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l11607"></a><span class="lineno">11607</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l11608"></a><span class="lineno">11608</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l11609"></a><span class="lineno">11609</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="l11610"></a><span class="lineno">11610</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11611"></a><span class="lineno">11611</span>&#160;{</div><div class="line"><a name="l11612"></a><span class="lineno">11612</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11613"></a><span class="lineno">11613</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11614"></a><span class="lineno">11614</span>&#160;</div><div class="line"><a name="l11615"></a><span class="lineno">11615</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11616"></a><span class="lineno">11616</span>&#160;    UserDataString userDataStr(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11617"></a><span class="lineno">11617</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaAllocateMemoryForImage,%llu,%llu,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11618"></a><span class="lineno">11618</span>&#160;        vkMemReq.size,</div><div class="line"><a name="l11619"></a><span class="lineno">11619</span>&#160;        vkMemReq.alignment,</div><div class="line"><a name="l11620"></a><span class="lineno">11620</span>&#160;        vkMemReq.memoryTypeBits,</div><div class="line"><a name="l11621"></a><span class="lineno">11621</span>&#160;        requiresDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l11622"></a><span class="lineno">11622</span>&#160;        prefersDedicatedAllocation ? 1 : 0,</div><div class="line"><a name="l11623"></a><span class="lineno">11623</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11624"></a><span class="lineno">11624</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11625"></a><span class="lineno">11625</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11626"></a><span class="lineno">11626</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11627"></a><span class="lineno">11627</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11628"></a><span class="lineno">11628</span>&#160;        createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11629"></a><span class="lineno">11629</span>&#160;        allocation,</div><div class="line"><a name="l11630"></a><span class="lineno">11630</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11631"></a><span class="lineno">11631</span>&#160;    Flush();</div><div class="line"><a name="l11632"></a><span class="lineno">11632</span>&#160;}</div><div class="line"><a name="l11633"></a><span class="lineno">11633</span>&#160;</div><div class="line"><a name="l11634"></a><span class="lineno">11634</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFreeMemory(uint32_t frameIndex,</div><div class="line"><a name="l11635"></a><span class="lineno">11635</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11636"></a><span class="lineno">11636</span>&#160;{</div><div class="line"><a name="l11637"></a><span class="lineno">11637</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11638"></a><span class="lineno">11638</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11639"></a><span class="lineno">11639</span>&#160;</div><div class="line"><a name="l11640"></a><span class="lineno">11640</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11641"></a><span class="lineno">11641</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFreeMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11642"></a><span class="lineno">11642</span>&#160;        allocation);</div><div class="line"><a name="l11643"></a><span class="lineno">11643</span>&#160;    Flush();</div><div class="line"><a name="l11644"></a><span class="lineno">11644</span>&#160;}</div><div class="line"><a name="l11645"></a><span class="lineno">11645</span>&#160;</div><div class="line"><a name="l11646"></a><span class="lineno">11646</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordSetAllocationUserData(uint32_t frameIndex,</div><div class="line"><a name="l11647"></a><span class="lineno">11647</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l11648"></a><span class="lineno">11648</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l11649"></a><span class="lineno">11649</span>&#160;{</div><div class="line"><a name="l11650"></a><span class="lineno">11650</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11651"></a><span class="lineno">11651</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11652"></a><span class="lineno">11652</span>&#160;</div><div class="line"><a name="l11653"></a><span class="lineno">11653</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11654"></a><span class="lineno">11654</span>&#160;    UserDataString userDataStr(</div><div class="line"><a name="l11655"></a><span class="lineno">11655</span>&#160;        allocation-&gt;IsUserDataString() ? <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="l11656"></a><span class="lineno">11656</span>&#160;        pUserData);</div><div class="line"><a name="l11657"></a><span class="lineno">11657</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaSetAllocationUserData,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11658"></a><span class="lineno">11658</span>&#160;        allocation,</div><div class="line"><a name="l11659"></a><span class="lineno">11659</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11660"></a><span class="lineno">11660</span>&#160;    Flush();</div><div class="line"><a name="l11661"></a><span class="lineno">11661</span>&#160;}</div><div class="line"><a name="l11662"></a><span class="lineno">11662</span>&#160;</div><div class="line"><a name="l11663"></a><span class="lineno">11663</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateLostAllocation(uint32_t frameIndex,</div><div class="line"><a name="l11664"></a><span class="lineno">11664</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11665"></a><span class="lineno">11665</span>&#160;{</div><div class="line"><a name="l11666"></a><span class="lineno">11666</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11667"></a><span class="lineno">11667</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11668"></a><span class="lineno">11668</span>&#160;</div><div class="line"><a name="l11669"></a><span class="lineno">11669</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11670"></a><span class="lineno">11670</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateLostAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11671"></a><span class="lineno">11671</span>&#160;        allocation);</div><div class="line"><a name="l11672"></a><span class="lineno">11672</span>&#160;    Flush();</div><div class="line"><a name="l11673"></a><span class="lineno">11673</span>&#160;}</div><div class="line"><a name="l11674"></a><span class="lineno">11674</span>&#160;</div><div class="line"><a name="l11675"></a><span class="lineno">11675</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMapMemory(uint32_t frameIndex,</div><div class="line"><a name="l11676"></a><span class="lineno">11676</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11677"></a><span class="lineno">11677</span>&#160;{</div><div class="line"><a name="l11678"></a><span class="lineno">11678</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11679"></a><span class="lineno">11679</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11680"></a><span class="lineno">11680</span>&#160;</div><div class="line"><a name="l11681"></a><span class="lineno">11681</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11682"></a><span class="lineno">11682</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11683"></a><span class="lineno">11683</span>&#160;        allocation);</div><div class="line"><a name="l11684"></a><span class="lineno">11684</span>&#160;    Flush();</div><div class="line"><a name="l11685"></a><span class="lineno">11685</span>&#160;}</div><div class="line"><a name="l11686"></a><span class="lineno">11686</span>&#160;</div><div class="line"><a name="l11687"></a><span class="lineno">11687</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordUnmapMemory(uint32_t frameIndex,</div><div class="line"><a name="l11688"></a><span class="lineno">11688</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11689"></a><span class="lineno">11689</span>&#160;{</div><div class="line"><a name="l11690"></a><span class="lineno">11690</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11691"></a><span class="lineno">11691</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11692"></a><span class="lineno">11692</span>&#160;</div><div class="line"><a name="l11693"></a><span class="lineno">11693</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11694"></a><span class="lineno">11694</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaUnmapMemory,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11695"></a><span class="lineno">11695</span>&#160;        allocation);</div><div class="line"><a name="l11696"></a><span class="lineno">11696</span>&#160;    Flush();</div><div class="line"><a name="l11697"></a><span class="lineno">11697</span>&#160;}</div><div class="line"><a name="l11698"></a><span class="lineno">11698</span>&#160;</div><div class="line"><a name="l11699"></a><span class="lineno">11699</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordFlushAllocation(uint32_t frameIndex,</div><div class="line"><a name="l11700"></a><span class="lineno">11700</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l11701"></a><span class="lineno">11701</span>&#160;{</div><div class="line"><a name="l11702"></a><span class="lineno">11702</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11703"></a><span class="lineno">11703</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11704"></a><span class="lineno">11704</span>&#160;</div><div class="line"><a name="l11705"></a><span class="lineno">11705</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11706"></a><span class="lineno">11706</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaFlushAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11707"></a><span class="lineno">11707</span>&#160;        allocation,</div><div class="line"><a name="l11708"></a><span class="lineno">11708</span>&#160;        offset,</div><div class="line"><a name="l11709"></a><span class="lineno">11709</span>&#160;        size);</div><div class="line"><a name="l11710"></a><span class="lineno">11710</span>&#160;    Flush();</div><div class="line"><a name="l11711"></a><span class="lineno">11711</span>&#160;}</div><div class="line"><a name="l11712"></a><span class="lineno">11712</span>&#160;</div><div class="line"><a name="l11713"></a><span class="lineno">11713</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordInvalidateAllocation(uint32_t frameIndex,</div><div class="line"><a name="l11714"></a><span class="lineno">11714</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l11715"></a><span class="lineno">11715</span>&#160;{</div><div class="line"><a name="l11716"></a><span class="lineno">11716</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11717"></a><span class="lineno">11717</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11718"></a><span class="lineno">11718</span>&#160;</div><div class="line"><a name="l11719"></a><span class="lineno">11719</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11720"></a><span class="lineno">11720</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaInvalidateAllocation,%p,%llu,%llu\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11721"></a><span class="lineno">11721</span>&#160;        allocation,</div><div class="line"><a name="l11722"></a><span class="lineno">11722</span>&#160;        offset,</div><div class="line"><a name="l11723"></a><span class="lineno">11723</span>&#160;        size);</div><div class="line"><a name="l11724"></a><span class="lineno">11724</span>&#160;    Flush();</div><div class="line"><a name="l11725"></a><span class="lineno">11725</span>&#160;}</div><div class="line"><a name="l11726"></a><span class="lineno">11726</span>&#160;</div><div class="line"><a name="l11727"></a><span class="lineno">11727</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateBuffer(uint32_t frameIndex,</div><div class="line"><a name="l11728"></a><span class="lineno">11728</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo&amp; bufCreateInfo,</div><div class="line"><a name="l11729"></a><span class="lineno">11729</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l11730"></a><span class="lineno">11730</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11731"></a><span class="lineno">11731</span>&#160;{</div><div class="line"><a name="l11732"></a><span class="lineno">11732</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11733"></a><span class="lineno">11733</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11734"></a><span class="lineno">11734</span>&#160;</div><div class="line"><a name="l11735"></a><span class="lineno">11735</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11736"></a><span class="lineno">11736</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11737"></a><span class="lineno">11737</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateBuffer,%u,%llu,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11738"></a><span class="lineno">11738</span>&#160;        bufCreateInfo.flags,</div><div class="line"><a name="l11739"></a><span class="lineno">11739</span>&#160;        bufCreateInfo.size,</div><div class="line"><a name="l11740"></a><span class="lineno">11740</span>&#160;        bufCreateInfo.usage,</div><div class="line"><a name="l11741"></a><span class="lineno">11741</span>&#160;        bufCreateInfo.sharingMode,</div><div class="line"><a name="l11742"></a><span class="lineno">11742</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11743"></a><span class="lineno">11743</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11744"></a><span class="lineno">11744</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11745"></a><span class="lineno">11745</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11746"></a><span class="lineno">11746</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11747"></a><span class="lineno">11747</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11748"></a><span class="lineno">11748</span>&#160;        allocation,</div><div class="line"><a name="l11749"></a><span class="lineno">11749</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11750"></a><span class="lineno">11750</span>&#160;    Flush();</div><div class="line"><a name="l11751"></a><span class="lineno">11751</span>&#160;}</div><div class="line"><a name="l11752"></a><span class="lineno">11752</span>&#160;</div><div class="line"><a name="l11753"></a><span class="lineno">11753</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordCreateImage(uint32_t frameIndex,</div><div class="line"><a name="l11754"></a><span class="lineno">11754</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo&amp; imageCreateInfo,</div><div class="line"><a name="l11755"></a><span class="lineno">11755</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a>&amp; allocCreateInfo,</div><div class="line"><a name="l11756"></a><span class="lineno">11756</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11757"></a><span class="lineno">11757</span>&#160;{</div><div class="line"><a name="l11758"></a><span class="lineno">11758</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11759"></a><span class="lineno">11759</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11760"></a><span class="lineno">11760</span>&#160;</div><div class="line"><a name="l11761"></a><span class="lineno">11761</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11762"></a><span class="lineno">11762</span>&#160;    UserDataString userDataStr(allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>, allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>);</div><div class="line"><a name="l11763"></a><span class="lineno">11763</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaCreateImage,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%p,%p,%s\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11764"></a><span class="lineno">11764</span>&#160;        imageCreateInfo.flags,</div><div class="line"><a name="l11765"></a><span class="lineno">11765</span>&#160;        imageCreateInfo.imageType,</div><div class="line"><a name="l11766"></a><span class="lineno">11766</span>&#160;        imageCreateInfo.format,</div><div class="line"><a name="l11767"></a><span class="lineno">11767</span>&#160;        imageCreateInfo.extent.width,</div><div class="line"><a name="l11768"></a><span class="lineno">11768</span>&#160;        imageCreateInfo.extent.height,</div><div class="line"><a name="l11769"></a><span class="lineno">11769</span>&#160;        imageCreateInfo.extent.depth,</div><div class="line"><a name="l11770"></a><span class="lineno">11770</span>&#160;        imageCreateInfo.mipLevels,</div><div class="line"><a name="l11771"></a><span class="lineno">11771</span>&#160;        imageCreateInfo.arrayLayers,</div><div class="line"><a name="l11772"></a><span class="lineno">11772</span>&#160;        imageCreateInfo.samples,</div><div class="line"><a name="l11773"></a><span class="lineno">11773</span>&#160;        imageCreateInfo.tiling,</div><div class="line"><a name="l11774"></a><span class="lineno">11774</span>&#160;        imageCreateInfo.usage,</div><div class="line"><a name="l11775"></a><span class="lineno">11775</span>&#160;        imageCreateInfo.sharingMode,</div><div class="line"><a name="l11776"></a><span class="lineno">11776</span>&#160;        imageCreateInfo.initialLayout,</div><div class="line"><a name="l11777"></a><span class="lineno">11777</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#add09658ac14fe290ace25470ddd6d41b">flags</a>,</div><div class="line"><a name="l11778"></a><span class="lineno">11778</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#accb8b06b1f677d858cb9af20705fa910">usage</a>,</div><div class="line"><a name="l11779"></a><span class="lineno">11779</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a9166390303ff42d783305bc31c2b6b90">requiredFlags</a>,</div><div class="line"><a name="l11780"></a><span class="lineno">11780</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a7fe8d81a1ad10b2a2faacacee5b15d6d">preferredFlags</a>,</div><div class="line"><a name="l11781"></a><span class="lineno">11781</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a3bf940c0271d85d6ba32a4d820075055">memoryTypeBits</a>,</div><div class="line"><a name="l11782"></a><span class="lineno">11782</span>&#160;        allocCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l11783"></a><span class="lineno">11783</span>&#160;        allocation,</div><div class="line"><a name="l11784"></a><span class="lineno">11784</span>&#160;        userDataStr.GetString());</div><div class="line"><a name="l11785"></a><span class="lineno">11785</span>&#160;    Flush();</div><div class="line"><a name="l11786"></a><span class="lineno">11786</span>&#160;}</div><div class="line"><a name="l11787"></a><span class="lineno">11787</span>&#160;</div><div class="line"><a name="l11788"></a><span class="lineno">11788</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyBuffer(uint32_t frameIndex,</div><div class="line"><a name="l11789"></a><span class="lineno">11789</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11790"></a><span class="lineno">11790</span>&#160;{</div><div class="line"><a name="l11791"></a><span class="lineno">11791</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11792"></a><span class="lineno">11792</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11793"></a><span class="lineno">11793</span>&#160;</div><div class="line"><a name="l11794"></a><span class="lineno">11794</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11795"></a><span class="lineno">11795</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyBuffer,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11796"></a><span class="lineno">11796</span>&#160;        allocation);</div><div class="line"><a name="l11797"></a><span class="lineno">11797</span>&#160;    Flush();</div><div class="line"><a name="l11798"></a><span class="lineno">11798</span>&#160;}</div><div class="line"><a name="l11799"></a><span class="lineno">11799</span>&#160;</div><div class="line"><a name="l11800"></a><span class="lineno">11800</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordDestroyImage(uint32_t frameIndex,</div><div class="line"><a name="l11801"></a><span class="lineno">11801</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11802"></a><span class="lineno">11802</span>&#160;{</div><div class="line"><a name="l11803"></a><span class="lineno">11803</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11804"></a><span class="lineno">11804</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11805"></a><span class="lineno">11805</span>&#160;</div><div class="line"><a name="l11806"></a><span class="lineno">11806</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11807"></a><span class="lineno">11807</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaDestroyImage,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11808"></a><span class="lineno">11808</span>&#160;        allocation);</div><div class="line"><a name="l11809"></a><span class="lineno">11809</span>&#160;    Flush();</div><div class="line"><a name="l11810"></a><span class="lineno">11810</span>&#160;}</div><div class="line"><a name="l11811"></a><span class="lineno">11811</span>&#160;</div><div class="line"><a name="l11812"></a><span class="lineno">11812</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordTouchAllocation(uint32_t frameIndex,</div><div class="line"><a name="l11813"></a><span class="lineno">11813</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11814"></a><span class="lineno">11814</span>&#160;{</div><div class="line"><a name="l11815"></a><span class="lineno">11815</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11816"></a><span class="lineno">11816</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11817"></a><span class="lineno">11817</span>&#160;</div><div class="line"><a name="l11818"></a><span class="lineno">11818</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11819"></a><span class="lineno">11819</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaTouchAllocation,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11820"></a><span class="lineno">11820</span>&#160;        allocation);</div><div class="line"><a name="l11821"></a><span class="lineno">11821</span>&#160;    Flush();</div><div class="line"><a name="l11822"></a><span class="lineno">11822</span>&#160;}</div><div class="line"><a name="l11823"></a><span class="lineno">11823</span>&#160;</div><div class="line"><a name="l11824"></a><span class="lineno">11824</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordGetAllocationInfo(uint32_t frameIndex,</div><div class="line"><a name="l11825"></a><span class="lineno">11825</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l11826"></a><span class="lineno">11826</span>&#160;{</div><div class="line"><a name="l11827"></a><span class="lineno">11827</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11828"></a><span class="lineno">11828</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11829"></a><span class="lineno">11829</span>&#160;</div><div class="line"><a name="l11830"></a><span class="lineno">11830</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11831"></a><span class="lineno">11831</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaGetAllocationInfo,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11832"></a><span class="lineno">11832</span>&#160;        allocation);</div><div class="line"><a name="l11833"></a><span class="lineno">11833</span>&#160;    Flush();</div><div class="line"><a name="l11834"></a><span class="lineno">11834</span>&#160;}</div><div class="line"><a name="l11835"></a><span class="lineno">11835</span>&#160;</div><div class="line"><a name="l11836"></a><span class="lineno">11836</span>&#160;<span class="keywordtype">void</span> VmaRecorder::RecordMakePoolAllocationsLost(uint32_t frameIndex,</div><div class="line"><a name="l11837"></a><span class="lineno">11837</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l11838"></a><span class="lineno">11838</span>&#160;{</div><div class="line"><a name="l11839"></a><span class="lineno">11839</span>&#160;    CallParams callParams;</div><div class="line"><a name="l11840"></a><span class="lineno">11840</span>&#160;    GetBasicParams(callParams);</div><div class="line"><a name="l11841"></a><span class="lineno">11841</span>&#160;</div><div class="line"><a name="l11842"></a><span class="lineno">11842</span>&#160;    VmaMutexLock lock(m_FileMutex, m_UseMutex);</div><div class="line"><a name="l11843"></a><span class="lineno">11843</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;%u,%.3f,%u,vmaMakePoolAllocationsLost,%p\n&quot;</span>, callParams.threadId, callParams.time, frameIndex,</div><div class="line"><a name="l11844"></a><span class="lineno">11844</span>&#160;        pool);</div><div class="line"><a name="l11845"></a><span class="lineno">11845</span>&#160;    Flush();</div><div class="line"><a name="l11846"></a><span class="lineno">11846</span>&#160;}</div><div class="line"><a name="l11847"></a><span class="lineno">11847</span>&#160;</div><div class="line"><a name="l11848"></a><span class="lineno">11848</span>&#160;VmaRecorder::UserDataString::UserDataString(<a class="code" href="vk__mem__alloc_8h.html#a5225e5e11f8376f6a31a1791f3d6e817">VmaAllocationCreateFlags</a> allocFlags, <span class="keyword">const</span> <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l11849"></a><span class="lineno">11849</span>&#160;{</div><div class="line"><a name="l11850"></a><span class="lineno">11850</span>&#160;    <span class="keywordflow">if</span>(pUserData != VMA_NULL)</div><div class="line"><a name="l11851"></a><span class="lineno">11851</span>&#160;    {</div><div class="line"><a name="l11852"></a><span class="lineno">11852</span>&#160;        <span class="keywordflow">if</span>((allocFlags &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="l11853"></a><span class="lineno">11853</span>&#160;        {</div><div class="line"><a name="l11854"></a><span class="lineno">11854</span>&#160;            m_Str = (<span class="keyword">const</span> <span class="keywordtype">char</span>*)pUserData;</div><div class="line"><a name="l11855"></a><span class="lineno">11855</span>&#160;        }</div><div class="line"><a name="l11856"></a><span class="lineno">11856</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l11857"></a><span class="lineno">11857</span>&#160;        {</div><div class="line"><a name="l11858"></a><span class="lineno">11858</span>&#160;            sprintf_s(m_PtrStr, <span class="stringliteral">&quot;%p&quot;</span>, pUserData);</div><div class="line"><a name="l11859"></a><span class="lineno">11859</span>&#160;            m_Str = m_PtrStr;</div><div class="line"><a name="l11860"></a><span class="lineno">11860</span>&#160;        }</div><div class="line"><a name="l11861"></a><span class="lineno">11861</span>&#160;    }</div><div class="line"><a name="l11862"></a><span class="lineno">11862</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l11863"></a><span class="lineno">11863</span>&#160;    {</div><div class="line"><a name="l11864"></a><span class="lineno">11864</span>&#160;        m_Str = <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l11865"></a><span class="lineno">11865</span>&#160;    }</div><div class="line"><a name="l11866"></a><span class="lineno">11866</span>&#160;}</div><div class="line"><a name="l11867"></a><span class="lineno">11867</span>&#160;</div><div class="line"><a name="l11868"></a><span class="lineno">11868</span>&#160;<span class="keywordtype">void</span> VmaRecorder::WriteConfiguration(</div><div class="line"><a name="l11869"></a><span class="lineno">11869</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties&amp; devProps,</div><div class="line"><a name="l11870"></a><span class="lineno">11870</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties&amp; memProps,</div><div class="line"><a name="l11871"></a><span class="lineno">11871</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationExtensionEnabled)</div><div class="line"><a name="l11872"></a><span class="lineno">11872</span>&#160;{</div><div class="line"><a name="l11873"></a><span class="lineno">11873</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,Begin\n&quot;</span>);</div><div class="line"><a name="l11874"></a><span class="lineno">11874</span>&#160;</div><div class="line"><a name="l11875"></a><span class="lineno">11875</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,apiVersion,%u\n&quot;</span>, devProps.apiVersion);</div><div class="line"><a name="l11876"></a><span class="lineno">11876</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,driverVersion,%u\n&quot;</span>, devProps.driverVersion);</div><div class="line"><a name="l11877"></a><span class="lineno">11877</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,vendorID,%u\n&quot;</span>, devProps.vendorID);</div><div class="line"><a name="l11878"></a><span class="lineno">11878</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceID,%u\n&quot;</span>, devProps.deviceID);</div><div class="line"><a name="l11879"></a><span class="lineno">11879</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceType,%u\n&quot;</span>, devProps.deviceType);</div><div class="line"><a name="l11880"></a><span class="lineno">11880</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDevice,deviceName,%s\n&quot;</span>, devProps.deviceName);</div><div class="line"><a name="l11881"></a><span class="lineno">11881</span>&#160;</div><div class="line"><a name="l11882"></a><span class="lineno">11882</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,maxMemoryAllocationCount,%u\n&quot;</span>, devProps.limits.maxMemoryAllocationCount);</div><div class="line"><a name="l11883"></a><span class="lineno">11883</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,bufferImageGranularity,%llu\n&quot;</span>, devProps.limits.bufferImageGranularity);</div><div class="line"><a name="l11884"></a><span class="lineno">11884</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceLimits,nonCoherentAtomSize,%llu\n&quot;</span>, devProps.limits.nonCoherentAtomSize);</div><div class="line"><a name="l11885"></a><span class="lineno">11885</span>&#160;</div><div class="line"><a name="l11886"></a><span class="lineno">11886</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,HeapCount,%u\n&quot;</span>, memProps.memoryHeapCount);</div><div class="line"><a name="l11887"></a><span class="lineno">11887</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryHeapCount; ++i)</div><div class="line"><a name="l11888"></a><span class="lineno">11888</span>&#160;    {</div><div class="line"><a name="l11889"></a><span class="lineno">11889</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,size,%llu\n&quot;</span>, i, memProps.memoryHeaps[i].size);</div><div class="line"><a name="l11890"></a><span class="lineno">11890</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Heap,%u,flags,%u\n&quot;</span>, i, memProps.memoryHeaps[i].flags);</div><div class="line"><a name="l11891"></a><span class="lineno">11891</span>&#160;    }</div><div class="line"><a name="l11892"></a><span class="lineno">11892</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,TypeCount,%u\n&quot;</span>, memProps.memoryTypeCount);</div><div class="line"><a name="l11893"></a><span class="lineno">11893</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; memProps.memoryTypeCount; ++i)</div><div class="line"><a name="l11894"></a><span class="lineno">11894</span>&#160;    {</div><div class="line"><a name="l11895"></a><span class="lineno">11895</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,heapIndex,%u\n&quot;</span>, i, memProps.memoryTypes[i].heapIndex);</div><div class="line"><a name="l11896"></a><span class="lineno">11896</span>&#160;        fprintf(m_File, <span class="stringliteral">&quot;PhysicalDeviceMemory,Type,%u,propertyFlags,%u\n&quot;</span>, i, memProps.memoryTypes[i].propertyFlags);</div><div class="line"><a name="l11897"></a><span class="lineno">11897</span>&#160;    }</div><div class="line"><a name="l11898"></a><span class="lineno">11898</span>&#160;</div><div class="line"><a name="l11899"></a><span class="lineno">11899</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Extension,VK_KHR_dedicated_allocation,%u\n&quot;</span>, dedicatedAllocationExtensionEnabled ? 1 : 0);</div><div class="line"><a name="l11900"></a><span class="lineno">11900</span>&#160;</div><div class="line"><a name="l11901"></a><span class="lineno">11901</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALWAYS_DEDICATED_MEMORY,%u\n&quot;</span>, VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ? 1 : 0);</div><div class="line"><a name="l11902"></a><span class="lineno">11902</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_ALIGNMENT,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_ALIGNMENT);</div><div class="line"><a name="l11903"></a><span class="lineno">11903</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MARGIN,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MARGIN);</div><div class="line"><a name="l11904"></a><span class="lineno">11904</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_INITIALIZE_ALLOCATIONS,%u\n&quot;</span>, VMA_DEBUG_INITIALIZE_ALLOCATIONS ? 1 : 0);</div><div class="line"><a name="l11905"></a><span class="lineno">11905</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_DETECT_CORRUPTION,%u\n&quot;</span>, VMA_DEBUG_DETECT_CORRUPTION ? 1 : 0);</div><div class="line"><a name="l11906"></a><span class="lineno">11906</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_GLOBAL_MUTEX,%u\n&quot;</span>, VMA_DEBUG_GLOBAL_MUTEX ? 1 : 0);</div><div class="line"><a name="l11907"></a><span class="lineno">11907</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY);</div><div class="line"><a name="l11908"></a><span class="lineno">11908</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_SMALL_HEAP_MAX_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_SMALL_HEAP_MAX_SIZE);</div><div class="line"><a name="l11909"></a><span class="lineno">11909</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Macro,VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE,%llu\n&quot;</span>, (VkDeviceSize)VMA_DEFAULT_LARGE_HEAP_BLOCK_SIZE);</div><div class="line"><a name="l11910"></a><span class="lineno">11910</span>&#160;</div><div class="line"><a name="l11911"></a><span class="lineno">11911</span>&#160;    fprintf(m_File, <span class="stringliteral">&quot;Config,End\n&quot;</span>);</div><div class="line"><a name="l11912"></a><span class="lineno">11912</span>&#160;}</div><div class="line"><a name="l11913"></a><span class="lineno">11913</span>&#160;</div><div class="line"><a name="l11914"></a><span class="lineno">11914</span>&#160;<span class="keywordtype">void</span> VmaRecorder::GetBasicParams(CallParams&amp; outParams)</div><div class="line"><a name="l11915"></a><span class="lineno">11915</span>&#160;{</div><div class="line"><a name="l11916"></a><span class="lineno">11916</span>&#160;    outParams.threadId = GetCurrentThreadId();</div><div class="line"><a name="l11917"></a><span class="lineno">11917</span>&#160;</div><div class="line"><a name="l11918"></a><span class="lineno">11918</span>&#160;    LARGE_INTEGER counter;</div><div class="line"><a name="l11919"></a><span class="lineno">11919</span>&#160;    QueryPerformanceCounter(&amp;counter);</div><div class="line"><a name="l11920"></a><span class="lineno">11920</span>&#160;    outParams.time = (double)(counter.QuadPart - m_StartCounter) / (double)m_Freq;</div><div class="line"><a name="l11921"></a><span class="lineno">11921</span>&#160;}</div><div class="line"><a name="l11922"></a><span class="lineno">11922</span>&#160;</div><div class="line"><a name="l11923"></a><span class="lineno">11923</span>&#160;<span class="keywordtype">void</span> VmaRecorder::Flush()</div><div class="line"><a name="l11924"></a><span class="lineno">11924</span>&#160;{</div><div class="line"><a name="l11925"></a><span class="lineno">11925</span>&#160;    <span class="keywordflow">if</span>((m_Flags &amp; <a class="code" href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a>) != 0)</div><div class="line"><a name="l11926"></a><span class="lineno">11926</span>&#160;    {</div><div class="line"><a name="l11927"></a><span class="lineno">11927</span>&#160;        fflush(m_File);</div><div class="line"><a name="l11928"></a><span class="lineno">11928</span>&#160;    }</div><div class="line"><a name="l11929"></a><span class="lineno">11929</span>&#160;}</div><div class="line"><a name="l11930"></a><span class="lineno">11930</span>&#160;</div><div class="line"><a name="l11931"></a><span class="lineno">11931</span>&#160;<span class="preprocessor">#endif // #if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l11932"></a><span class="lineno">11932</span>&#160;</div><div class="line"><a name="l11934"></a><span class="lineno">11934</span>&#160;<span class="comment">// VmaAllocator_T</span></div><div class="line"><a name="l11935"></a><span class="lineno">11935</span>&#160;</div><div class="line"><a name="l11936"></a><span class="lineno">11936</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="l11937"></a><span class="lineno">11937</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="l11938"></a><span class="lineno">11938</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="l11939"></a><span class="lineno">11939</span>&#160;    m_hDevice(pCreateInfo-&gt;device),</div><div class="line"><a name="l11940"></a><span class="lineno">11940</span>&#160;    m_AllocationCallbacksSpecified(pCreateInfo-&gt;pAllocationCallbacks != VMA_NULL),</div><div class="line"><a name="l11941"></a><span class="lineno">11941</span>&#160;    m_AllocationCallbacks(pCreateInfo-&gt;pAllocationCallbacks ?</div><div class="line"><a name="l11942"></a><span class="lineno">11942</span>&#160;        *pCreateInfo-&gt;pAllocationCallbacks : VmaEmptyAllocationCallbacks),</div><div class="line"><a name="l11943"></a><span class="lineno">11943</span>&#160;    m_PreferredLargeHeapBlockSize(0),</div><div class="line"><a name="l11944"></a><span class="lineno">11944</span>&#160;    m_PhysicalDevice(pCreateInfo-&gt;physicalDevice),</div><div class="line"><a name="l11945"></a><span class="lineno">11945</span>&#160;    m_CurrentFrameIndex(0),</div><div class="line"><a name="l11946"></a><span class="lineno">11946</span>&#160;    m_Pools(VmaStlAllocator&lt;<a class="code" href="struct_vma_pool.html">VmaPool</a>&gt;(GetAllocationCallbacks())),</div><div class="line"><a name="l11947"></a><span class="lineno">11947</span>&#160;    m_NextPoolId(0)</div><div class="line"><a name="l11948"></a><span class="lineno">11948</span>&#160;#if <a class="code" href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="line"><a name="l11949"></a><span class="lineno">11949</span>&#160;    ,m_pRecorder(VMA_NULL)</div><div class="line"><a name="l11950"></a><span class="lineno">11950</span>&#160;#endif</div><div class="line"><a name="l11951"></a><span class="lineno">11951</span>&#160;{</div><div class="line"><a name="l11952"></a><span class="lineno">11952</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_DETECT_CORRUPTION)</div><div class="line"><a name="l11953"></a><span class="lineno">11953</span>&#160;    {</div><div class="line"><a name="l11954"></a><span class="lineno">11954</span>&#160;        <span class="comment">// Needs to be multiply of uint32_t size because we are going to write VMA_CORRUPTION_DETECTION_MAGIC_VALUE to it.</span></div><div class="line"><a name="l11955"></a><span class="lineno">11955</span>&#160;        VMA_ASSERT(VMA_DEBUG_MARGIN % <span class="keyword">sizeof</span>(uint32_t) == 0);</div><div class="line"><a name="l11956"></a><span class="lineno">11956</span>&#160;    }</div><div class="line"><a name="l11957"></a><span class="lineno">11957</span>&#160;</div><div class="line"><a name="l11958"></a><span class="lineno">11958</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="l11959"></a><span class="lineno">11959</span>&#160;</div><div class="line"><a name="l11960"></a><span class="lineno">11960</span>&#160;<span class="preprocessor">#if !(VMA_DEDICATED_ALLOCATION)</span></div><div class="line"><a name="l11961"></a><span class="lineno">11961</span>&#160;    <span class="keywordflow">if</span>((pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a392ea2ecbaff93f91a7c49f735ad4346">flags</a> &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="l11962"></a><span class="lineno">11962</span>&#160;    {</div><div class="line"><a name="l11963"></a><span class="lineno">11963</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.&quot;</span>);</div><div class="line"><a name="l11964"></a><span class="lineno">11964</span>&#160;    }</div><div class="line"><a name="l11965"></a><span class="lineno">11965</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l11966"></a><span class="lineno">11966</span>&#160;</div><div class="line"><a name="l11967"></a><span class="lineno">11967</span>&#160;    memset(&amp;m_DeviceMemoryCallbacks, 0 ,<span class="keyword">sizeof</span>(m_DeviceMemoryCallbacks));</div><div class="line"><a name="l11968"></a><span class="lineno">11968</span>&#160;    memset(&amp;m_PhysicalDeviceProperties, 0, <span class="keyword">sizeof</span>(m_PhysicalDeviceProperties));</div><div class="line"><a name="l11969"></a><span class="lineno">11969</span>&#160;    memset(&amp;m_MemProps, 0, <span class="keyword">sizeof</span>(m_MemProps));</div><div class="line"><a name="l11970"></a><span class="lineno">11970</span>&#160;        </div><div class="line"><a name="l11971"></a><span class="lineno">11971</span>&#160;    memset(&amp;m_pBlockVectors, 0, <span class="keyword">sizeof</span>(m_pBlockVectors));</div><div class="line"><a name="l11972"></a><span class="lineno">11972</span>&#160;    memset(&amp;m_pDedicatedAllocations, 0, <span class="keyword">sizeof</span>(m_pDedicatedAllocations));</div><div class="line"><a name="l11973"></a><span class="lineno">11973</span>&#160;</div><div class="line"><a name="l11974"></a><span class="lineno">11974</span>&#160;    <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; VK_MAX_MEMORY_HEAPS; ++i)</div><div class="line"><a name="l11975"></a><span class="lineno">11975</span>&#160;    {</div><div class="line"><a name="l11976"></a><span class="lineno">11976</span>&#160;        m_HeapSizeLimit[i] = VK_WHOLE_SIZE;</div><div class="line"><a name="l11977"></a><span class="lineno">11977</span>&#160;    }</div><div class="line"><a name="l11978"></a><span class="lineno">11978</span>&#160;</div><div class="line"><a name="l11979"></a><span class="lineno">11979</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="l11980"></a><span class="lineno">11980</span>&#160;    {</div><div class="line"><a name="l11981"></a><span class="lineno">11981</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="l11982"></a><span class="lineno">11982</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="l11983"></a><span class="lineno">11983</span>&#160;    }</div><div class="line"><a name="l11984"></a><span class="lineno">11984</span>&#160;</div><div class="line"><a name="l11985"></a><span class="lineno">11985</span>&#160;    ImportVulkanFunctions(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a3dc197be3227da7338b1643f70db36bd">pVulkanFunctions</a>);</div><div class="line"><a name="l11986"></a><span class="lineno">11986</span>&#160;</div><div class="line"><a name="l11987"></a><span class="lineno">11987</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceProperties)(m_PhysicalDevice, &amp;m_PhysicalDeviceProperties);</div><div class="line"><a name="l11988"></a><span class="lineno">11988</span>&#160;    (*m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties)(m_PhysicalDevice, &amp;m_MemProps);</div><div class="line"><a name="l11989"></a><span class="lineno">11989</span>&#160;</div><div class="line"><a name="l11990"></a><span class="lineno">11990</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_ALIGNMENT));</div><div class="line"><a name="l11991"></a><span class="lineno">11991</span>&#160;    VMA_ASSERT(VmaIsPow2(VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY));</div><div class="line"><a name="l11992"></a><span class="lineno">11992</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.bufferImageGranularity));</div><div class="line"><a name="l11993"></a><span class="lineno">11993</span>&#160;    VMA_ASSERT(VmaIsPow2(m_PhysicalDeviceProperties.limits.nonCoherentAtomSize));</div><div class="line"><a name="l11994"></a><span class="lineno">11994</span>&#160;</div><div class="line"><a name="l11995"></a><span class="lineno">11995</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="l11996"></a><span class="lineno">11996</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="l11997"></a><span class="lineno">11997</span>&#160;</div><div class="line"><a name="l11998"></a><span class="lineno">11998</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="l11999"></a><span class="lineno">11999</span>&#160;    {</div><div class="line"><a name="l12000"></a><span class="lineno">12000</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l12001"></a><span class="lineno">12001</span>&#160;        {</div><div class="line"><a name="l12002"></a><span class="lineno">12002</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="l12003"></a><span class="lineno">12003</span>&#160;            <span class="keywordflow">if</span>(limit != VK_WHOLE_SIZE)</div><div class="line"><a name="l12004"></a><span class="lineno">12004</span>&#160;            {</div><div class="line"><a name="l12005"></a><span class="lineno">12005</span>&#160;                m_HeapSizeLimit[heapIndex] = limit;</div><div class="line"><a name="l12006"></a><span class="lineno">12006</span>&#160;                <span class="keywordflow">if</span>(limit &lt; m_MemProps.memoryHeaps[heapIndex].size)</div><div class="line"><a name="l12007"></a><span class="lineno">12007</span>&#160;                {</div><div class="line"><a name="l12008"></a><span class="lineno">12008</span>&#160;                    m_MemProps.memoryHeaps[heapIndex].size = limit;</div><div class="line"><a name="l12009"></a><span class="lineno">12009</span>&#160;                }</div><div class="line"><a name="l12010"></a><span class="lineno">12010</span>&#160;            }</div><div class="line"><a name="l12011"></a><span class="lineno">12011</span>&#160;        }</div><div class="line"><a name="l12012"></a><span class="lineno">12012</span>&#160;    }</div><div class="line"><a name="l12013"></a><span class="lineno">12013</span>&#160;</div><div class="line"><a name="l12014"></a><span class="lineno">12014</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l12015"></a><span class="lineno">12015</span>&#160;    {</div><div class="line"><a name="l12016"></a><span class="lineno">12016</span>&#160;        <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(memTypeIndex);</div><div class="line"><a name="l12017"></a><span class="lineno">12017</span>&#160;</div><div class="line"><a name="l12018"></a><span class="lineno">12018</span>&#160;        m_pBlockVectors[memTypeIndex] = vma_new(<span class="keyword">this</span>, VmaBlockVector)(</div><div class="line"><a name="l12019"></a><span class="lineno">12019</span>&#160;            <span class="keyword">this</span>,</div><div class="line"><a name="l12020"></a><span class="lineno">12020</span>&#160;            memTypeIndex,</div><div class="line"><a name="l12021"></a><span class="lineno">12021</span>&#160;            preferredBlockSize,</div><div class="line"><a name="l12022"></a><span class="lineno">12022</span>&#160;            0,</div><div class="line"><a name="l12023"></a><span class="lineno">12023</span>&#160;            SIZE_MAX,</div><div class="line"><a name="l12024"></a><span class="lineno">12024</span>&#160;            GetBufferImageGranularity(),</div><div class="line"><a name="l12025"></a><span class="lineno">12025</span>&#160;            pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#a21ea188dd212b8171cb9ecbed4a2a3a7">frameInUseCount</a>,</div><div class="line"><a name="l12026"></a><span class="lineno">12026</span>&#160;            <span class="keyword">false</span>, <span class="comment">// isCustomPool</span></div><div class="line"><a name="l12027"></a><span class="lineno">12027</span>&#160;            <span class="keyword">false</span>, <span class="comment">// explicitBlockSize</span></div><div class="line"><a name="l12028"></a><span class="lineno">12028</span>&#160;            <span class="keyword">false</span>); <span class="comment">// linearAlgorithm</span></div><div class="line"><a name="l12029"></a><span class="lineno">12029</span>&#160;        <span class="comment">// No need to call m_pBlockVectors[memTypeIndex][blockVectorTypeIndex]-&gt;CreateMinBlocks here,</span></div><div class="line"><a name="l12030"></a><span class="lineno">12030</span>&#160;        <span class="comment">// becase minBlockCount is 0.</span></div><div class="line"><a name="l12031"></a><span class="lineno">12031</span>&#160;        m_pDedicatedAllocations[memTypeIndex] = vma_new(<span class="keyword">this</span>, AllocationVectorType)(VmaStlAllocator&lt;VmaAllocation&gt;(GetAllocationCallbacks()));</div><div class="line"><a name="l12032"></a><span class="lineno">12032</span>&#160;</div><div class="line"><a name="l12033"></a><span class="lineno">12033</span>&#160;    }</div><div class="line"><a name="l12034"></a><span class="lineno">12034</span>&#160;}</div><div class="line"><a name="l12035"></a><span class="lineno">12035</span>&#160;</div><div class="line"><a name="l12036"></a><span class="lineno">12036</span>&#160;VkResult VmaAllocator_T::Init(<span class="keyword">const</span> <a class="code" href="struct_vma_allocator_create_info.html">VmaAllocatorCreateInfo</a>* pCreateInfo)</div><div class="line"><a name="l12037"></a><span class="lineno">12037</span>&#160;{</div><div class="line"><a name="l12038"></a><span class="lineno">12038</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l12039"></a><span class="lineno">12039</span>&#160;</div><div class="line"><a name="l12040"></a><span class="lineno">12040</span>&#160;    <span class="keywordflow">if</span>(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a> != VMA_NULL &amp;&amp;</div><div class="line"><a name="l12041"></a><span class="lineno">12041</span>&#160;        !VmaStrIsEmpty(pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>-&gt;<a class="code" href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">pFilePath</a>))</div><div class="line"><a name="l12042"></a><span class="lineno">12042</span>&#160;    {</div><div class="line"><a name="l12043"></a><span class="lineno">12043</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l12044"></a><span class="lineno">12044</span>&#160;        m_pRecorder = vma_new(<span class="keyword">this</span>, VmaRecorder)();</div><div class="line"><a name="l12045"></a><span class="lineno">12045</span>&#160;        res = m_pRecorder-&gt;Init(*pCreateInfo-&gt;<a class="code" href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">pRecordSettings</a>, m_UseMutex);</div><div class="line"><a name="l12046"></a><span class="lineno">12046</span>&#160;        <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l12047"></a><span class="lineno">12047</span>&#160;        {</div><div class="line"><a name="l12048"></a><span class="lineno">12048</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12049"></a><span class="lineno">12049</span>&#160;        }</div><div class="line"><a name="l12050"></a><span class="lineno">12050</span>&#160;        m_pRecorder-&gt;WriteConfiguration(</div><div class="line"><a name="l12051"></a><span class="lineno">12051</span>&#160;            m_PhysicalDeviceProperties,</div><div class="line"><a name="l12052"></a><span class="lineno">12052</span>&#160;            m_MemProps,</div><div class="line"><a name="l12053"></a><span class="lineno">12053</span>&#160;            m_UseKhrDedicatedAllocation);</div><div class="line"><a name="l12054"></a><span class="lineno">12054</span>&#160;        m_pRecorder-&gt;RecordCreateAllocator(GetCurrentFrameIndex());</div><div class="line"><a name="l12055"></a><span class="lineno">12055</span>&#160;<span class="preprocessor">#else</span></div><div class="line"><a name="l12056"></a><span class="lineno">12056</span>&#160;        VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VmaAllocatorCreateInfo::pRecordSettings used, but not supported due to VMA_RECORDING_ENABLED not defined to 1.&quot;</span>);</div><div class="line"><a name="l12057"></a><span class="lineno">12057</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l12058"></a><span class="lineno">12058</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12059"></a><span class="lineno">12059</span>&#160;    }</div><div class="line"><a name="l12060"></a><span class="lineno">12060</span>&#160;</div><div class="line"><a name="l12061"></a><span class="lineno">12061</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12062"></a><span class="lineno">12062</span>&#160;}</div><div class="line"><a name="l12063"></a><span class="lineno">12063</span>&#160;</div><div class="line"><a name="l12064"></a><span class="lineno">12064</span>&#160;VmaAllocator_T::~VmaAllocator_T()</div><div class="line"><a name="l12065"></a><span class="lineno">12065</span>&#160;{</div><div class="line"><a name="l12066"></a><span class="lineno">12066</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l12067"></a><span class="lineno">12067</span>&#160;    <span class="keywordflow">if</span>(m_pRecorder != VMA_NULL)</div><div class="line"><a name="l12068"></a><span class="lineno">12068</span>&#160;    {</div><div class="line"><a name="l12069"></a><span class="lineno">12069</span>&#160;        m_pRecorder-&gt;RecordDestroyAllocator(GetCurrentFrameIndex());</div><div class="line"><a name="l12070"></a><span class="lineno">12070</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pRecorder);</div><div class="line"><a name="l12071"></a><span class="lineno">12071</span>&#160;    }</div><div class="line"><a name="l12072"></a><span class="lineno">12072</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12073"></a><span class="lineno">12073</span>&#160;    </div><div class="line"><a name="l12074"></a><span class="lineno">12074</span>&#160;    VMA_ASSERT(m_Pools.empty());</div><div class="line"><a name="l12075"></a><span class="lineno">12075</span>&#160;</div><div class="line"><a name="l12076"></a><span class="lineno">12076</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = GetMemoryTypeCount(); i--; )</div><div class="line"><a name="l12077"></a><span class="lineno">12077</span>&#160;    {</div><div class="line"><a name="l12078"></a><span class="lineno">12078</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pDedicatedAllocations[i]);</div><div class="line"><a name="l12079"></a><span class="lineno">12079</span>&#160;        vma_delete(<span class="keyword">this</span>, m_pBlockVectors[i]);</div><div class="line"><a name="l12080"></a><span class="lineno">12080</span>&#160;    }</div><div class="line"><a name="l12081"></a><span class="lineno">12081</span>&#160;}</div><div class="line"><a name="l12082"></a><span class="lineno">12082</span>&#160;</div><div class="line"><a name="l12083"></a><span class="lineno">12083</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="l12084"></a><span class="lineno">12084</span>&#160;{</div><div class="line"><a name="l12085"></a><span class="lineno">12085</span>&#160;<span class="preprocessor">#if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l12086"></a><span class="lineno">12086</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceProperties = &amp;vkGetPhysicalDeviceProperties;</div><div class="line"><a name="l12087"></a><span class="lineno">12087</span>&#160;    m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties = &amp;vkGetPhysicalDeviceMemoryProperties;</div><div class="line"><a name="l12088"></a><span class="lineno">12088</span>&#160;    m_VulkanFunctions.vkAllocateMemory = &amp;vkAllocateMemory;</div><div class="line"><a name="l12089"></a><span class="lineno">12089</span>&#160;    m_VulkanFunctions.vkFreeMemory = &amp;vkFreeMemory;</div><div class="line"><a name="l12090"></a><span class="lineno">12090</span>&#160;    m_VulkanFunctions.vkMapMemory = &amp;vkMapMemory;</div><div class="line"><a name="l12091"></a><span class="lineno">12091</span>&#160;    m_VulkanFunctions.vkUnmapMemory = &amp;vkUnmapMemory;</div><div class="line"><a name="l12092"></a><span class="lineno">12092</span>&#160;    m_VulkanFunctions.vkFlushMappedMemoryRanges = &amp;vkFlushMappedMemoryRanges;</div><div class="line"><a name="l12093"></a><span class="lineno">12093</span>&#160;    m_VulkanFunctions.vkInvalidateMappedMemoryRanges = &amp;vkInvalidateMappedMemoryRanges;</div><div class="line"><a name="l12094"></a><span class="lineno">12094</span>&#160;    m_VulkanFunctions.vkBindBufferMemory = &amp;vkBindBufferMemory;</div><div class="line"><a name="l12095"></a><span class="lineno">12095</span>&#160;    m_VulkanFunctions.vkBindImageMemory = &amp;vkBindImageMemory;</div><div class="line"><a name="l12096"></a><span class="lineno">12096</span>&#160;    m_VulkanFunctions.vkGetBufferMemoryRequirements = &amp;vkGetBufferMemoryRequirements;</div><div class="line"><a name="l12097"></a><span class="lineno">12097</span>&#160;    m_VulkanFunctions.vkGetImageMemoryRequirements = &amp;vkGetImageMemoryRequirements;</div><div class="line"><a name="l12098"></a><span class="lineno">12098</span>&#160;    m_VulkanFunctions.vkCreateBuffer = &amp;vkCreateBuffer;</div><div class="line"><a name="l12099"></a><span class="lineno">12099</span>&#160;    m_VulkanFunctions.vkDestroyBuffer = &amp;vkDestroyBuffer;</div><div class="line"><a name="l12100"></a><span class="lineno">12100</span>&#160;    m_VulkanFunctions.vkCreateImage = &amp;vkCreateImage;</div><div class="line"><a name="l12101"></a><span class="lineno">12101</span>&#160;    m_VulkanFunctions.vkDestroyImage = &amp;vkDestroyImage;</div><div class="line"><a name="l12102"></a><span class="lineno">12102</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12103"></a><span class="lineno">12103</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12104"></a><span class="lineno">12104</span>&#160;    {</div><div class="line"><a name="l12105"></a><span class="lineno">12105</span>&#160;        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =</div><div class="line"><a name="l12106"></a><span class="lineno">12106</span>&#160;            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetBufferMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l12107"></a><span class="lineno">12107</span>&#160;        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =</div><div class="line"><a name="l12108"></a><span class="lineno">12108</span>&#160;            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, <span class="stringliteral">&quot;vkGetImageMemoryRequirements2KHR&quot;</span>);</div><div class="line"><a name="l12109"></a><span class="lineno">12109</span>&#160;    }</div><div class="line"><a name="l12110"></a><span class="lineno">12110</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12111"></a><span class="lineno">12111</span>&#160;<span class="preprocessor">#endif // #if VMA_STATIC_VULKAN_FUNCTIONS == 1</span></div><div class="line"><a name="l12112"></a><span class="lineno">12112</span>&#160;</div><div class="line"><a name="l12113"></a><span class="lineno">12113</span>&#160;<span class="preprocessor">#define VMA_COPY_IF_NOT_NULL(funcName) \</span></div><div class="line"><a name="l12114"></a><span class="lineno">12114</span>&#160;<span class="preprocessor">    if(pVulkanFunctions-&gt;funcName != VMA_NULL) m_VulkanFunctions.funcName = pVulkanFunctions-&gt;funcName;</span></div><div class="line"><a name="l12115"></a><span class="lineno">12115</span>&#160;</div><div class="line"><a name="l12116"></a><span class="lineno">12116</span>&#160;    <span class="keywordflow">if</span>(pVulkanFunctions != VMA_NULL)</div><div class="line"><a name="l12117"></a><span class="lineno">12117</span>&#160;    {</div><div class="line"><a name="l12118"></a><span class="lineno">12118</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceProperties);</div><div class="line"><a name="l12119"></a><span class="lineno">12119</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l12120"></a><span class="lineno">12120</span>&#160;        VMA_COPY_IF_NOT_NULL(vkAllocateMemory);</div><div class="line"><a name="l12121"></a><span class="lineno">12121</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFreeMemory);</div><div class="line"><a name="l12122"></a><span class="lineno">12122</span>&#160;        VMA_COPY_IF_NOT_NULL(vkMapMemory);</div><div class="line"><a name="l12123"></a><span class="lineno">12123</span>&#160;        VMA_COPY_IF_NOT_NULL(vkUnmapMemory);</div><div class="line"><a name="l12124"></a><span class="lineno">12124</span>&#160;        VMA_COPY_IF_NOT_NULL(vkFlushMappedMemoryRanges);</div><div class="line"><a name="l12125"></a><span class="lineno">12125</span>&#160;        VMA_COPY_IF_NOT_NULL(vkInvalidateMappedMemoryRanges);</div><div class="line"><a name="l12126"></a><span class="lineno">12126</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindBufferMemory);</div><div class="line"><a name="l12127"></a><span class="lineno">12127</span>&#160;        VMA_COPY_IF_NOT_NULL(vkBindImageMemory);</div><div class="line"><a name="l12128"></a><span class="lineno">12128</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements);</div><div class="line"><a name="l12129"></a><span class="lineno">12129</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements);</div><div class="line"><a name="l12130"></a><span class="lineno">12130</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateBuffer);</div><div class="line"><a name="l12131"></a><span class="lineno">12131</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);</div><div class="line"><a name="l12132"></a><span class="lineno">12132</span>&#160;        VMA_COPY_IF_NOT_NULL(vkCreateImage);</div><div class="line"><a name="l12133"></a><span class="lineno">12133</span>&#160;        VMA_COPY_IF_NOT_NULL(vkDestroyImage);</div><div class="line"><a name="l12134"></a><span class="lineno">12134</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12135"></a><span class="lineno">12135</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);</div><div class="line"><a name="l12136"></a><span class="lineno">12136</span>&#160;        VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);</div><div class="line"><a name="l12137"></a><span class="lineno">12137</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12138"></a><span class="lineno">12138</span>&#160;    }</div><div class="line"><a name="l12139"></a><span class="lineno">12139</span>&#160;</div><div class="line"><a name="l12140"></a><span class="lineno">12140</span>&#160;<span class="preprocessor">#undef VMA_COPY_IF_NOT_NULL</span></div><div class="line"><a name="l12141"></a><span class="lineno">12141</span>&#160;</div><div class="line"><a name="l12142"></a><span class="lineno">12142</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="l12143"></a><span class="lineno">12143</span>&#160;    <span class="comment">// or pass valid pointers as VmaAllocatorCreateInfo::pVulkanFunctions.</span></div><div class="line"><a name="l12144"></a><span class="lineno">12144</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceProperties != VMA_NULL);</div><div class="line"><a name="l12145"></a><span class="lineno">12145</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties != VMA_NULL);</div><div class="line"><a name="l12146"></a><span class="lineno">12146</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkAllocateMemory != VMA_NULL);</div><div class="line"><a name="l12147"></a><span class="lineno">12147</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFreeMemory != VMA_NULL);</div><div class="line"><a name="l12148"></a><span class="lineno">12148</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkMapMemory != VMA_NULL);</div><div class="line"><a name="l12149"></a><span class="lineno">12149</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkUnmapMemory != VMA_NULL);</div><div class="line"><a name="l12150"></a><span class="lineno">12150</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkFlushMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l12151"></a><span class="lineno">12151</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkInvalidateMappedMemoryRanges != VMA_NULL);</div><div class="line"><a name="l12152"></a><span class="lineno">12152</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory != VMA_NULL);</div><div class="line"><a name="l12153"></a><span class="lineno">12153</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory != VMA_NULL);</div><div class="line"><a name="l12154"></a><span class="lineno">12154</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l12155"></a><span class="lineno">12155</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements != VMA_NULL);</div><div class="line"><a name="l12156"></a><span class="lineno">12156</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateBuffer != VMA_NULL);</div><div class="line"><a name="l12157"></a><span class="lineno">12157</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);</div><div class="line"><a name="l12158"></a><span class="lineno">12158</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);</div><div class="line"><a name="l12159"></a><span class="lineno">12159</span>&#160;    VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);</div><div class="line"><a name="l12160"></a><span class="lineno">12160</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12161"></a><span class="lineno">12161</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12162"></a><span class="lineno">12162</span>&#160;    {</div><div class="line"><a name="l12163"></a><span class="lineno">12163</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l12164"></a><span class="lineno">12164</span>&#160;        VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);</div><div class="line"><a name="l12165"></a><span class="lineno">12165</span>&#160;    }</div><div class="line"><a name="l12166"></a><span class="lineno">12166</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12167"></a><span class="lineno">12167</span>&#160;}</div><div class="line"><a name="l12168"></a><span class="lineno">12168</span>&#160;</div><div class="line"><a name="l12169"></a><span class="lineno">12169</span>&#160;VkDeviceSize VmaAllocator_T::CalcPreferredBlockSize(uint32_t memTypeIndex)</div><div class="line"><a name="l12170"></a><span class="lineno">12170</span>&#160;{</div><div class="line"><a name="l12171"></a><span class="lineno">12171</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l12172"></a><span class="lineno">12172</span>&#160;    <span class="keyword">const</span> VkDeviceSize heapSize = m_MemProps.memoryHeaps[heapIndex].size;</div><div class="line"><a name="l12173"></a><span class="lineno">12173</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="l12174"></a><span class="lineno">12174</span>&#160;    <span class="keywordflow">return</span> isSmallHeap ? (heapSize / 8) : m_PreferredLargeHeapBlockSize;</div><div class="line"><a name="l12175"></a><span class="lineno">12175</span>&#160;}</div><div class="line"><a name="l12176"></a><span class="lineno">12176</span>&#160;</div><div class="line"><a name="l12177"></a><span class="lineno">12177</span>&#160;VkResult VmaAllocator_T::AllocateMemoryOfType(</div><div class="line"><a name="l12178"></a><span class="lineno">12178</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l12179"></a><span class="lineno">12179</span>&#160;    VkDeviceSize alignment,</div><div class="line"><a name="l12180"></a><span class="lineno">12180</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocation,</div><div class="line"><a name="l12181"></a><span class="lineno">12181</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l12182"></a><span class="lineno">12182</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l12183"></a><span class="lineno">12183</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="l12184"></a><span class="lineno">12184</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l12185"></a><span class="lineno">12185</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l12186"></a><span class="lineno">12186</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l12187"></a><span class="lineno">12187</span>&#160;{</div><div class="line"><a name="l12188"></a><span class="lineno">12188</span>&#160;    VMA_ASSERT(pAllocation != VMA_NULL);</div><div class="line"><a name="l12189"></a><span class="lineno">12189</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="l12190"></a><span class="lineno">12190</span>&#160;</div><div class="line"><a name="l12191"></a><span class="lineno">12191</span>&#160;    <a class="code" href="struct_vma_allocation_create_info.html">VmaAllocationCreateInfo</a> finalCreateInfo = createInfo;</div><div class="line"><a name="l12192"></a><span class="lineno">12192</span>&#160;</div><div class="line"><a name="l12193"></a><span class="lineno">12193</span>&#160;    <span class="comment">// If memory type is not HOST_VISIBLE, disable MAPPED.</span></div><div class="line"><a name="l12194"></a><span class="lineno">12194</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="l12195"></a><span class="lineno">12195</span>&#160;        (m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l12196"></a><span class="lineno">12196</span>&#160;    {</div><div class="line"><a name="l12197"></a><span class="lineno">12197</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="l12198"></a><span class="lineno">12198</span>&#160;    }</div><div class="line"><a name="l12199"></a><span class="lineno">12199</span>&#160;</div><div class="line"><a name="l12200"></a><span class="lineno">12200</span>&#160;    VmaBlockVector* <span class="keyword">const</span> blockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12201"></a><span class="lineno">12201</span>&#160;    VMA_ASSERT(blockVector);</div><div class="line"><a name="l12202"></a><span class="lineno">12202</span>&#160;</div><div class="line"><a name="l12203"></a><span class="lineno">12203</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = blockVector-&gt;GetPreferredBlockSize();</div><div class="line"><a name="l12204"></a><span class="lineno">12204</span>&#160;    <span class="keywordtype">bool</span> preferDedicatedMemory =</div><div class="line"><a name="l12205"></a><span class="lineno">12205</span>&#160;        VMA_DEBUG_ALWAYS_DEDICATED_MEMORY ||</div><div class="line"><a name="l12206"></a><span class="lineno">12206</span>&#160;        dedicatedAllocation ||</div><div class="line"><a name="l12207"></a><span class="lineno">12207</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="l12208"></a><span class="lineno">12208</span>&#160;        size &gt; preferredBlockSize / 2;</div><div class="line"><a name="l12209"></a><span class="lineno">12209</span>&#160;</div><div class="line"><a name="l12210"></a><span class="lineno">12210</span>&#160;    <span class="keywordflow">if</span>(preferDedicatedMemory &amp;&amp;</div><div class="line"><a name="l12211"></a><span class="lineno">12211</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="l12212"></a><span class="lineno">12212</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="l12213"></a><span class="lineno">12213</span>&#160;    {</div><div class="line"><a name="l12214"></a><span class="lineno">12214</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="l12215"></a><span class="lineno">12215</span>&#160;    }</div><div class="line"><a name="l12216"></a><span class="lineno">12216</span>&#160;</div><div class="line"><a name="l12217"></a><span class="lineno">12217</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="l12218"></a><span class="lineno">12218</span>&#160;    {</div><div class="line"><a name="l12219"></a><span class="lineno">12219</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="l12220"></a><span class="lineno">12220</span>&#160;        {</div><div class="line"><a name="l12221"></a><span class="lineno">12221</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12222"></a><span class="lineno">12222</span>&#160;        }</div><div class="line"><a name="l12223"></a><span class="lineno">12223</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l12224"></a><span class="lineno">12224</span>&#160;        {</div><div class="line"><a name="l12225"></a><span class="lineno">12225</span>&#160;            <span class="keywordflow">return</span> AllocateDedicatedMemory(</div><div class="line"><a name="l12226"></a><span class="lineno">12226</span>&#160;                size,</div><div class="line"><a name="l12227"></a><span class="lineno">12227</span>&#160;                suballocType,</div><div class="line"><a name="l12228"></a><span class="lineno">12228</span>&#160;                memTypeIndex,</div><div class="line"><a name="l12229"></a><span class="lineno">12229</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="l12230"></a><span class="lineno">12230</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="l12231"></a><span class="lineno">12231</span>&#160;                finalCreateInfo.<a class="code" href="struct_vma_allocation_create_info.html#a8259e85c272683434f4abb4ddddffe19">pUserData</a>,</div><div class="line"><a name="l12232"></a><span class="lineno">12232</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l12233"></a><span class="lineno">12233</span>&#160;                dedicatedImage,</div><div class="line"><a name="l12234"></a><span class="lineno">12234</span>&#160;                pAllocation);</div><div class="line"><a name="l12235"></a><span class="lineno">12235</span>&#160;        }</div><div class="line"><a name="l12236"></a><span class="lineno">12236</span>&#160;    }</div><div class="line"><a name="l12237"></a><span class="lineno">12237</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12238"></a><span class="lineno">12238</span>&#160;    {</div><div class="line"><a name="l12239"></a><span class="lineno">12239</span>&#160;        VkResult res = blockVector-&gt;Allocate(</div><div class="line"><a name="l12240"></a><span class="lineno">12240</span>&#160;            VK_NULL_HANDLE, <span class="comment">// hCurrentPool</span></div><div class="line"><a name="l12241"></a><span class="lineno">12241</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l12242"></a><span class="lineno">12242</span>&#160;            size,</div><div class="line"><a name="l12243"></a><span class="lineno">12243</span>&#160;            alignment,</div><div class="line"><a name="l12244"></a><span class="lineno">12244</span>&#160;            finalCreateInfo,</div><div class="line"><a name="l12245"></a><span class="lineno">12245</span>&#160;            suballocType,</div><div class="line"><a name="l12246"></a><span class="lineno">12246</span>&#160;            pAllocation);</div><div class="line"><a name="l12247"></a><span class="lineno">12247</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12248"></a><span class="lineno">12248</span>&#160;        {</div><div class="line"><a name="l12249"></a><span class="lineno">12249</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12250"></a><span class="lineno">12250</span>&#160;        }</div><div class="line"><a name="l12251"></a><span class="lineno">12251</span>&#160;</div><div class="line"><a name="l12252"></a><span class="lineno">12252</span>&#160;        <span class="comment">// 5. Try dedicated memory.</span></div><div class="line"><a name="l12253"></a><span class="lineno">12253</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="l12254"></a><span class="lineno">12254</span>&#160;        {</div><div class="line"><a name="l12255"></a><span class="lineno">12255</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12256"></a><span class="lineno">12256</span>&#160;        }</div><div class="line"><a name="l12257"></a><span class="lineno">12257</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l12258"></a><span class="lineno">12258</span>&#160;        {</div><div class="line"><a name="l12259"></a><span class="lineno">12259</span>&#160;            res = AllocateDedicatedMemory(</div><div class="line"><a name="l12260"></a><span class="lineno">12260</span>&#160;                size,</div><div class="line"><a name="l12261"></a><span class="lineno">12261</span>&#160;                suballocType,</div><div class="line"><a name="l12262"></a><span class="lineno">12262</span>&#160;                memTypeIndex,</div><div class="line"><a name="l12263"></a><span class="lineno">12263</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="l12264"></a><span class="lineno">12264</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="l12265"></a><span class="lineno">12265</span>&#160;                finalCreateInfo.pUserData,</div><div class="line"><a name="l12266"></a><span class="lineno">12266</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l12267"></a><span class="lineno">12267</span>&#160;                dedicatedImage,</div><div class="line"><a name="l12268"></a><span class="lineno">12268</span>&#160;                pAllocation);</div><div class="line"><a name="l12269"></a><span class="lineno">12269</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12270"></a><span class="lineno">12270</span>&#160;            {</div><div class="line"><a name="l12271"></a><span class="lineno">12271</span>&#160;                <span class="comment">// Succeeded: AllocateDedicatedMemory function already filld pMemory, nothing more to do here.</span></div><div class="line"><a name="l12272"></a><span class="lineno">12272</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated as DedicatedMemory&quot;</span>);</div><div class="line"><a name="l12273"></a><span class="lineno">12273</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12274"></a><span class="lineno">12274</span>&#160;            }</div><div class="line"><a name="l12275"></a><span class="lineno">12275</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l12276"></a><span class="lineno">12276</span>&#160;            {</div><div class="line"><a name="l12277"></a><span class="lineno">12277</span>&#160;                <span class="comment">// Everything failed: Return error code.</span></div><div class="line"><a name="l12278"></a><span class="lineno">12278</span>&#160;                VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l12279"></a><span class="lineno">12279</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12280"></a><span class="lineno">12280</span>&#160;            }</div><div class="line"><a name="l12281"></a><span class="lineno">12281</span>&#160;        }</div><div class="line"><a name="l12282"></a><span class="lineno">12282</span>&#160;    }</div><div class="line"><a name="l12283"></a><span class="lineno">12283</span>&#160;}</div><div class="line"><a name="l12284"></a><span class="lineno">12284</span>&#160;</div><div class="line"><a name="l12285"></a><span class="lineno">12285</span>&#160;VkResult VmaAllocator_T::AllocateDedicatedMemory(</div><div class="line"><a name="l12286"></a><span class="lineno">12286</span>&#160;    VkDeviceSize size,</div><div class="line"><a name="l12287"></a><span class="lineno">12287</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l12288"></a><span class="lineno">12288</span>&#160;    uint32_t memTypeIndex,</div><div class="line"><a name="l12289"></a><span class="lineno">12289</span>&#160;    <span class="keywordtype">bool</span> map,</div><div class="line"><a name="l12290"></a><span class="lineno">12290</span>&#160;    <span class="keywordtype">bool</span> isUserDataString,</div><div class="line"><a name="l12291"></a><span class="lineno">12291</span>&#160;    <span class="keywordtype">void</span>* pUserData,</div><div class="line"><a name="l12292"></a><span class="lineno">12292</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l12293"></a><span class="lineno">12293</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l12294"></a><span class="lineno">12294</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l12295"></a><span class="lineno">12295</span>&#160;{</div><div class="line"><a name="l12296"></a><span class="lineno">12296</span>&#160;    VMA_ASSERT(pAllocation);</div><div class="line"><a name="l12297"></a><span class="lineno">12297</span>&#160;</div><div class="line"><a name="l12298"></a><span class="lineno">12298</span>&#160;    VkMemoryAllocateInfo allocInfo = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO };</div><div class="line"><a name="l12299"></a><span class="lineno">12299</span>&#160;    allocInfo.memoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l12300"></a><span class="lineno">12300</span>&#160;    allocInfo.allocationSize = size;</div><div class="line"><a name="l12301"></a><span class="lineno">12301</span>&#160;</div><div class="line"><a name="l12302"></a><span class="lineno">12302</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12303"></a><span class="lineno">12303</span>&#160;    VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };</div><div class="line"><a name="l12304"></a><span class="lineno">12304</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12305"></a><span class="lineno">12305</span>&#160;    {</div><div class="line"><a name="l12306"></a><span class="lineno">12306</span>&#160;        <span class="keywordflow">if</span>(dedicatedBuffer != VK_NULL_HANDLE)</div><div class="line"><a name="l12307"></a><span class="lineno">12307</span>&#160;        {</div><div class="line"><a name="l12308"></a><span class="lineno">12308</span>&#160;            VMA_ASSERT(dedicatedImage == VK_NULL_HANDLE);</div><div class="line"><a name="l12309"></a><span class="lineno">12309</span>&#160;            dedicatedAllocInfo.buffer = dedicatedBuffer;</div><div class="line"><a name="l12310"></a><span class="lineno">12310</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l12311"></a><span class="lineno">12311</span>&#160;        }</div><div class="line"><a name="l12312"></a><span class="lineno">12312</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span>(dedicatedImage != VK_NULL_HANDLE)</div><div class="line"><a name="l12313"></a><span class="lineno">12313</span>&#160;        {</div><div class="line"><a name="l12314"></a><span class="lineno">12314</span>&#160;            dedicatedAllocInfo.image = dedicatedImage;</div><div class="line"><a name="l12315"></a><span class="lineno">12315</span>&#160;            allocInfo.pNext = &amp;dedicatedAllocInfo;</div><div class="line"><a name="l12316"></a><span class="lineno">12316</span>&#160;        }</div><div class="line"><a name="l12317"></a><span class="lineno">12317</span>&#160;    }</div><div class="line"><a name="l12318"></a><span class="lineno">12318</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12319"></a><span class="lineno">12319</span>&#160;</div><div class="line"><a name="l12320"></a><span class="lineno">12320</span>&#160;    <span class="comment">// Allocate VkDeviceMemory.</span></div><div class="line"><a name="l12321"></a><span class="lineno">12321</span>&#160;    VkDeviceMemory hMemory = VK_NULL_HANDLE;</div><div class="line"><a name="l12322"></a><span class="lineno">12322</span>&#160;    VkResult res = AllocateVulkanMemory(&amp;allocInfo, &amp;hMemory);</div><div class="line"><a name="l12323"></a><span class="lineno">12323</span>&#160;    <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l12324"></a><span class="lineno">12324</span>&#160;    {</div><div class="line"><a name="l12325"></a><span class="lineno">12325</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkAllocateMemory FAILED&quot;</span>);</div><div class="line"><a name="l12326"></a><span class="lineno">12326</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12327"></a><span class="lineno">12327</span>&#160;    }</div><div class="line"><a name="l12328"></a><span class="lineno">12328</span>&#160;</div><div class="line"><a name="l12329"></a><span class="lineno">12329</span>&#160;    <span class="keywordtype">void</span>* pMappedData = VMA_NULL;</div><div class="line"><a name="l12330"></a><span class="lineno">12330</span>&#160;    <span class="keywordflow">if</span>(map)</div><div class="line"><a name="l12331"></a><span class="lineno">12331</span>&#160;    {</div><div class="line"><a name="l12332"></a><span class="lineno">12332</span>&#160;        res = (*m_VulkanFunctions.vkMapMemory)(</div><div class="line"><a name="l12333"></a><span class="lineno">12333</span>&#160;            m_hDevice,</div><div class="line"><a name="l12334"></a><span class="lineno">12334</span>&#160;            hMemory,</div><div class="line"><a name="l12335"></a><span class="lineno">12335</span>&#160;            0,</div><div class="line"><a name="l12336"></a><span class="lineno">12336</span>&#160;            VK_WHOLE_SIZE,</div><div class="line"><a name="l12337"></a><span class="lineno">12337</span>&#160;            0,</div><div class="line"><a name="l12338"></a><span class="lineno">12338</span>&#160;            &amp;pMappedData);</div><div class="line"><a name="l12339"></a><span class="lineno">12339</span>&#160;        <span class="keywordflow">if</span>(res &lt; 0)</div><div class="line"><a name="l12340"></a><span class="lineno">12340</span>&#160;        {</div><div class="line"><a name="l12341"></a><span class="lineno">12341</span>&#160;            VMA_DEBUG_LOG(<span class="stringliteral">&quot;    vkMapMemory FAILED&quot;</span>);</div><div class="line"><a name="l12342"></a><span class="lineno">12342</span>&#160;            FreeVulkanMemory(memTypeIndex, size, hMemory);</div><div class="line"><a name="l12343"></a><span class="lineno">12343</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12344"></a><span class="lineno">12344</span>&#160;        }</div><div class="line"><a name="l12345"></a><span class="lineno">12345</span>&#160;    }</div><div class="line"><a name="l12346"></a><span class="lineno">12346</span>&#160;</div><div class="line"><a name="l12347"></a><span class="lineno">12347</span>&#160;    *pAllocation = vma_new(<span class="keyword">this</span>, VmaAllocation_T)(m_CurrentFrameIndex.load(), isUserDataString);</div><div class="line"><a name="l12348"></a><span class="lineno">12348</span>&#160;    (*pAllocation)-&gt;InitDedicatedAllocation(memTypeIndex, hMemory, suballocType, pMappedData, size);</div><div class="line"><a name="l12349"></a><span class="lineno">12349</span>&#160;    (*pAllocation)-&gt;SetUserData(<span class="keyword">this</span>, pUserData);</div><div class="line"><a name="l12350"></a><span class="lineno">12350</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l12351"></a><span class="lineno">12351</span>&#160;    {</div><div class="line"><a name="l12352"></a><span class="lineno">12352</span>&#160;        FillAllocation(*pAllocation, VMA_ALLOCATION_FILL_PATTERN_CREATED);</div><div class="line"><a name="l12353"></a><span class="lineno">12353</span>&#160;    }</div><div class="line"><a name="l12354"></a><span class="lineno">12354</span>&#160;</div><div class="line"><a name="l12355"></a><span class="lineno">12355</span>&#160;    <span class="comment">// Register it in m_pDedicatedAllocations.</span></div><div class="line"><a name="l12356"></a><span class="lineno">12356</span>&#160;    {</div><div class="line"><a name="l12357"></a><span class="lineno">12357</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l12358"></a><span class="lineno">12358</span>&#160;        AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l12359"></a><span class="lineno">12359</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l12360"></a><span class="lineno">12360</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, *pAllocation);</div><div class="line"><a name="l12361"></a><span class="lineno">12361</span>&#160;    }</div><div class="line"><a name="l12362"></a><span class="lineno">12362</span>&#160;</div><div class="line"><a name="l12363"></a><span class="lineno">12363</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Allocated DedicatedMemory MemoryTypeIndex=#%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l12364"></a><span class="lineno">12364</span>&#160;</div><div class="line"><a name="l12365"></a><span class="lineno">12365</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12366"></a><span class="lineno">12366</span>&#160;}</div><div class="line"><a name="l12367"></a><span class="lineno">12367</span>&#160;</div><div class="line"><a name="l12368"></a><span class="lineno">12368</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetBufferMemoryRequirements(</div><div class="line"><a name="l12369"></a><span class="lineno">12369</span>&#160;    VkBuffer hBuffer,</div><div class="line"><a name="l12370"></a><span class="lineno">12370</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l12371"></a><span class="lineno">12371</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l12372"></a><span class="lineno">12372</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l12373"></a><span class="lineno">12373</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l12374"></a><span class="lineno">12374</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12375"></a><span class="lineno">12375</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12376"></a><span class="lineno">12376</span>&#160;    {</div><div class="line"><a name="l12377"></a><span class="lineno">12377</span>&#160;        VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l12378"></a><span class="lineno">12378</span>&#160;        memReqInfo.buffer = hBuffer;</div><div class="line"><a name="l12379"></a><span class="lineno">12379</span>&#160;</div><div class="line"><a name="l12380"></a><span class="lineno">12380</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l12381"></a><span class="lineno">12381</span>&#160;</div><div class="line"><a name="l12382"></a><span class="lineno">12382</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l12383"></a><span class="lineno">12383</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l12384"></a><span class="lineno">12384</span>&#160;</div><div class="line"><a name="l12385"></a><span class="lineno">12385</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l12386"></a><span class="lineno">12386</span>&#160;</div><div class="line"><a name="l12387"></a><span class="lineno">12387</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l12388"></a><span class="lineno">12388</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l12389"></a><span class="lineno">12389</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l12390"></a><span class="lineno">12390</span>&#160;    }</div><div class="line"><a name="l12391"></a><span class="lineno">12391</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12392"></a><span class="lineno">12392</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12393"></a><span class="lineno">12393</span>&#160;    {</div><div class="line"><a name="l12394"></a><span class="lineno">12394</span>&#160;        (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &amp;memReq);</div><div class="line"><a name="l12395"></a><span class="lineno">12395</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l12396"></a><span class="lineno">12396</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l12397"></a><span class="lineno">12397</span>&#160;    }</div><div class="line"><a name="l12398"></a><span class="lineno">12398</span>&#160;}</div><div class="line"><a name="l12399"></a><span class="lineno">12399</span>&#160;</div><div class="line"><a name="l12400"></a><span class="lineno">12400</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::GetImageMemoryRequirements(</div><div class="line"><a name="l12401"></a><span class="lineno">12401</span>&#160;    VkImage hImage,</div><div class="line"><a name="l12402"></a><span class="lineno">12402</span>&#160;    VkMemoryRequirements&amp; memReq,</div><div class="line"><a name="l12403"></a><span class="lineno">12403</span>&#160;    <span class="keywordtype">bool</span>&amp; requiresDedicatedAllocation,</div><div class="line"><a name="l12404"></a><span class="lineno">12404</span>&#160;    <span class="keywordtype">bool</span>&amp; prefersDedicatedAllocation)<span class="keyword"> const</span></div><div class="line"><a name="l12405"></a><span class="lineno">12405</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l12406"></a><span class="lineno">12406</span>&#160;<span class="preprocessor">#if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12407"></a><span class="lineno">12407</span>&#160;    <span class="keywordflow">if</span>(m_UseKhrDedicatedAllocation)</div><div class="line"><a name="l12408"></a><span class="lineno">12408</span>&#160;    {</div><div class="line"><a name="l12409"></a><span class="lineno">12409</span>&#160;        VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };</div><div class="line"><a name="l12410"></a><span class="lineno">12410</span>&#160;        memReqInfo.image = hImage;</div><div class="line"><a name="l12411"></a><span class="lineno">12411</span>&#160;</div><div class="line"><a name="l12412"></a><span class="lineno">12412</span>&#160;        VkMemoryDedicatedRequirementsKHR memDedicatedReq = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR };</div><div class="line"><a name="l12413"></a><span class="lineno">12413</span>&#160;</div><div class="line"><a name="l12414"></a><span class="lineno">12414</span>&#160;        VkMemoryRequirements2KHR memReq2 = { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR };</div><div class="line"><a name="l12415"></a><span class="lineno">12415</span>&#160;        memReq2.pNext = &amp;memDedicatedReq;</div><div class="line"><a name="l12416"></a><span class="lineno">12416</span>&#160;</div><div class="line"><a name="l12417"></a><span class="lineno">12417</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements2KHR)(m_hDevice, &amp;memReqInfo, &amp;memReq2);</div><div class="line"><a name="l12418"></a><span class="lineno">12418</span>&#160;</div><div class="line"><a name="l12419"></a><span class="lineno">12419</span>&#160;        memReq = memReq2.memoryRequirements;</div><div class="line"><a name="l12420"></a><span class="lineno">12420</span>&#160;        requiresDedicatedAllocation = (memDedicatedReq.requiresDedicatedAllocation != VK_FALSE);</div><div class="line"><a name="l12421"></a><span class="lineno">12421</span>&#160;        prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);</div><div class="line"><a name="l12422"></a><span class="lineno">12422</span>&#160;    }</div><div class="line"><a name="l12423"></a><span class="lineno">12423</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12424"></a><span class="lineno">12424</span>&#160;<span class="preprocessor">#endif // #if VMA_DEDICATED_ALLOCATION</span></div><div class="line"><a name="l12425"></a><span class="lineno">12425</span>&#160;    {</div><div class="line"><a name="l12426"></a><span class="lineno">12426</span>&#160;        (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &amp;memReq);</div><div class="line"><a name="l12427"></a><span class="lineno">12427</span>&#160;        requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l12428"></a><span class="lineno">12428</span>&#160;        prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l12429"></a><span class="lineno">12429</span>&#160;    }</div><div class="line"><a name="l12430"></a><span class="lineno">12430</span>&#160;}</div><div class="line"><a name="l12431"></a><span class="lineno">12431</span>&#160;</div><div class="line"><a name="l12432"></a><span class="lineno">12432</span>&#160;VkResult VmaAllocator_T::AllocateMemory(</div><div class="line"><a name="l12433"></a><span class="lineno">12433</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements&amp; vkMemReq,</div><div class="line"><a name="l12434"></a><span class="lineno">12434</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation,</div><div class="line"><a name="l12435"></a><span class="lineno">12435</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation,</div><div class="line"><a name="l12436"></a><span class="lineno">12436</span>&#160;    VkBuffer dedicatedBuffer,</div><div class="line"><a name="l12437"></a><span class="lineno">12437</span>&#160;    VkImage dedicatedImage,</div><div class="line"><a name="l12438"></a><span class="lineno">12438</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="l12439"></a><span class="lineno">12439</span>&#160;    VmaSuballocationType suballocType,</div><div class="line"><a name="l12440"></a><span class="lineno">12440</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l12441"></a><span class="lineno">12441</span>&#160;{</div><div class="line"><a name="l12442"></a><span class="lineno">12442</span>&#160;    VMA_ASSERT(VmaIsPow2(vkMemReq.alignment));</div><div class="line"><a name="l12443"></a><span class="lineno">12443</span>&#160;</div><div class="line"><a name="l12444"></a><span class="lineno">12444</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="l12445"></a><span class="lineno">12445</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="l12446"></a><span class="lineno">12446</span>&#160;    {</div><div class="line"><a name="l12447"></a><span class="lineno">12447</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="l12448"></a><span class="lineno">12448</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12449"></a><span class="lineno">12449</span>&#160;    }</div><div class="line"><a name="l12450"></a><span class="lineno">12450</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="l12451"></a><span class="lineno">12451</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="l12452"></a><span class="lineno">12452</span>&#160;    {</div><div class="line"><a name="l12453"></a><span class="lineno">12453</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="l12454"></a><span class="lineno">12454</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12455"></a><span class="lineno">12455</span>&#160;    }</div><div class="line"><a name="l12456"></a><span class="lineno">12456</span>&#160;    <span class="keywordflow">if</span>(requiresDedicatedAllocation)</div><div class="line"><a name="l12457"></a><span class="lineno">12457</span>&#160;    {</div><div class="line"><a name="l12458"></a><span class="lineno">12458</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="l12459"></a><span class="lineno">12459</span>&#160;        {</div><div class="line"><a name="l12460"></a><span class="lineno">12460</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="l12461"></a><span class="lineno">12461</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12462"></a><span class="lineno">12462</span>&#160;        }</div><div class="line"><a name="l12463"></a><span class="lineno">12463</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="l12464"></a><span class="lineno">12464</span>&#160;        {</div><div class="line"><a name="l12465"></a><span class="lineno">12465</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="l12466"></a><span class="lineno">12466</span>&#160;            <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12467"></a><span class="lineno">12467</span>&#160;        }</div><div class="line"><a name="l12468"></a><span class="lineno">12468</span>&#160;    }</div><div class="line"><a name="l12469"></a><span class="lineno">12469</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="l12470"></a><span class="lineno">12470</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="l12471"></a><span class="lineno">12471</span>&#160;    {</div><div class="line"><a name="l12472"></a><span class="lineno">12472</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="l12473"></a><span class="lineno">12473</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12474"></a><span class="lineno">12474</span>&#160;    }</div><div class="line"><a name="l12475"></a><span class="lineno">12475</span>&#160;</div><div class="line"><a name="l12476"></a><span class="lineno">12476</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="l12477"></a><span class="lineno">12477</span>&#160;    {</div><div class="line"><a name="l12478"></a><span class="lineno">12478</span>&#160;        <span class="keyword">const</span> VkDeviceSize alignmentForPool = VMA_MAX(</div><div class="line"><a name="l12479"></a><span class="lineno">12479</span>&#160;            vkMemReq.alignment,</div><div class="line"><a name="l12480"></a><span class="lineno">12480</span>&#160;            GetMemoryTypeMinAlignment(createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>-&gt;m_BlockVector.GetMemoryTypeIndex()));</div><div class="line"><a name="l12481"></a><span class="lineno">12481</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="l12482"></a><span class="lineno">12482</span>&#160;            createInfo.<a class="code" href="struct_vma_allocation_create_info.html#a6272c0555cfd1fe28bff1afeb6190150">pool</a>,</div><div class="line"><a name="l12483"></a><span class="lineno">12483</span>&#160;            m_CurrentFrameIndex.load(),</div><div class="line"><a name="l12484"></a><span class="lineno">12484</span>&#160;            vkMemReq.size,</div><div class="line"><a name="l12485"></a><span class="lineno">12485</span>&#160;            alignmentForPool,</div><div class="line"><a name="l12486"></a><span class="lineno">12486</span>&#160;            createInfo,</div><div class="line"><a name="l12487"></a><span class="lineno">12487</span>&#160;            suballocType,</div><div class="line"><a name="l12488"></a><span class="lineno">12488</span>&#160;            pAllocation);</div><div class="line"><a name="l12489"></a><span class="lineno">12489</span>&#160;    }</div><div class="line"><a name="l12490"></a><span class="lineno">12490</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12491"></a><span class="lineno">12491</span>&#160;    {</div><div class="line"><a name="l12492"></a><span class="lineno">12492</span>&#160;        <span class="comment">// Bit mask of memory Vulkan types acceptable for this allocation.</span></div><div class="line"><a name="l12493"></a><span class="lineno">12493</span>&#160;        uint32_t memoryTypeBits = vkMemReq.memoryTypeBits;</div><div class="line"><a name="l12494"></a><span class="lineno">12494</span>&#160;        uint32_t memTypeIndex = UINT32_MAX;</div><div class="line"><a name="l12495"></a><span class="lineno">12495</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="l12496"></a><span class="lineno">12496</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12497"></a><span class="lineno">12497</span>&#160;        {</div><div class="line"><a name="l12498"></a><span class="lineno">12498</span>&#160;            VkDeviceSize alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l12499"></a><span class="lineno">12499</span>&#160;                vkMemReq.alignment,</div><div class="line"><a name="l12500"></a><span class="lineno">12500</span>&#160;                GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l12501"></a><span class="lineno">12501</span>&#160;</div><div class="line"><a name="l12502"></a><span class="lineno">12502</span>&#160;            res = AllocateMemoryOfType(</div><div class="line"><a name="l12503"></a><span class="lineno">12503</span>&#160;                vkMemReq.size,</div><div class="line"><a name="l12504"></a><span class="lineno">12504</span>&#160;                alignmentForMemType,</div><div class="line"><a name="l12505"></a><span class="lineno">12505</span>&#160;                requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l12506"></a><span class="lineno">12506</span>&#160;                dedicatedBuffer,</div><div class="line"><a name="l12507"></a><span class="lineno">12507</span>&#160;                dedicatedImage,</div><div class="line"><a name="l12508"></a><span class="lineno">12508</span>&#160;                createInfo,</div><div class="line"><a name="l12509"></a><span class="lineno">12509</span>&#160;                memTypeIndex,</div><div class="line"><a name="l12510"></a><span class="lineno">12510</span>&#160;                suballocType,</div><div class="line"><a name="l12511"></a><span class="lineno">12511</span>&#160;                pAllocation);</div><div class="line"><a name="l12512"></a><span class="lineno">12512</span>&#160;            <span class="comment">// Succeeded on first try.</span></div><div class="line"><a name="l12513"></a><span class="lineno">12513</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12514"></a><span class="lineno">12514</span>&#160;            {</div><div class="line"><a name="l12515"></a><span class="lineno">12515</span>&#160;                <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12516"></a><span class="lineno">12516</span>&#160;            }</div><div class="line"><a name="l12517"></a><span class="lineno">12517</span>&#160;            <span class="comment">// Allocation from this memory type failed. Try other compatible memory types.</span></div><div class="line"><a name="l12518"></a><span class="lineno">12518</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l12519"></a><span class="lineno">12519</span>&#160;            {</div><div class="line"><a name="l12520"></a><span class="lineno">12520</span>&#160;                <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12521"></a><span class="lineno">12521</span>&#160;                {</div><div class="line"><a name="l12522"></a><span class="lineno">12522</span>&#160;                    <span class="comment">// Remove old memTypeIndex from list of possibilities.</span></div><div class="line"><a name="l12523"></a><span class="lineno">12523</span>&#160;                    memoryTypeBits &amp;= ~(1u &lt;&lt; memTypeIndex);</div><div class="line"><a name="l12524"></a><span class="lineno">12524</span>&#160;                    <span class="comment">// Find alternative memTypeIndex.</span></div><div class="line"><a name="l12525"></a><span class="lineno">12525</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="l12526"></a><span class="lineno">12526</span>&#160;                    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12527"></a><span class="lineno">12527</span>&#160;                    {</div><div class="line"><a name="l12528"></a><span class="lineno">12528</span>&#160;                        alignmentForMemType = VMA_MAX(</div><div class="line"><a name="l12529"></a><span class="lineno">12529</span>&#160;                            vkMemReq.alignment,</div><div class="line"><a name="l12530"></a><span class="lineno">12530</span>&#160;                            GetMemoryTypeMinAlignment(memTypeIndex));</div><div class="line"><a name="l12531"></a><span class="lineno">12531</span>&#160;                        </div><div class="line"><a name="l12532"></a><span class="lineno">12532</span>&#160;                        res = AllocateMemoryOfType(</div><div class="line"><a name="l12533"></a><span class="lineno">12533</span>&#160;                            vkMemReq.size,</div><div class="line"><a name="l12534"></a><span class="lineno">12534</span>&#160;                            alignmentForMemType,</div><div class="line"><a name="l12535"></a><span class="lineno">12535</span>&#160;                            requiresDedicatedAllocation || prefersDedicatedAllocation,</div><div class="line"><a name="l12536"></a><span class="lineno">12536</span>&#160;                            dedicatedBuffer,</div><div class="line"><a name="l12537"></a><span class="lineno">12537</span>&#160;                            dedicatedImage,</div><div class="line"><a name="l12538"></a><span class="lineno">12538</span>&#160;                            createInfo,</div><div class="line"><a name="l12539"></a><span class="lineno">12539</span>&#160;                            memTypeIndex,</div><div class="line"><a name="l12540"></a><span class="lineno">12540</span>&#160;                            suballocType,</div><div class="line"><a name="l12541"></a><span class="lineno">12541</span>&#160;                            pAllocation);</div><div class="line"><a name="l12542"></a><span class="lineno">12542</span>&#160;                        <span class="comment">// Allocation from this alternative memory type succeeded.</span></div><div class="line"><a name="l12543"></a><span class="lineno">12543</span>&#160;                        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l12544"></a><span class="lineno">12544</span>&#160;                        {</div><div class="line"><a name="l12545"></a><span class="lineno">12545</span>&#160;                            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12546"></a><span class="lineno">12546</span>&#160;                        }</div><div class="line"><a name="l12547"></a><span class="lineno">12547</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="l12548"></a><span class="lineno">12548</span>&#160;                    }</div><div class="line"><a name="l12549"></a><span class="lineno">12549</span>&#160;                    <span class="comment">// No other matching memory type index could be found.</span></div><div class="line"><a name="l12550"></a><span class="lineno">12550</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l12551"></a><span class="lineno">12551</span>&#160;                    {</div><div class="line"><a name="l12552"></a><span class="lineno">12552</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="l12553"></a><span class="lineno">12553</span>&#160;                        <span class="keywordflow">return</span> VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l12554"></a><span class="lineno">12554</span>&#160;                    }</div><div class="line"><a name="l12555"></a><span class="lineno">12555</span>&#160;                }</div><div class="line"><a name="l12556"></a><span class="lineno">12556</span>&#160;            }</div><div class="line"><a name="l12557"></a><span class="lineno">12557</span>&#160;        }</div><div class="line"><a name="l12558"></a><span class="lineno">12558</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="l12559"></a><span class="lineno">12559</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l12560"></a><span class="lineno">12560</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12561"></a><span class="lineno">12561</span>&#160;    }</div><div class="line"><a name="l12562"></a><span class="lineno">12562</span>&#160;}</div><div class="line"><a name="l12563"></a><span class="lineno">12563</span>&#160;</div><div class="line"><a name="l12564"></a><span class="lineno">12564</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="l12565"></a><span class="lineno">12565</span>&#160;{</div><div class="line"><a name="l12566"></a><span class="lineno">12566</span>&#160;    VMA_ASSERT(allocation);</div><div class="line"><a name="l12567"></a><span class="lineno">12567</span>&#160;</div><div class="line"><a name="l12568"></a><span class="lineno">12568</span>&#160;    <span class="keywordflow">if</span>(TouchAllocation(allocation))</div><div class="line"><a name="l12569"></a><span class="lineno">12569</span>&#160;    {</div><div class="line"><a name="l12570"></a><span class="lineno">12570</span>&#160;        <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS)</div><div class="line"><a name="l12571"></a><span class="lineno">12571</span>&#160;        {</div><div class="line"><a name="l12572"></a><span class="lineno">12572</span>&#160;            FillAllocation(allocation, VMA_ALLOCATION_FILL_PATTERN_DESTROYED);</div><div class="line"><a name="l12573"></a><span class="lineno">12573</span>&#160;        }</div><div class="line"><a name="l12574"></a><span class="lineno">12574</span>&#160;</div><div class="line"><a name="l12575"></a><span class="lineno">12575</span>&#160;        <span class="keywordflow">switch</span>(allocation-&gt;GetType())</div><div class="line"><a name="l12576"></a><span class="lineno">12576</span>&#160;        {</div><div class="line"><a name="l12577"></a><span class="lineno">12577</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l12578"></a><span class="lineno">12578</span>&#160;            {</div><div class="line"><a name="l12579"></a><span class="lineno">12579</span>&#160;                VmaBlockVector* pBlockVector = VMA_NULL;</div><div class="line"><a name="l12580"></a><span class="lineno">12580</span>&#160;                <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool = allocation-&gt;GetPool();</div><div class="line"><a name="l12581"></a><span class="lineno">12581</span>&#160;                <span class="keywordflow">if</span>(hPool != VK_NULL_HANDLE)</div><div class="line"><a name="l12582"></a><span class="lineno">12582</span>&#160;                {</div><div class="line"><a name="l12583"></a><span class="lineno">12583</span>&#160;                    pBlockVector = &amp;hPool-&gt;m_BlockVector;</div><div class="line"><a name="l12584"></a><span class="lineno">12584</span>&#160;                }</div><div class="line"><a name="l12585"></a><span class="lineno">12585</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l12586"></a><span class="lineno">12586</span>&#160;                {</div><div class="line"><a name="l12587"></a><span class="lineno">12587</span>&#160;                    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l12588"></a><span class="lineno">12588</span>&#160;                    pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12589"></a><span class="lineno">12589</span>&#160;                }</div><div class="line"><a name="l12590"></a><span class="lineno">12590</span>&#160;                pBlockVector-&gt;Free(allocation);</div><div class="line"><a name="l12591"></a><span class="lineno">12591</span>&#160;            }</div><div class="line"><a name="l12592"></a><span class="lineno">12592</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l12593"></a><span class="lineno">12593</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l12594"></a><span class="lineno">12594</span>&#160;            FreeDedicatedMemory(allocation);</div><div class="line"><a name="l12595"></a><span class="lineno">12595</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l12596"></a><span class="lineno">12596</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l12597"></a><span class="lineno">12597</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l12598"></a><span class="lineno">12598</span>&#160;        }</div><div class="line"><a name="l12599"></a><span class="lineno">12599</span>&#160;    }</div><div class="line"><a name="l12600"></a><span class="lineno">12600</span>&#160;</div><div class="line"><a name="l12601"></a><span class="lineno">12601</span>&#160;    allocation-&gt;SetUserData(<span class="keyword">this</span>, VMA_NULL);</div><div class="line"><a name="l12602"></a><span class="lineno">12602</span>&#160;    vma_delete(<span class="keyword">this</span>, allocation);</div><div class="line"><a name="l12603"></a><span class="lineno">12603</span>&#160;}</div><div class="line"><a name="l12604"></a><span class="lineno">12604</span>&#160;</div><div class="line"><a name="l12605"></a><span class="lineno">12605</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="l12606"></a><span class="lineno">12606</span>&#160;{</div><div class="line"><a name="l12607"></a><span class="lineno">12607</span>&#160;    <span class="comment">// Initialize.</span></div><div class="line"><a name="l12608"></a><span class="lineno">12608</span>&#160;    InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l12609"></a><span class="lineno">12609</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="l12610"></a><span class="lineno">12610</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l12611"></a><span class="lineno">12611</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="l12612"></a><span class="lineno">12612</span>&#160;        InitStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l12613"></a><span class="lineno">12613</span>&#160;    </div><div class="line"><a name="l12614"></a><span class="lineno">12614</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l12615"></a><span class="lineno">12615</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l12616"></a><span class="lineno">12616</span>&#160;    {</div><div class="line"><a name="l12617"></a><span class="lineno">12617</span>&#160;        VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12618"></a><span class="lineno">12618</span>&#160;        VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l12619"></a><span class="lineno">12619</span>&#160;        pBlockVector-&gt;AddStats(pStats);</div><div class="line"><a name="l12620"></a><span class="lineno">12620</span>&#160;    }</div><div class="line"><a name="l12621"></a><span class="lineno">12621</span>&#160;</div><div class="line"><a name="l12622"></a><span class="lineno">12622</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l12623"></a><span class="lineno">12623</span>&#160;    {</div><div class="line"><a name="l12624"></a><span class="lineno">12624</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l12625"></a><span class="lineno">12625</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="l12626"></a><span class="lineno">12626</span>&#160;        {</div><div class="line"><a name="l12627"></a><span class="lineno">12627</span>&#160;            m_Pools[poolIndex]-&gt;m_BlockVector.AddStats(pStats);</div><div class="line"><a name="l12628"></a><span class="lineno">12628</span>&#160;        }</div><div class="line"><a name="l12629"></a><span class="lineno">12629</span>&#160;    }</div><div class="line"><a name="l12630"></a><span class="lineno">12630</span>&#160;</div><div class="line"><a name="l12631"></a><span class="lineno">12631</span>&#160;    <span class="comment">// Process dedicated allocations.</span></div><div class="line"><a name="l12632"></a><span class="lineno">12632</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l12633"></a><span class="lineno">12633</span>&#160;    {</div><div class="line"><a name="l12634"></a><span class="lineno">12634</span>&#160;        <span class="keyword">const</span> uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);</div><div class="line"><a name="l12635"></a><span class="lineno">12635</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l12636"></a><span class="lineno">12636</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l12637"></a><span class="lineno">12637</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l12638"></a><span class="lineno">12638</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="l12639"></a><span class="lineno">12639</span>&#160;        {</div><div class="line"><a name="l12640"></a><span class="lineno">12640</span>&#160;            <a class="code" href="struct_vma_stat_info.html">VmaStatInfo</a> allocationStatInfo;</div><div class="line"><a name="l12641"></a><span class="lineno">12641</span>&#160;            (*pDedicatedAllocVector)[allocIndex]-&gt;DedicatedAllocCalcStatsInfo(allocationStatInfo);</div><div class="line"><a name="l12642"></a><span class="lineno">12642</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>, allocationStatInfo);</div><div class="line"><a name="l12643"></a><span class="lineno">12643</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[memTypeIndex], allocationStatInfo);</div><div class="line"><a name="l12644"></a><span class="lineno">12644</span>&#160;            VmaAddStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[memHeapIndex], allocationStatInfo);</div><div class="line"><a name="l12645"></a><span class="lineno">12645</span>&#160;        }</div><div class="line"><a name="l12646"></a><span class="lineno">12646</span>&#160;    }</div><div class="line"><a name="l12647"></a><span class="lineno">12647</span>&#160;</div><div class="line"><a name="l12648"></a><span class="lineno">12648</span>&#160;    <span class="comment">// Postprocess.</span></div><div class="line"><a name="l12649"></a><span class="lineno">12649</span>&#160;    VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l12650"></a><span class="lineno">12650</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="l12651"></a><span class="lineno">12651</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[i]);</div><div class="line"><a name="l12652"></a><span class="lineno">12652</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="l12653"></a><span class="lineno">12653</span>&#160;        VmaPostprocessCalcStatInfo(pStats-&gt;<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[i]);</div><div class="line"><a name="l12654"></a><span class="lineno">12654</span>&#160;}</div><div class="line"><a name="l12655"></a><span class="lineno">12655</span>&#160;</div><div class="line"><a name="l12656"></a><span class="lineno">12656</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="l12657"></a><span class="lineno">12657</span>&#160;</div><div class="line"><a name="l12658"></a><span class="lineno">12658</span>&#160;VkResult VmaAllocator_T::DefragmentationBegin(</div><div class="line"><a name="l12659"></a><span class="lineno">12659</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>&amp; info,</div><div class="line"><a name="l12660"></a><span class="lineno">12660</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l12661"></a><span class="lineno">12661</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a>* pContext)</div><div class="line"><a name="l12662"></a><span class="lineno">12662</span>&#160;{</div><div class="line"><a name="l12663"></a><span class="lineno">12663</span>&#160;    <span class="keywordflow">if</span>(info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> != VMA_NULL)</div><div class="line"><a name="l12664"></a><span class="lineno">12664</span>&#160;    {</div><div class="line"><a name="l12665"></a><span class="lineno">12665</span>&#160;        memset(info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>, 0, info.<a class="code" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">allocationCount</a> * <span class="keyword">sizeof</span>(VkBool32));</div><div class="line"><a name="l12666"></a><span class="lineno">12666</span>&#160;    }</div><div class="line"><a name="l12667"></a><span class="lineno">12667</span>&#160;    <span class="keywordflow">if</span>(pStats != VMA_NULL)</div><div class="line"><a name="l12668"></a><span class="lineno">12668</span>&#160;    {</div><div class="line"><a name="l12669"></a><span class="lineno">12669</span>&#160;        memset(pStats, 0, <span class="keyword">sizeof</span>(<a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>));</div><div class="line"><a name="l12670"></a><span class="lineno">12670</span>&#160;    }</div><div class="line"><a name="l12671"></a><span class="lineno">12671</span>&#160;</div><div class="line"><a name="l12672"></a><span class="lineno">12672</span>&#160;    <span class="keyword">const</span> uint32_t currentFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12673"></a><span class="lineno">12673</span>&#160;</div><div class="line"><a name="l12674"></a><span class="lineno">12674</span>&#160;    VmaMutexLock poolsLock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l12675"></a><span class="lineno">12675</span>&#160;</div><div class="line"><a name="l12676"></a><span class="lineno">12676</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l12677"></a><span class="lineno">12677</span>&#160;</div><div class="line"><a name="l12678"></a><span class="lineno">12678</span>&#160;    <span class="comment">// Dispatch pAllocations among defragmentators. Create them in BlockVectors when necessary.</span></div><div class="line"><a name="l12679"></a><span class="lineno">12679</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> allocIndex = 0; allocIndex &lt; info.<a class="code" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">allocationCount</a>; ++allocIndex)</div><div class="line"><a name="l12680"></a><span class="lineno">12680</span>&#160;    {</div><div class="line"><a name="l12681"></a><span class="lineno">12681</span>&#160;        <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAlloc = info.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a>[allocIndex];</div><div class="line"><a name="l12682"></a><span class="lineno">12682</span>&#160;        VMA_ASSERT(hAlloc);</div><div class="line"><a name="l12683"></a><span class="lineno">12683</span>&#160;        <span class="keyword">const</span> uint32_t memTypeIndex = hAlloc-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l12684"></a><span class="lineno">12684</span>&#160;        <span class="comment">// DedicatedAlloc cannot be defragmented.</span></div><div class="line"><a name="l12685"></a><span class="lineno">12685</span>&#160;        <span class="keyword">const</span> VkMemoryPropertyFlags requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l12686"></a><span class="lineno">12686</span>&#160;        <span class="keywordflow">if</span>((hAlloc-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &amp;&amp;</div><div class="line"><a name="l12687"></a><span class="lineno">12687</span>&#160;            <span class="comment">// Only HOST_VISIBLE and HOST_COHERENT memory types can be defragmented.</span></div><div class="line"><a name="l12688"></a><span class="lineno">12688</span>&#160;            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags &amp; requiredMemFlags) == requiredMemFlags) &amp;&amp;</div><div class="line"><a name="l12689"></a><span class="lineno">12689</span>&#160;            <span class="comment">// Lost allocation cannot be defragmented.</span></div><div class="line"><a name="l12690"></a><span class="lineno">12690</span>&#160;            (hAlloc-&gt;GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))</div><div class="line"><a name="l12691"></a><span class="lineno">12691</span>&#160;        {</div><div class="line"><a name="l12692"></a><span class="lineno">12692</span>&#160;            VmaBlockVector* pAllocBlockVector = VMA_NULL;</div><div class="line"><a name="l12693"></a><span class="lineno">12693</span>&#160;</div><div class="line"><a name="l12694"></a><span class="lineno">12694</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="l12695"></a><span class="lineno">12695</span>&#160;            <span class="comment">// This allocation belongs to custom pool.</span></div><div class="line"><a name="l12696"></a><span class="lineno">12696</span>&#160;            <span class="keywordflow">if</span>(hAllocPool != VK_NULL_HANDLE)</div><div class="line"><a name="l12697"></a><span class="lineno">12697</span>&#160;            {</div><div class="line"><a name="l12698"></a><span class="lineno">12698</span>&#160;                <span class="comment">// Pools with linear or buddy algorithm are not defragmented.</span></div><div class="line"><a name="l12699"></a><span class="lineno">12699</span>&#160;                <span class="keywordflow">if</span>(hAllocPool-&gt;m_BlockVector.GetAlgorithm() == 0)</div><div class="line"><a name="l12700"></a><span class="lineno">12700</span>&#160;                {</div><div class="line"><a name="l12701"></a><span class="lineno">12701</span>&#160;                    pAllocBlockVector = &amp;hAllocPool-&gt;m_BlockVector;</div><div class="line"><a name="l12702"></a><span class="lineno">12702</span>&#160;                }</div><div class="line"><a name="l12703"></a><span class="lineno">12703</span>&#160;            }</div><div class="line"><a name="l12704"></a><span class="lineno">12704</span>&#160;            <span class="comment">// This allocation belongs to general pool.</span></div><div class="line"><a name="l12705"></a><span class="lineno">12705</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l12706"></a><span class="lineno">12706</span>&#160;            {</div><div class="line"><a name="l12707"></a><span class="lineno">12707</span>&#160;                pAllocBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12708"></a><span class="lineno">12708</span>&#160;            }</div><div class="line"><a name="l12709"></a><span class="lineno">12709</span>&#160;</div><div class="line"><a name="l12710"></a><span class="lineno">12710</span>&#160;            <span class="keywordflow">if</span>(pAllocBlockVector != VMA_NULL)</div><div class="line"><a name="l12711"></a><span class="lineno">12711</span>&#160;            {</div><div class="line"><a name="l12712"></a><span class="lineno">12712</span>&#160;                VmaDefragmentator* <span class="keyword">const</span> pDefragmentator =</div><div class="line"><a name="l12713"></a><span class="lineno">12713</span>&#160;                    pAllocBlockVector-&gt;EnsureDefragmentator(<span class="keyword">this</span>, currentFrameIndex);</div><div class="line"><a name="l12714"></a><span class="lineno">12714</span>&#160;                VkBool32* <span class="keyword">const</span> pChanged = (info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> != VMA_NULL) ?</div><div class="line"><a name="l12715"></a><span class="lineno">12715</span>&#160;                    &amp;info.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a>[allocIndex] : VMA_NULL;</div><div class="line"><a name="l12716"></a><span class="lineno">12716</span>&#160;                pDefragmentator-&gt;AddAllocation(hAlloc, pChanged);</div><div class="line"><a name="l12717"></a><span class="lineno">12717</span>&#160;            }</div><div class="line"><a name="l12718"></a><span class="lineno">12718</span>&#160;        }</div><div class="line"><a name="l12719"></a><span class="lineno">12719</span>&#160;    }</div><div class="line"><a name="l12720"></a><span class="lineno">12720</span>&#160;</div><div class="line"><a name="l12721"></a><span class="lineno">12721</span>&#160;    VkResult result = VK_SUCCESS;</div><div class="line"><a name="l12722"></a><span class="lineno">12722</span>&#160;</div><div class="line"><a name="l12723"></a><span class="lineno">12723</span>&#160;    <span class="comment">// ======== Main processing.</span></div><div class="line"><a name="l12724"></a><span class="lineno">12724</span>&#160;</div><div class="line"><a name="l12725"></a><span class="lineno">12725</span>&#160;    VkDeviceSize maxBytesToMove = info.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a>;</div><div class="line"><a name="l12726"></a><span class="lineno">12726</span>&#160;    uint32_t maxAllocationsToMove = info.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a>;</div><div class="line"><a name="l12727"></a><span class="lineno">12727</span>&#160;</div><div class="line"><a name="l12728"></a><span class="lineno">12728</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l12729"></a><span class="lineno">12729</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0;</div><div class="line"><a name="l12730"></a><span class="lineno">12730</span>&#160;        (memTypeIndex &lt; GetMemoryTypeCount()) &amp;&amp; (result == VK_SUCCESS);</div><div class="line"><a name="l12731"></a><span class="lineno">12731</span>&#160;        ++memTypeIndex)</div><div class="line"><a name="l12732"></a><span class="lineno">12732</span>&#160;    {</div><div class="line"><a name="l12733"></a><span class="lineno">12733</span>&#160;        <span class="comment">// Only HOST_VISIBLE memory types can be defragmented.</span></div><div class="line"><a name="l12734"></a><span class="lineno">12734</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="l12735"></a><span class="lineno">12735</span>&#160;        {</div><div class="line"><a name="l12736"></a><span class="lineno">12736</span>&#160;            result = m_pBlockVectors[memTypeIndex]-&gt;Defragment(</div><div class="line"><a name="l12737"></a><span class="lineno">12737</span>&#160;                pStats,</div><div class="line"><a name="l12738"></a><span class="lineno">12738</span>&#160;                maxBytesToMove,</div><div class="line"><a name="l12739"></a><span class="lineno">12739</span>&#160;                maxAllocationsToMove);</div><div class="line"><a name="l12740"></a><span class="lineno">12740</span>&#160;        }</div><div class="line"><a name="l12741"></a><span class="lineno">12741</span>&#160;    }</div><div class="line"><a name="l12742"></a><span class="lineno">12742</span>&#160;</div><div class="line"><a name="l12743"></a><span class="lineno">12743</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l12744"></a><span class="lineno">12744</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="l12745"></a><span class="lineno">12745</span>&#160;    {</div><div class="line"><a name="l12746"></a><span class="lineno">12746</span>&#160;        result = m_Pools[poolIndex]-&gt;m_BlockVector.Defragment(</div><div class="line"><a name="l12747"></a><span class="lineno">12747</span>&#160;            pStats,</div><div class="line"><a name="l12748"></a><span class="lineno">12748</span>&#160;            maxBytesToMove,</div><div class="line"><a name="l12749"></a><span class="lineno">12749</span>&#160;            maxAllocationsToMove);</div><div class="line"><a name="l12750"></a><span class="lineno">12750</span>&#160;    }</div><div class="line"><a name="l12751"></a><span class="lineno">12751</span>&#160;</div><div class="line"><a name="l12752"></a><span class="lineno">12752</span>&#160;    <span class="comment">// ========  Destroy defragmentators.</span></div><div class="line"><a name="l12753"></a><span class="lineno">12753</span>&#160;</div><div class="line"><a name="l12754"></a><span class="lineno">12754</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l12755"></a><span class="lineno">12755</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> poolIndex = poolCount; poolIndex--; )</div><div class="line"><a name="l12756"></a><span class="lineno">12756</span>&#160;    {</div><div class="line"><a name="l12757"></a><span class="lineno">12757</span>&#160;        m_Pools[poolIndex]-&gt;m_BlockVector.DestroyDefragmentator();</div><div class="line"><a name="l12758"></a><span class="lineno">12758</span>&#160;    }</div><div class="line"><a name="l12759"></a><span class="lineno">12759</span>&#160;</div><div class="line"><a name="l12760"></a><span class="lineno">12760</span>&#160;    <span class="comment">// Process standard memory.</span></div><div class="line"><a name="l12761"></a><span class="lineno">12761</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )</div><div class="line"><a name="l12762"></a><span class="lineno">12762</span>&#160;    {</div><div class="line"><a name="l12763"></a><span class="lineno">12763</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="l12764"></a><span class="lineno">12764</span>&#160;        {</div><div class="line"><a name="l12765"></a><span class="lineno">12765</span>&#160;            m_pBlockVectors[memTypeIndex]-&gt;DestroyDefragmentator();</div><div class="line"><a name="l12766"></a><span class="lineno">12766</span>&#160;        }</div><div class="line"><a name="l12767"></a><span class="lineno">12767</span>&#160;    }</div><div class="line"><a name="l12768"></a><span class="lineno">12768</span>&#160;</div><div class="line"><a name="l12769"></a><span class="lineno">12769</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l12770"></a><span class="lineno">12770</span>&#160;}</div><div class="line"><a name="l12771"></a><span class="lineno">12771</span>&#160;</div><div class="line"><a name="l12772"></a><span class="lineno">12772</span>&#160;VkResult VmaAllocator_T::DefragmentationEnd(</div><div class="line"><a name="l12773"></a><span class="lineno">12773</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div><div class="line"><a name="l12774"></a><span class="lineno">12774</span>&#160;{</div><div class="line"><a name="l12775"></a><span class="lineno">12775</span>&#160;    vma_delete(<span class="keyword">this</span>, context);</div><div class="line"><a name="l12776"></a><span class="lineno">12776</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12777"></a><span class="lineno">12777</span>&#160;}</div><div class="line"><a name="l12778"></a><span class="lineno">12778</span>&#160;</div><div class="line"><a name="l12779"></a><span class="lineno">12779</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="l12780"></a><span class="lineno">12780</span>&#160;{</div><div class="line"><a name="l12781"></a><span class="lineno">12781</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l12782"></a><span class="lineno">12782</span>&#160;    {</div><div class="line"><a name="l12783"></a><span class="lineno">12783</span>&#160;        <span class="comment">/*</span></div><div class="line"><a name="l12784"></a><span class="lineno">12784</span>&#160;<span class="comment">        Warning: This is a carefully designed algorithm.</span></div><div class="line"><a name="l12785"></a><span class="lineno">12785</span>&#160;<span class="comment">        Do not modify unless you really know what you&#39;re doing :)</span></div><div class="line"><a name="l12786"></a><span class="lineno">12786</span>&#160;<span class="comment">        */</span></div><div class="line"><a name="l12787"></a><span class="lineno">12787</span>&#160;        <span class="keyword">const</span> uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12788"></a><span class="lineno">12788</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l12789"></a><span class="lineno">12789</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12790"></a><span class="lineno">12790</span>&#160;        {</div><div class="line"><a name="l12791"></a><span class="lineno">12791</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l12792"></a><span class="lineno">12792</span>&#160;            {</div><div class="line"><a name="l12793"></a><span class="lineno">12793</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a7f6b0aa58c135e488e6b40a388dad9d5">memoryType</a> = UINT32_MAX;</div><div class="line"><a name="l12794"></a><span class="lineno">12794</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="l12795"></a><span class="lineno">12795</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a4a3c732388dbdc7a23f9365b00825268">offset</a> = 0;</div><div class="line"><a name="l12796"></a><span class="lineno">12796</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="l12797"></a><span class="lineno">12797</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l12798"></a><span class="lineno">12798</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="l12799"></a><span class="lineno">12799</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l12800"></a><span class="lineno">12800</span>&#160;            }</div><div class="line"><a name="l12801"></a><span class="lineno">12801</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l12802"></a><span class="lineno">12802</span>&#160;            {</div><div class="line"><a name="l12803"></a><span class="lineno">12803</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="l12804"></a><span class="lineno">12804</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="l12805"></a><span class="lineno">12805</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="l12806"></a><span class="lineno">12806</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="l12807"></a><span class="lineno">12807</span>&#160;                pAllocationInfo-&gt;<a class="code" href="struct_vma_allocation_info.html#a5eeffbe2d2f30f53370ff14aefbadbe2">pMappedData</a> = VMA_NULL;</div><div class="line"><a name="l12808"></a><span class="lineno">12808</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="l12809"></a><span class="lineno">12809</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l12810"></a><span class="lineno">12810</span>&#160;            }</div><div class="line"><a name="l12811"></a><span class="lineno">12811</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l12812"></a><span class="lineno">12812</span>&#160;            {</div><div class="line"><a name="l12813"></a><span class="lineno">12813</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l12814"></a><span class="lineno">12814</span>&#160;                {</div><div class="line"><a name="l12815"></a><span class="lineno">12815</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l12816"></a><span class="lineno">12816</span>&#160;                }</div><div class="line"><a name="l12817"></a><span class="lineno">12817</span>&#160;            }</div><div class="line"><a name="l12818"></a><span class="lineno">12818</span>&#160;        }</div><div class="line"><a name="l12819"></a><span class="lineno">12819</span>&#160;    }</div><div class="line"><a name="l12820"></a><span class="lineno">12820</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12821"></a><span class="lineno">12821</span>&#160;    {</div><div class="line"><a name="l12822"></a><span class="lineno">12822</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l12823"></a><span class="lineno">12823</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12824"></a><span class="lineno">12824</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l12825"></a><span class="lineno">12825</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12826"></a><span class="lineno">12826</span>&#160;        {</div><div class="line"><a name="l12827"></a><span class="lineno">12827</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l12828"></a><span class="lineno">12828</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l12829"></a><span class="lineno">12829</span>&#160;            {</div><div class="line"><a name="l12830"></a><span class="lineno">12830</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l12831"></a><span class="lineno">12831</span>&#160;            }</div><div class="line"><a name="l12832"></a><span class="lineno">12832</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l12833"></a><span class="lineno">12833</span>&#160;            {</div><div class="line"><a name="l12834"></a><span class="lineno">12834</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l12835"></a><span class="lineno">12835</span>&#160;                {</div><div class="line"><a name="l12836"></a><span class="lineno">12836</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l12837"></a><span class="lineno">12837</span>&#160;                }</div><div class="line"><a name="l12838"></a><span class="lineno">12838</span>&#160;            }</div><div class="line"><a name="l12839"></a><span class="lineno">12839</span>&#160;        }</div><div class="line"><a name="l12840"></a><span class="lineno">12840</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12841"></a><span class="lineno">12841</span>&#160;</div><div class="line"><a name="l12842"></a><span class="lineno">12842</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="l12843"></a><span class="lineno">12843</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="l12844"></a><span class="lineno">12844</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="l12845"></a><span class="lineno">12845</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="l12846"></a><span class="lineno">12846</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="l12847"></a><span class="lineno">12847</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="l12848"></a><span class="lineno">12848</span>&#160;    }</div><div class="line"><a name="l12849"></a><span class="lineno">12849</span>&#160;}</div><div class="line"><a name="l12850"></a><span class="lineno">12850</span>&#160;</div><div class="line"><a name="l12851"></a><span class="lineno">12851</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="l12852"></a><span class="lineno">12852</span>&#160;{</div><div class="line"><a name="l12853"></a><span class="lineno">12853</span>&#160;    <span class="comment">// This is a stripped-down version of VmaAllocator_T::GetAllocationInfo.</span></div><div class="line"><a name="l12854"></a><span class="lineno">12854</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l12855"></a><span class="lineno">12855</span>&#160;    {</div><div class="line"><a name="l12856"></a><span class="lineno">12856</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12857"></a><span class="lineno">12857</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l12858"></a><span class="lineno">12858</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12859"></a><span class="lineno">12859</span>&#160;        {</div><div class="line"><a name="l12860"></a><span class="lineno">12860</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == VMA_FRAME_INDEX_LOST)</div><div class="line"><a name="l12861"></a><span class="lineno">12861</span>&#160;            {</div><div class="line"><a name="l12862"></a><span class="lineno">12862</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l12863"></a><span class="lineno">12863</span>&#160;            }</div><div class="line"><a name="l12864"></a><span class="lineno">12864</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l12865"></a><span class="lineno">12865</span>&#160;            {</div><div class="line"><a name="l12866"></a><span class="lineno">12866</span>&#160;                <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l12867"></a><span class="lineno">12867</span>&#160;            }</div><div class="line"><a name="l12868"></a><span class="lineno">12868</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l12869"></a><span class="lineno">12869</span>&#160;            {</div><div class="line"><a name="l12870"></a><span class="lineno">12870</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l12871"></a><span class="lineno">12871</span>&#160;                {</div><div class="line"><a name="l12872"></a><span class="lineno">12872</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l12873"></a><span class="lineno">12873</span>&#160;                }</div><div class="line"><a name="l12874"></a><span class="lineno">12874</span>&#160;            }</div><div class="line"><a name="l12875"></a><span class="lineno">12875</span>&#160;        }</div><div class="line"><a name="l12876"></a><span class="lineno">12876</span>&#160;    }</div><div class="line"><a name="l12877"></a><span class="lineno">12877</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l12878"></a><span class="lineno">12878</span>&#160;    {</div><div class="line"><a name="l12879"></a><span class="lineno">12879</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l12880"></a><span class="lineno">12880</span>&#160;        uint32_t localCurrFrameIndex = m_CurrentFrameIndex.load();</div><div class="line"><a name="l12881"></a><span class="lineno">12881</span>&#160;        uint32_t localLastUseFrameIndex = hAllocation-&gt;GetLastUseFrameIndex();</div><div class="line"><a name="l12882"></a><span class="lineno">12882</span>&#160;        <span class="keywordflow">for</span>(;;)</div><div class="line"><a name="l12883"></a><span class="lineno">12883</span>&#160;        {</div><div class="line"><a name="l12884"></a><span class="lineno">12884</span>&#160;            VMA_ASSERT(localLastUseFrameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l12885"></a><span class="lineno">12885</span>&#160;            <span class="keywordflow">if</span>(localLastUseFrameIndex == localCurrFrameIndex)</div><div class="line"><a name="l12886"></a><span class="lineno">12886</span>&#160;            {</div><div class="line"><a name="l12887"></a><span class="lineno">12887</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l12888"></a><span class="lineno">12888</span>&#160;            }</div><div class="line"><a name="l12889"></a><span class="lineno">12889</span>&#160;            <span class="keywordflow">else</span> <span class="comment">// Last use time earlier than current time.</span></div><div class="line"><a name="l12890"></a><span class="lineno">12890</span>&#160;            {</div><div class="line"><a name="l12891"></a><span class="lineno">12891</span>&#160;                <span class="keywordflow">if</span>(hAllocation-&gt;CompareExchangeLastUseFrameIndex(localLastUseFrameIndex, localCurrFrameIndex))</div><div class="line"><a name="l12892"></a><span class="lineno">12892</span>&#160;                {</div><div class="line"><a name="l12893"></a><span class="lineno">12893</span>&#160;                    localLastUseFrameIndex = localCurrFrameIndex;</div><div class="line"><a name="l12894"></a><span class="lineno">12894</span>&#160;                }</div><div class="line"><a name="l12895"></a><span class="lineno">12895</span>&#160;            }</div><div class="line"><a name="l12896"></a><span class="lineno">12896</span>&#160;        }</div><div class="line"><a name="l12897"></a><span class="lineno">12897</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l12898"></a><span class="lineno">12898</span>&#160;</div><div class="line"><a name="l12899"></a><span class="lineno">12899</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l12900"></a><span class="lineno">12900</span>&#160;    }</div><div class="line"><a name="l12901"></a><span class="lineno">12901</span>&#160;}</div><div class="line"><a name="l12902"></a><span class="lineno">12902</span>&#160;</div><div class="line"><a name="l12903"></a><span class="lineno">12903</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="l12904"></a><span class="lineno">12904</span>&#160;{</div><div class="line"><a name="l12905"></a><span class="lineno">12905</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;  CreatePool: MemoryTypeIndex=%u, flags=%u&quot;</span>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>, pCreateInfo-&gt;<a class="code" href="struct_vma_pool_create_info.html#a8405139f63d078340ae74513a59f5446">flags</a>);</div><div class="line"><a name="l12906"></a><span class="lineno">12906</span>&#160;</div><div class="line"><a name="l12907"></a><span class="lineno">12907</span>&#160;    <a class="code" href="struct_vma_pool_create_info.html">VmaPoolCreateInfo</a> newCreateInfo = *pCreateInfo;</div><div class="line"><a name="l12908"></a><span class="lineno">12908</span>&#160;</div><div class="line"><a name="l12909"></a><span class="lineno">12909</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="l12910"></a><span class="lineno">12910</span>&#160;    {</div><div class="line"><a name="l12911"></a><span class="lineno">12911</span>&#160;        newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a> = SIZE_MAX;</div><div class="line"><a name="l12912"></a><span class="lineno">12912</span>&#160;    }</div><div class="line"><a name="l12913"></a><span class="lineno">12913</span>&#160;    <span class="keywordflow">if</span>(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ad8006fb803185c0a699d30f3e9a865ae">minBlockCount</a> &gt; newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#ae41142f2834fcdc82baa4883c187b75c">maxBlockCount</a>)</div><div class="line"><a name="l12914"></a><span class="lineno">12914</span>&#160;    {</div><div class="line"><a name="l12915"></a><span class="lineno">12915</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_INITIALIZATION_FAILED;</div><div class="line"><a name="l12916"></a><span class="lineno">12916</span>&#160;    }</div><div class="line"><a name="l12917"></a><span class="lineno">12917</span>&#160;</div><div class="line"><a name="l12918"></a><span class="lineno">12918</span>&#160;    <span class="keyword">const</span> VkDeviceSize preferredBlockSize = CalcPreferredBlockSize(newCreateInfo.<a class="code" href="struct_vma_pool_create_info.html#a596fa76b685d3f1f688f84a709a5b319">memoryTypeIndex</a>);</div><div class="line"><a name="l12919"></a><span class="lineno">12919</span>&#160;</div><div class="line"><a name="l12920"></a><span class="lineno">12920</span>&#160;    *pPool = vma_new(<span class="keyword">this</span>, VmaPool_T)(<span class="keyword">this</span>, newCreateInfo, preferredBlockSize);</div><div class="line"><a name="l12921"></a><span class="lineno">12921</span>&#160;</div><div class="line"><a name="l12922"></a><span class="lineno">12922</span>&#160;    VkResult res = (*pPool)-&gt;m_BlockVector.CreateMinBlocks();</div><div class="line"><a name="l12923"></a><span class="lineno">12923</span>&#160;    <span class="keywordflow">if</span>(res != VK_SUCCESS)</div><div class="line"><a name="l12924"></a><span class="lineno">12924</span>&#160;    {</div><div class="line"><a name="l12925"></a><span class="lineno">12925</span>&#160;        vma_delete(<span class="keyword">this</span>, *pPool);</div><div class="line"><a name="l12926"></a><span class="lineno">12926</span>&#160;        *pPool = VMA_NULL;</div><div class="line"><a name="l12927"></a><span class="lineno">12927</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l12928"></a><span class="lineno">12928</span>&#160;    }</div><div class="line"><a name="l12929"></a><span class="lineno">12929</span>&#160;</div><div class="line"><a name="l12930"></a><span class="lineno">12930</span>&#160;    <span class="comment">// Add to m_Pools.</span></div><div class="line"><a name="l12931"></a><span class="lineno">12931</span>&#160;    {</div><div class="line"><a name="l12932"></a><span class="lineno">12932</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l12933"></a><span class="lineno">12933</span>&#160;        (*pPool)-&gt;SetId(m_NextPoolId++);</div><div class="line"><a name="l12934"></a><span class="lineno">12934</span>&#160;        VmaVectorInsertSorted&lt;VmaPointerLess&gt;(m_Pools, *pPool);</div><div class="line"><a name="l12935"></a><span class="lineno">12935</span>&#160;    }</div><div class="line"><a name="l12936"></a><span class="lineno">12936</span>&#160;</div><div class="line"><a name="l12937"></a><span class="lineno">12937</span>&#160;    <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l12938"></a><span class="lineno">12938</span>&#160;}</div><div class="line"><a name="l12939"></a><span class="lineno">12939</span>&#160;</div><div class="line"><a name="l12940"></a><span class="lineno">12940</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="l12941"></a><span class="lineno">12941</span>&#160;{</div><div class="line"><a name="l12942"></a><span class="lineno">12942</span>&#160;    <span class="comment">// Remove from m_Pools.</span></div><div class="line"><a name="l12943"></a><span class="lineno">12943</span>&#160;    {</div><div class="line"><a name="l12944"></a><span class="lineno">12944</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l12945"></a><span class="lineno">12945</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(m_Pools, pool);</div><div class="line"><a name="l12946"></a><span class="lineno">12946</span>&#160;        VMA_ASSERT(success &amp;&amp; <span class="stringliteral">&quot;Pool not found in Allocator.&quot;</span>);</div><div class="line"><a name="l12947"></a><span class="lineno">12947</span>&#160;    }</div><div class="line"><a name="l12948"></a><span class="lineno">12948</span>&#160;</div><div class="line"><a name="l12949"></a><span class="lineno">12949</span>&#160;    vma_delete(<span class="keyword">this</span>, pool);</div><div class="line"><a name="l12950"></a><span class="lineno">12950</span>&#160;}</div><div class="line"><a name="l12951"></a><span class="lineno">12951</span>&#160;</div><div class="line"><a name="l12952"></a><span class="lineno">12952</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="l12953"></a><span class="lineno">12953</span>&#160;{</div><div class="line"><a name="l12954"></a><span class="lineno">12954</span>&#160;    pool-&gt;m_BlockVector.GetPoolStats(pPoolStats);</div><div class="line"><a name="l12955"></a><span class="lineno">12955</span>&#160;}</div><div class="line"><a name="l12956"></a><span class="lineno">12956</span>&#160;</div><div class="line"><a name="l12957"></a><span class="lineno">12957</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::SetCurrentFrameIndex(uint32_t frameIndex)</div><div class="line"><a name="l12958"></a><span class="lineno">12958</span>&#160;{</div><div class="line"><a name="l12959"></a><span class="lineno">12959</span>&#160;    m_CurrentFrameIndex.store(frameIndex);</div><div class="line"><a name="l12960"></a><span class="lineno">12960</span>&#160;}</div><div class="line"><a name="l12961"></a><span class="lineno">12961</span>&#160;</div><div class="line"><a name="l12962"></a><span class="lineno">12962</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::MakePoolAllocationsLost(</div><div class="line"><a name="l12963"></a><span class="lineno">12963</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> hPool,</div><div class="line"><a name="l12964"></a><span class="lineno">12964</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l12965"></a><span class="lineno">12965</span>&#160;{</div><div class="line"><a name="l12966"></a><span class="lineno">12966</span>&#160;    hPool-&gt;m_BlockVector.MakePoolAllocationsLost(</div><div class="line"><a name="l12967"></a><span class="lineno">12967</span>&#160;        m_CurrentFrameIndex.load(),</div><div class="line"><a name="l12968"></a><span class="lineno">12968</span>&#160;        pLostAllocationCount);</div><div class="line"><a name="l12969"></a><span class="lineno">12969</span>&#160;}</div><div class="line"><a name="l12970"></a><span class="lineno">12970</span>&#160;</div><div class="line"><a name="l12971"></a><span class="lineno">12971</span>&#160;VkResult VmaAllocator_T::CheckPoolCorruption(<a class="code" href="struct_vma_pool.html">VmaPool</a> hPool)</div><div class="line"><a name="l12972"></a><span class="lineno">12972</span>&#160;{</div><div class="line"><a name="l12973"></a><span class="lineno">12973</span>&#160;    <span class="keywordflow">return</span> hPool-&gt;m_BlockVector.CheckCorruption();</div><div class="line"><a name="l12974"></a><span class="lineno">12974</span>&#160;}</div><div class="line"><a name="l12975"></a><span class="lineno">12975</span>&#160;</div><div class="line"><a name="l12976"></a><span class="lineno">12976</span>&#160;VkResult VmaAllocator_T::CheckCorruption(uint32_t memoryTypeBits)</div><div class="line"><a name="l12977"></a><span class="lineno">12977</span>&#160;{</div><div class="line"><a name="l12978"></a><span class="lineno">12978</span>&#160;    VkResult finalRes = VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l12979"></a><span class="lineno">12979</span>&#160;</div><div class="line"><a name="l12980"></a><span class="lineno">12980</span>&#160;    <span class="comment">// Process default pools.</span></div><div class="line"><a name="l12981"></a><span class="lineno">12981</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l12982"></a><span class="lineno">12982</span>&#160;    {</div><div class="line"><a name="l12983"></a><span class="lineno">12983</span>&#160;        <span class="keywordflow">if</span>(((1u &lt;&lt; memTypeIndex) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l12984"></a><span class="lineno">12984</span>&#160;        {</div><div class="line"><a name="l12985"></a><span class="lineno">12985</span>&#160;            VmaBlockVector* <span class="keyword">const</span> pBlockVector = m_pBlockVectors[memTypeIndex];</div><div class="line"><a name="l12986"></a><span class="lineno">12986</span>&#160;            VMA_ASSERT(pBlockVector);</div><div class="line"><a name="l12987"></a><span class="lineno">12987</span>&#160;            VkResult localRes = pBlockVector-&gt;CheckCorruption();</div><div class="line"><a name="l12988"></a><span class="lineno">12988</span>&#160;            <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l12989"></a><span class="lineno">12989</span>&#160;            {</div><div class="line"><a name="l12990"></a><span class="lineno">12990</span>&#160;            <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l12991"></a><span class="lineno">12991</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l12992"></a><span class="lineno">12992</span>&#160;            <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l12993"></a><span class="lineno">12993</span>&#160;                finalRes = VK_SUCCESS;</div><div class="line"><a name="l12994"></a><span class="lineno">12994</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l12995"></a><span class="lineno">12995</span>&#160;            <span class="keywordflow">default</span>:</div><div class="line"><a name="l12996"></a><span class="lineno">12996</span>&#160;                <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l12997"></a><span class="lineno">12997</span>&#160;            }</div><div class="line"><a name="l12998"></a><span class="lineno">12998</span>&#160;        }</div><div class="line"><a name="l12999"></a><span class="lineno">12999</span>&#160;    }</div><div class="line"><a name="l13000"></a><span class="lineno">13000</span>&#160;</div><div class="line"><a name="l13001"></a><span class="lineno">13001</span>&#160;    <span class="comment">// Process custom pools.</span></div><div class="line"><a name="l13002"></a><span class="lineno">13002</span>&#160;    {</div><div class="line"><a name="l13003"></a><span class="lineno">13003</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l13004"></a><span class="lineno">13004</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="l13005"></a><span class="lineno">13005</span>&#160;        {</div><div class="line"><a name="l13006"></a><span class="lineno">13006</span>&#160;            <span class="keywordflow">if</span>(((1u &lt;&lt; m_Pools[poolIndex]-&gt;m_BlockVector.GetMemoryTypeIndex()) &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l13007"></a><span class="lineno">13007</span>&#160;            {</div><div class="line"><a name="l13008"></a><span class="lineno">13008</span>&#160;                VkResult localRes = m_Pools[poolIndex]-&gt;m_BlockVector.CheckCorruption();</div><div class="line"><a name="l13009"></a><span class="lineno">13009</span>&#160;                <span class="keywordflow">switch</span>(localRes)</div><div class="line"><a name="l13010"></a><span class="lineno">13010</span>&#160;                {</div><div class="line"><a name="l13011"></a><span class="lineno">13011</span>&#160;                <span class="keywordflow">case</span> VK_ERROR_FEATURE_NOT_PRESENT:</div><div class="line"><a name="l13012"></a><span class="lineno">13012</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l13013"></a><span class="lineno">13013</span>&#160;                <span class="keywordflow">case</span> VK_SUCCESS:</div><div class="line"><a name="l13014"></a><span class="lineno">13014</span>&#160;                    finalRes = VK_SUCCESS;</div><div class="line"><a name="l13015"></a><span class="lineno">13015</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l13016"></a><span class="lineno">13016</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l13017"></a><span class="lineno">13017</span>&#160;                    <span class="keywordflow">return</span> localRes;</div><div class="line"><a name="l13018"></a><span class="lineno">13018</span>&#160;                }</div><div class="line"><a name="l13019"></a><span class="lineno">13019</span>&#160;            }</div><div class="line"><a name="l13020"></a><span class="lineno">13020</span>&#160;        }</div><div class="line"><a name="l13021"></a><span class="lineno">13021</span>&#160;    }</div><div class="line"><a name="l13022"></a><span class="lineno">13022</span>&#160;</div><div class="line"><a name="l13023"></a><span class="lineno">13023</span>&#160;    <span class="keywordflow">return</span> finalRes;</div><div class="line"><a name="l13024"></a><span class="lineno">13024</span>&#160;}</div><div class="line"><a name="l13025"></a><span class="lineno">13025</span>&#160;</div><div class="line"><a name="l13026"></a><span class="lineno">13026</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="l13027"></a><span class="lineno">13027</span>&#160;{</div><div class="line"><a name="l13028"></a><span class="lineno">13028</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="l13029"></a><span class="lineno">13029</span>&#160;    (*pAllocation)-&gt;InitLost();</div><div class="line"><a name="l13030"></a><span class="lineno">13030</span>&#160;}</div><div class="line"><a name="l13031"></a><span class="lineno">13031</span>&#160;</div><div class="line"><a name="l13032"></a><span class="lineno">13032</span>&#160;VkResult VmaAllocator_T::AllocateVulkanMemory(<span class="keyword">const</span> VkMemoryAllocateInfo* pAllocateInfo, VkDeviceMemory* pMemory)</div><div class="line"><a name="l13033"></a><span class="lineno">13033</span>&#160;{</div><div class="line"><a name="l13034"></a><span class="lineno">13034</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(pAllocateInfo-&gt;memoryTypeIndex);</div><div class="line"><a name="l13035"></a><span class="lineno">13035</span>&#160;</div><div class="line"><a name="l13036"></a><span class="lineno">13036</span>&#160;    VkResult res;</div><div class="line"><a name="l13037"></a><span class="lineno">13037</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l13038"></a><span class="lineno">13038</span>&#160;    {</div><div class="line"><a name="l13039"></a><span class="lineno">13039</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l13040"></a><span class="lineno">13040</span>&#160;        <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] &gt;= pAllocateInfo-&gt;allocationSize)</div><div class="line"><a name="l13041"></a><span class="lineno">13041</span>&#160;        {</div><div class="line"><a name="l13042"></a><span class="lineno">13042</span>&#160;            res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l13043"></a><span class="lineno">13043</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13044"></a><span class="lineno">13044</span>&#160;            {</div><div class="line"><a name="l13045"></a><span class="lineno">13045</span>&#160;                m_HeapSizeLimit[heapIndex] -= pAllocateInfo-&gt;allocationSize;</div><div class="line"><a name="l13046"></a><span class="lineno">13046</span>&#160;            }</div><div class="line"><a name="l13047"></a><span class="lineno">13047</span>&#160;        }</div><div class="line"><a name="l13048"></a><span class="lineno">13048</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l13049"></a><span class="lineno">13049</span>&#160;        {</div><div class="line"><a name="l13050"></a><span class="lineno">13050</span>&#160;            res = VK_ERROR_OUT_OF_DEVICE_MEMORY;</div><div class="line"><a name="l13051"></a><span class="lineno">13051</span>&#160;        }</div><div class="line"><a name="l13052"></a><span class="lineno">13052</span>&#160;    }</div><div class="line"><a name="l13053"></a><span class="lineno">13053</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l13054"></a><span class="lineno">13054</span>&#160;    {</div><div class="line"><a name="l13055"></a><span class="lineno">13055</span>&#160;        res = (*m_VulkanFunctions.vkAllocateMemory)(m_hDevice, pAllocateInfo, GetAllocationCallbacks(), pMemory);</div><div class="line"><a name="l13056"></a><span class="lineno">13056</span>&#160;    }</div><div class="line"><a name="l13057"></a><span class="lineno">13057</span>&#160;</div><div class="line"><a name="l13058"></a><span class="lineno">13058</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="l13059"></a><span class="lineno">13059</span>&#160;    {</div><div class="line"><a name="l13060"></a><span class="lineno">13060</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="l13061"></a><span class="lineno">13061</span>&#160;    }</div><div class="line"><a name="l13062"></a><span class="lineno">13062</span>&#160;</div><div class="line"><a name="l13063"></a><span class="lineno">13063</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13064"></a><span class="lineno">13064</span>&#160;}</div><div class="line"><a name="l13065"></a><span class="lineno">13065</span>&#160;</div><div class="line"><a name="l13066"></a><span class="lineno">13066</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FreeVulkanMemory(uint32_t memoryType, VkDeviceSize size, VkDeviceMemory hMemory)</div><div class="line"><a name="l13067"></a><span class="lineno">13067</span>&#160;{</div><div class="line"><a name="l13068"></a><span class="lineno">13068</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="l13069"></a><span class="lineno">13069</span>&#160;    {</div><div class="line"><a name="l13070"></a><span class="lineno">13070</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="l13071"></a><span class="lineno">13071</span>&#160;    }</div><div class="line"><a name="l13072"></a><span class="lineno">13072</span>&#160;</div><div class="line"><a name="l13073"></a><span class="lineno">13073</span>&#160;    (*m_VulkanFunctions.vkFreeMemory)(m_hDevice, hMemory, GetAllocationCallbacks());</div><div class="line"><a name="l13074"></a><span class="lineno">13074</span>&#160;</div><div class="line"><a name="l13075"></a><span class="lineno">13075</span>&#160;    <span class="keyword">const</span> uint32_t heapIndex = MemoryTypeIndexToHeapIndex(memoryType);</div><div class="line"><a name="l13076"></a><span class="lineno">13076</span>&#160;    <span class="keywordflow">if</span>(m_HeapSizeLimit[heapIndex] != VK_WHOLE_SIZE)</div><div class="line"><a name="l13077"></a><span class="lineno">13077</span>&#160;    {</div><div class="line"><a name="l13078"></a><span class="lineno">13078</span>&#160;        VmaMutexLock lock(m_HeapSizeLimitMutex, m_UseMutex);</div><div class="line"><a name="l13079"></a><span class="lineno">13079</span>&#160;        m_HeapSizeLimit[heapIndex] += size;</div><div class="line"><a name="l13080"></a><span class="lineno">13080</span>&#160;    }</div><div class="line"><a name="l13081"></a><span class="lineno">13081</span>&#160;}</div><div class="line"><a name="l13082"></a><span class="lineno">13082</span>&#160;</div><div class="line"><a name="l13083"></a><span class="lineno">13083</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="l13084"></a><span class="lineno">13084</span>&#160;{</div><div class="line"><a name="l13085"></a><span class="lineno">13085</span>&#160;    <span class="keywordflow">if</span>(hAllocation-&gt;CanBecomeLost())</div><div class="line"><a name="l13086"></a><span class="lineno">13086</span>&#160;    {</div><div class="line"><a name="l13087"></a><span class="lineno">13087</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l13088"></a><span class="lineno">13088</span>&#160;    }</div><div class="line"><a name="l13089"></a><span class="lineno">13089</span>&#160;</div><div class="line"><a name="l13090"></a><span class="lineno">13090</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13091"></a><span class="lineno">13091</span>&#160;    {</div><div class="line"><a name="l13092"></a><span class="lineno">13092</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13093"></a><span class="lineno">13093</span>&#160;        {</div><div class="line"><a name="l13094"></a><span class="lineno">13094</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l13095"></a><span class="lineno">13095</span>&#160;            <span class="keywordtype">char</span> *pBytes = VMA_NULL;</div><div class="line"><a name="l13096"></a><span class="lineno">13096</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="l13097"></a><span class="lineno">13097</span>&#160;            <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13098"></a><span class="lineno">13098</span>&#160;            {</div><div class="line"><a name="l13099"></a><span class="lineno">13099</span>&#160;                *ppData = pBytes + (ptrdiff_t)hAllocation-&gt;GetOffset();</div><div class="line"><a name="l13100"></a><span class="lineno">13100</span>&#160;                hAllocation-&gt;BlockAllocMap();</div><div class="line"><a name="l13101"></a><span class="lineno">13101</span>&#160;            }</div><div class="line"><a name="l13102"></a><span class="lineno">13102</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13103"></a><span class="lineno">13103</span>&#160;        }</div><div class="line"><a name="l13104"></a><span class="lineno">13104</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13105"></a><span class="lineno">13105</span>&#160;        <span class="keywordflow">return</span> hAllocation-&gt;DedicatedAllocMap(<span class="keyword">this</span>, ppData);</div><div class="line"><a name="l13106"></a><span class="lineno">13106</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13107"></a><span class="lineno">13107</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l13108"></a><span class="lineno">13108</span>&#160;        <span class="keywordflow">return</span> VK_ERROR_MEMORY_MAP_FAILED;</div><div class="line"><a name="l13109"></a><span class="lineno">13109</span>&#160;    }</div><div class="line"><a name="l13110"></a><span class="lineno">13110</span>&#160;}</div><div class="line"><a name="l13111"></a><span class="lineno">13111</span>&#160;</div><div class="line"><a name="l13112"></a><span class="lineno">13112</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="l13113"></a><span class="lineno">13113</span>&#160;{</div><div class="line"><a name="l13114"></a><span class="lineno">13114</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13115"></a><span class="lineno">13115</span>&#160;    {</div><div class="line"><a name="l13116"></a><span class="lineno">13116</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13117"></a><span class="lineno">13117</span>&#160;        {</div><div class="line"><a name="l13118"></a><span class="lineno">13118</span>&#160;            VmaDeviceMemoryBlock* <span class="keyword">const</span> pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l13119"></a><span class="lineno">13119</span>&#160;            hAllocation-&gt;BlockAllocUnmap();</div><div class="line"><a name="l13120"></a><span class="lineno">13120</span>&#160;            pBlock-&gt;Unmap(<span class="keyword">this</span>, 1);</div><div class="line"><a name="l13121"></a><span class="lineno">13121</span>&#160;        }</div><div class="line"><a name="l13122"></a><span class="lineno">13122</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13123"></a><span class="lineno">13123</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13124"></a><span class="lineno">13124</span>&#160;        hAllocation-&gt;DedicatedAllocUnmap(<span class="keyword">this</span>);</div><div class="line"><a name="l13125"></a><span class="lineno">13125</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13126"></a><span class="lineno">13126</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13127"></a><span class="lineno">13127</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l13128"></a><span class="lineno">13128</span>&#160;    }</div><div class="line"><a name="l13129"></a><span class="lineno">13129</span>&#160;}</div><div class="line"><a name="l13130"></a><span class="lineno">13130</span>&#160;</div><div class="line"><a name="l13131"></a><span class="lineno">13131</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="l13132"></a><span class="lineno">13132</span>&#160;{</div><div class="line"><a name="l13133"></a><span class="lineno">13133</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l13134"></a><span class="lineno">13134</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13135"></a><span class="lineno">13135</span>&#160;    {</div><div class="line"><a name="l13136"></a><span class="lineno">13136</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13137"></a><span class="lineno">13137</span>&#160;        res = GetVulkanFunctions().vkBindBufferMemory(</div><div class="line"><a name="l13138"></a><span class="lineno">13138</span>&#160;            m_hDevice,</div><div class="line"><a name="l13139"></a><span class="lineno">13139</span>&#160;            hBuffer,</div><div class="line"><a name="l13140"></a><span class="lineno">13140</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l13141"></a><span class="lineno">13141</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l13142"></a><span class="lineno">13142</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13143"></a><span class="lineno">13143</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13144"></a><span class="lineno">13144</span>&#160;    {</div><div class="line"><a name="l13145"></a><span class="lineno">13145</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l13146"></a><span class="lineno">13146</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="l13147"></a><span class="lineno">13147</span>&#160;        res = pBlock-&gt;BindBufferMemory(<span class="keyword">this</span>, hAllocation, hBuffer);</div><div class="line"><a name="l13148"></a><span class="lineno">13148</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13149"></a><span class="lineno">13149</span>&#160;    }</div><div class="line"><a name="l13150"></a><span class="lineno">13150</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13151"></a><span class="lineno">13151</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l13152"></a><span class="lineno">13152</span>&#160;    }</div><div class="line"><a name="l13153"></a><span class="lineno">13153</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13154"></a><span class="lineno">13154</span>&#160;}</div><div class="line"><a name="l13155"></a><span class="lineno">13155</span>&#160;</div><div class="line"><a name="l13156"></a><span class="lineno">13156</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="l13157"></a><span class="lineno">13157</span>&#160;{</div><div class="line"><a name="l13158"></a><span class="lineno">13158</span>&#160;    VkResult res = VK_SUCCESS;</div><div class="line"><a name="l13159"></a><span class="lineno">13159</span>&#160;    <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13160"></a><span class="lineno">13160</span>&#160;    {</div><div class="line"><a name="l13161"></a><span class="lineno">13161</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13162"></a><span class="lineno">13162</span>&#160;        res = GetVulkanFunctions().vkBindImageMemory(</div><div class="line"><a name="l13163"></a><span class="lineno">13163</span>&#160;            m_hDevice,</div><div class="line"><a name="l13164"></a><span class="lineno">13164</span>&#160;            hImage,</div><div class="line"><a name="l13165"></a><span class="lineno">13165</span>&#160;            hAllocation-&gt;GetMemory(),</div><div class="line"><a name="l13166"></a><span class="lineno">13166</span>&#160;            0); <span class="comment">//memoryOffset</span></div><div class="line"><a name="l13167"></a><span class="lineno">13167</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13168"></a><span class="lineno">13168</span>&#160;    <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13169"></a><span class="lineno">13169</span>&#160;    {</div><div class="line"><a name="l13170"></a><span class="lineno">13170</span>&#160;        VmaDeviceMemoryBlock* pBlock = hAllocation-&gt;GetBlock();</div><div class="line"><a name="l13171"></a><span class="lineno">13171</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="l13172"></a><span class="lineno">13172</span>&#160;        res = pBlock-&gt;BindImageMemory(<span class="keyword">this</span>, hAllocation, hImage);</div><div class="line"><a name="l13173"></a><span class="lineno">13173</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13174"></a><span class="lineno">13174</span>&#160;    }</div><div class="line"><a name="l13175"></a><span class="lineno">13175</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13176"></a><span class="lineno">13176</span>&#160;        VMA_ASSERT(0);</div><div class="line"><a name="l13177"></a><span class="lineno">13177</span>&#160;    }</div><div class="line"><a name="l13178"></a><span class="lineno">13178</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13179"></a><span class="lineno">13179</span>&#160;}</div><div class="line"><a name="l13180"></a><span class="lineno">13180</span>&#160;</div><div class="line"><a name="l13181"></a><span class="lineno">13181</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FlushOrInvalidateAllocation(</div><div class="line"><a name="l13182"></a><span class="lineno">13182</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation,</div><div class="line"><a name="l13183"></a><span class="lineno">13183</span>&#160;    VkDeviceSize offset, VkDeviceSize size,</div><div class="line"><a name="l13184"></a><span class="lineno">13184</span>&#160;    VMA_CACHE_OPERATION op)</div><div class="line"><a name="l13185"></a><span class="lineno">13185</span>&#160;{</div><div class="line"><a name="l13186"></a><span class="lineno">13186</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = hAllocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l13187"></a><span class="lineno">13187</span>&#160;    <span class="keywordflow">if</span>(size &gt; 0 &amp;&amp; IsMemoryTypeNonCoherent(memTypeIndex))</div><div class="line"><a name="l13188"></a><span class="lineno">13188</span>&#160;    {</div><div class="line"><a name="l13189"></a><span class="lineno">13189</span>&#160;        <span class="keyword">const</span> VkDeviceSize allocationSize = hAllocation-&gt;GetSize();</div><div class="line"><a name="l13190"></a><span class="lineno">13190</span>&#160;        VMA_ASSERT(offset &lt;= allocationSize);</div><div class="line"><a name="l13191"></a><span class="lineno">13191</span>&#160;</div><div class="line"><a name="l13192"></a><span class="lineno">13192</span>&#160;        <span class="keyword">const</span> VkDeviceSize nonCoherentAtomSize = m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;</div><div class="line"><a name="l13193"></a><span class="lineno">13193</span>&#160;</div><div class="line"><a name="l13194"></a><span class="lineno">13194</span>&#160;        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };</div><div class="line"><a name="l13195"></a><span class="lineno">13195</span>&#160;        memRange.memory = hAllocation-&gt;GetMemory();</div><div class="line"><a name="l13196"></a><span class="lineno">13196</span>&#160;        </div><div class="line"><a name="l13197"></a><span class="lineno">13197</span>&#160;        <span class="keywordflow">switch</span>(hAllocation-&gt;GetType())</div><div class="line"><a name="l13198"></a><span class="lineno">13198</span>&#160;        {</div><div class="line"><a name="l13199"></a><span class="lineno">13199</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_DEDICATED:</div><div class="line"><a name="l13200"></a><span class="lineno">13200</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l13201"></a><span class="lineno">13201</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l13202"></a><span class="lineno">13202</span>&#160;            {</div><div class="line"><a name="l13203"></a><span class="lineno">13203</span>&#160;                memRange.size = allocationSize - memRange.offset;</div><div class="line"><a name="l13204"></a><span class="lineno">13204</span>&#160;            }</div><div class="line"><a name="l13205"></a><span class="lineno">13205</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l13206"></a><span class="lineno">13206</span>&#160;            {</div><div class="line"><a name="l13207"></a><span class="lineno">13207</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l13208"></a><span class="lineno">13208</span>&#160;                memRange.size = VMA_MIN(</div><div class="line"><a name="l13209"></a><span class="lineno">13209</span>&#160;                    VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize),</div><div class="line"><a name="l13210"></a><span class="lineno">13210</span>&#160;                    allocationSize - memRange.offset);</div><div class="line"><a name="l13211"></a><span class="lineno">13211</span>&#160;            }</div><div class="line"><a name="l13212"></a><span class="lineno">13212</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13213"></a><span class="lineno">13213</span>&#160;</div><div class="line"><a name="l13214"></a><span class="lineno">13214</span>&#160;        <span class="keywordflow">case</span> VmaAllocation_T::ALLOCATION_TYPE_BLOCK:</div><div class="line"><a name="l13215"></a><span class="lineno">13215</span>&#160;        {</div><div class="line"><a name="l13216"></a><span class="lineno">13216</span>&#160;            <span class="comment">// 1. Still within this allocation.</span></div><div class="line"><a name="l13217"></a><span class="lineno">13217</span>&#160;            memRange.offset = VmaAlignDown(offset, nonCoherentAtomSize);</div><div class="line"><a name="l13218"></a><span class="lineno">13218</span>&#160;            <span class="keywordflow">if</span>(size == VK_WHOLE_SIZE)</div><div class="line"><a name="l13219"></a><span class="lineno">13219</span>&#160;            {</div><div class="line"><a name="l13220"></a><span class="lineno">13220</span>&#160;                size = allocationSize - offset;</div><div class="line"><a name="l13221"></a><span class="lineno">13221</span>&#160;            }</div><div class="line"><a name="l13222"></a><span class="lineno">13222</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l13223"></a><span class="lineno">13223</span>&#160;            {</div><div class="line"><a name="l13224"></a><span class="lineno">13224</span>&#160;                VMA_ASSERT(offset + size &lt;= allocationSize);</div><div class="line"><a name="l13225"></a><span class="lineno">13225</span>&#160;            }</div><div class="line"><a name="l13226"></a><span class="lineno">13226</span>&#160;            memRange.size = VmaAlignUp(size + (offset - memRange.offset), nonCoherentAtomSize);</div><div class="line"><a name="l13227"></a><span class="lineno">13227</span>&#160;</div><div class="line"><a name="l13228"></a><span class="lineno">13228</span>&#160;            <span class="comment">// 2. Adjust to whole block.</span></div><div class="line"><a name="l13229"></a><span class="lineno">13229</span>&#160;            <span class="keyword">const</span> VkDeviceSize allocationOffset = hAllocation-&gt;GetOffset();</div><div class="line"><a name="l13230"></a><span class="lineno">13230</span>&#160;            VMA_ASSERT(allocationOffset % nonCoherentAtomSize == 0);</div><div class="line"><a name="l13231"></a><span class="lineno">13231</span>&#160;            <span class="keyword">const</span> VkDeviceSize blockSize = hAllocation-&gt;GetBlock()-&gt;m_pMetadata-&gt;GetSize();</div><div class="line"><a name="l13232"></a><span class="lineno">13232</span>&#160;            memRange.offset += allocationOffset;</div><div class="line"><a name="l13233"></a><span class="lineno">13233</span>&#160;            memRange.size = VMA_MIN(memRange.size, blockSize - memRange.offset);</div><div class="line"><a name="l13234"></a><span class="lineno">13234</span>&#160;            </div><div class="line"><a name="l13235"></a><span class="lineno">13235</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13236"></a><span class="lineno">13236</span>&#160;        }</div><div class="line"><a name="l13237"></a><span class="lineno">13237</span>&#160;        </div><div class="line"><a name="l13238"></a><span class="lineno">13238</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l13239"></a><span class="lineno">13239</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l13240"></a><span class="lineno">13240</span>&#160;        }</div><div class="line"><a name="l13241"></a><span class="lineno">13241</span>&#160;</div><div class="line"><a name="l13242"></a><span class="lineno">13242</span>&#160;        <span class="keywordflow">switch</span>(op)</div><div class="line"><a name="l13243"></a><span class="lineno">13243</span>&#160;        {</div><div class="line"><a name="l13244"></a><span class="lineno">13244</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_FLUSH:</div><div class="line"><a name="l13245"></a><span class="lineno">13245</span>&#160;            (*GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l13246"></a><span class="lineno">13246</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13247"></a><span class="lineno">13247</span>&#160;        <span class="keywordflow">case</span> VMA_CACHE_INVALIDATE:</div><div class="line"><a name="l13248"></a><span class="lineno">13248</span>&#160;            (*GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hDevice, 1, &amp;memRange);</div><div class="line"><a name="l13249"></a><span class="lineno">13249</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l13250"></a><span class="lineno">13250</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l13251"></a><span class="lineno">13251</span>&#160;            VMA_ASSERT(0);</div><div class="line"><a name="l13252"></a><span class="lineno">13252</span>&#160;        }</div><div class="line"><a name="l13253"></a><span class="lineno">13253</span>&#160;    }</div><div class="line"><a name="l13254"></a><span class="lineno">13254</span>&#160;    <span class="comment">// else: Just ignore this call.</span></div><div class="line"><a name="l13255"></a><span class="lineno">13255</span>&#160;}</div><div class="line"><a name="l13256"></a><span class="lineno">13256</span>&#160;</div><div class="line"><a name="l13257"></a><span class="lineno">13257</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="l13258"></a><span class="lineno">13258</span>&#160;{</div><div class="line"><a name="l13259"></a><span class="lineno">13259</span>&#160;    VMA_ASSERT(allocation &amp;&amp; allocation-&gt;GetType() == VmaAllocation_T::ALLOCATION_TYPE_DEDICATED);</div><div class="line"><a name="l13260"></a><span class="lineno">13260</span>&#160;</div><div class="line"><a name="l13261"></a><span class="lineno">13261</span>&#160;    <span class="keyword">const</span> uint32_t memTypeIndex = allocation-&gt;GetMemoryTypeIndex();</div><div class="line"><a name="l13262"></a><span class="lineno">13262</span>&#160;    {</div><div class="line"><a name="l13263"></a><span class="lineno">13263</span>&#160;        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l13264"></a><span class="lineno">13264</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l13265"></a><span class="lineno">13265</span>&#160;        VMA_ASSERT(pDedicatedAllocations);</div><div class="line"><a name="l13266"></a><span class="lineno">13266</span>&#160;        <span class="keywordtype">bool</span> success = VmaVectorRemoveSorted&lt;VmaPointerLess&gt;(*pDedicatedAllocations, allocation);</div><div class="line"><a name="l13267"></a><span class="lineno">13267</span>&#160;        VMA_ASSERT(success);</div><div class="line"><a name="l13268"></a><span class="lineno">13268</span>&#160;    }</div><div class="line"><a name="l13269"></a><span class="lineno">13269</span>&#160;</div><div class="line"><a name="l13270"></a><span class="lineno">13270</span>&#160;    VkDeviceMemory hMemory = allocation-&gt;GetMemory();</div><div class="line"><a name="l13271"></a><span class="lineno">13271</span>&#160;    </div><div class="line"><a name="l13272"></a><span class="lineno">13272</span>&#160;    <span class="comment">/*</span></div><div class="line"><a name="l13273"></a><span class="lineno">13273</span>&#160;<span class="comment">    There is no need to call this, because Vulkan spec allows to skip vkUnmapMemory</span></div><div class="line"><a name="l13274"></a><span class="lineno">13274</span>&#160;<span class="comment">    before vkFreeMemory.</span></div><div class="line"><a name="l13275"></a><span class="lineno">13275</span>&#160;<span class="comment"></span></div><div class="line"><a name="l13276"></a><span class="lineno">13276</span>&#160;<span class="comment">    if(allocation-&gt;GetMappedData() != VMA_NULL)</span></div><div class="line"><a name="l13277"></a><span class="lineno">13277</span>&#160;<span class="comment">    {</span></div><div class="line"><a name="l13278"></a><span class="lineno">13278</span>&#160;<span class="comment">        (*m_VulkanFunctions.vkUnmapMemory)(m_hDevice, hMemory);</span></div><div class="line"><a name="l13279"></a><span class="lineno">13279</span>&#160;<span class="comment">    }</span></div><div class="line"><a name="l13280"></a><span class="lineno">13280</span>&#160;<span class="comment">    */</span></div><div class="line"><a name="l13281"></a><span class="lineno">13281</span>&#160;    </div><div class="line"><a name="l13282"></a><span class="lineno">13282</span>&#160;    FreeVulkanMemory(memTypeIndex, allocation-&gt;GetSize(), hMemory);</div><div class="line"><a name="l13283"></a><span class="lineno">13283</span>&#160;</div><div class="line"><a name="l13284"></a><span class="lineno">13284</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;    Freed DedicatedMemory MemoryTypeIndex=%u&quot;</span>, memTypeIndex);</div><div class="line"><a name="l13285"></a><span class="lineno">13285</span>&#160;}</div><div class="line"><a name="l13286"></a><span class="lineno">13286</span>&#160;</div><div class="line"><a name="l13287"></a><span class="lineno">13287</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::FillAllocation(<span class="keyword">const</span> <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> hAllocation, uint8_t pattern)</div><div class="line"><a name="l13288"></a><span class="lineno">13288</span>&#160;{</div><div class="line"><a name="l13289"></a><span class="lineno">13289</span>&#160;    <span class="keywordflow">if</span>(VMA_DEBUG_INITIALIZE_ALLOCATIONS &amp;&amp;</div><div class="line"><a name="l13290"></a><span class="lineno">13290</span>&#160;        !hAllocation-&gt;CanBecomeLost() &amp;&amp;</div><div class="line"><a name="l13291"></a><span class="lineno">13291</span>&#160;        (m_MemProps.memoryTypes[hAllocation-&gt;GetMemoryTypeIndex()].propertyFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l13292"></a><span class="lineno">13292</span>&#160;    {</div><div class="line"><a name="l13293"></a><span class="lineno">13293</span>&#160;        <span class="keywordtype">void</span>* pData = VMA_NULL;</div><div class="line"><a name="l13294"></a><span class="lineno">13294</span>&#160;        VkResult res = Map(hAllocation, &amp;pData);</div><div class="line"><a name="l13295"></a><span class="lineno">13295</span>&#160;        <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13296"></a><span class="lineno">13296</span>&#160;        {</div><div class="line"><a name="l13297"></a><span class="lineno">13297</span>&#160;            memset(pData, (<span class="keywordtype">int</span>)pattern, (<span class="keywordtype">size_t</span>)hAllocation-&gt;GetSize());</div><div class="line"><a name="l13298"></a><span class="lineno">13298</span>&#160;            FlushOrInvalidateAllocation(hAllocation, 0, VK_WHOLE_SIZE, VMA_CACHE_FLUSH);</div><div class="line"><a name="l13299"></a><span class="lineno">13299</span>&#160;            Unmap(hAllocation);</div><div class="line"><a name="l13300"></a><span class="lineno">13300</span>&#160;        }</div><div class="line"><a name="l13301"></a><span class="lineno">13301</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l13302"></a><span class="lineno">13302</span>&#160;        {</div><div class="line"><a name="l13303"></a><span class="lineno">13303</span>&#160;            VMA_ASSERT(0 &amp;&amp; <span class="stringliteral">&quot;VMA_DEBUG_INITIALIZE_ALLOCATIONS is enabled, but couldn&#39;t map memory to fill allocation.&quot;</span>);</div><div class="line"><a name="l13304"></a><span class="lineno">13304</span>&#160;        }</div><div class="line"><a name="l13305"></a><span class="lineno">13305</span>&#160;    }</div><div class="line"><a name="l13306"></a><span class="lineno">13306</span>&#160;}</div><div class="line"><a name="l13307"></a><span class="lineno">13307</span>&#160;</div><div class="line"><a name="l13308"></a><span class="lineno">13308</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l13309"></a><span class="lineno">13309</span>&#160;</div><div class="line"><a name="l13310"></a><span class="lineno">13310</span>&#160;<span class="keywordtype">void</span> VmaAllocator_T::PrintDetailedMap(VmaJsonWriter&amp; json)</div><div class="line"><a name="l13311"></a><span class="lineno">13311</span>&#160;{</div><div class="line"><a name="l13312"></a><span class="lineno">13312</span>&#160;    <span class="keywordtype">bool</span> dedicatedAllocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l13313"></a><span class="lineno">13313</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l13314"></a><span class="lineno">13314</span>&#160;    {</div><div class="line"><a name="l13315"></a><span class="lineno">13315</span>&#160;        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);</div><div class="line"><a name="l13316"></a><span class="lineno">13316</span>&#160;        AllocationVectorType* <span class="keyword">const</span> pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];</div><div class="line"><a name="l13317"></a><span class="lineno">13317</span>&#160;        VMA_ASSERT(pDedicatedAllocVector);</div><div class="line"><a name="l13318"></a><span class="lineno">13318</span>&#160;        <span class="keywordflow">if</span>(pDedicatedAllocVector-&gt;empty() == <span class="keyword">false</span>)</div><div class="line"><a name="l13319"></a><span class="lineno">13319</span>&#160;        {</div><div class="line"><a name="l13320"></a><span class="lineno">13320</span>&#160;            <span class="keywordflow">if</span>(dedicatedAllocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l13321"></a><span class="lineno">13321</span>&#160;            {</div><div class="line"><a name="l13322"></a><span class="lineno">13322</span>&#160;                dedicatedAllocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l13323"></a><span class="lineno">13323</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DedicatedAllocations&quot;</span>);</div><div class="line"><a name="l13324"></a><span class="lineno">13324</span>&#160;                json.BeginObject();</div><div class="line"><a name="l13325"></a><span class="lineno">13325</span>&#160;            }</div><div class="line"><a name="l13326"></a><span class="lineno">13326</span>&#160;</div><div class="line"><a name="l13327"></a><span class="lineno">13327</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l13328"></a><span class="lineno">13328</span>&#160;            json.ContinueString(memTypeIndex);</div><div class="line"><a name="l13329"></a><span class="lineno">13329</span>&#160;            json.EndString();</div><div class="line"><a name="l13330"></a><span class="lineno">13330</span>&#160;                </div><div class="line"><a name="l13331"></a><span class="lineno">13331</span>&#160;            json.BeginArray();</div><div class="line"><a name="l13332"></a><span class="lineno">13332</span>&#160;</div><div class="line"><a name="l13333"></a><span class="lineno">13333</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="l13334"></a><span class="lineno">13334</span>&#160;            {</div><div class="line"><a name="l13335"></a><span class="lineno">13335</span>&#160;                json.BeginObject(<span class="keyword">true</span>);</div><div class="line"><a name="l13336"></a><span class="lineno">13336</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="l13337"></a><span class="lineno">13337</span>&#160;                hAlloc-&gt;PrintParameters(json);</div><div class="line"><a name="l13338"></a><span class="lineno">13338</span>&#160;                json.EndObject();</div><div class="line"><a name="l13339"></a><span class="lineno">13339</span>&#160;            }</div><div class="line"><a name="l13340"></a><span class="lineno">13340</span>&#160;</div><div class="line"><a name="l13341"></a><span class="lineno">13341</span>&#160;            json.EndArray();</div><div class="line"><a name="l13342"></a><span class="lineno">13342</span>&#160;        }</div><div class="line"><a name="l13343"></a><span class="lineno">13343</span>&#160;    }</div><div class="line"><a name="l13344"></a><span class="lineno">13344</span>&#160;    <span class="keywordflow">if</span>(dedicatedAllocationsStarted)</div><div class="line"><a name="l13345"></a><span class="lineno">13345</span>&#160;    {</div><div class="line"><a name="l13346"></a><span class="lineno">13346</span>&#160;        json.EndObject();</div><div class="line"><a name="l13347"></a><span class="lineno">13347</span>&#160;    }</div><div class="line"><a name="l13348"></a><span class="lineno">13348</span>&#160;</div><div class="line"><a name="l13349"></a><span class="lineno">13349</span>&#160;    {</div><div class="line"><a name="l13350"></a><span class="lineno">13350</span>&#160;        <span class="keywordtype">bool</span> allocationsStarted = <span class="keyword">false</span>;</div><div class="line"><a name="l13351"></a><span class="lineno">13351</span>&#160;        <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0; memTypeIndex &lt; GetMemoryTypeCount(); ++memTypeIndex)</div><div class="line"><a name="l13352"></a><span class="lineno">13352</span>&#160;        {</div><div class="line"><a name="l13353"></a><span class="lineno">13353</span>&#160;            <span class="keywordflow">if</span>(m_pBlockVectors[memTypeIndex]-&gt;IsEmpty() == <span class="keyword">false</span>)</div><div class="line"><a name="l13354"></a><span class="lineno">13354</span>&#160;            {</div><div class="line"><a name="l13355"></a><span class="lineno">13355</span>&#160;                <span class="keywordflow">if</span>(allocationsStarted == <span class="keyword">false</span>)</div><div class="line"><a name="l13356"></a><span class="lineno">13356</span>&#160;                {</div><div class="line"><a name="l13357"></a><span class="lineno">13357</span>&#160;                    allocationsStarted = <span class="keyword">true</span>;</div><div class="line"><a name="l13358"></a><span class="lineno">13358</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;DefaultPools&quot;</span>);</div><div class="line"><a name="l13359"></a><span class="lineno">13359</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l13360"></a><span class="lineno">13360</span>&#160;                }</div><div class="line"><a name="l13361"></a><span class="lineno">13361</span>&#160;</div><div class="line"><a name="l13362"></a><span class="lineno">13362</span>&#160;                json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l13363"></a><span class="lineno">13363</span>&#160;                json.ContinueString(memTypeIndex);</div><div class="line"><a name="l13364"></a><span class="lineno">13364</span>&#160;                json.EndString();</div><div class="line"><a name="l13365"></a><span class="lineno">13365</span>&#160;</div><div class="line"><a name="l13366"></a><span class="lineno">13366</span>&#160;                m_pBlockVectors[memTypeIndex]-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l13367"></a><span class="lineno">13367</span>&#160;            }</div><div class="line"><a name="l13368"></a><span class="lineno">13368</span>&#160;        }</div><div class="line"><a name="l13369"></a><span class="lineno">13369</span>&#160;        <span class="keywordflow">if</span>(allocationsStarted)</div><div class="line"><a name="l13370"></a><span class="lineno">13370</span>&#160;        {</div><div class="line"><a name="l13371"></a><span class="lineno">13371</span>&#160;            json.EndObject();</div><div class="line"><a name="l13372"></a><span class="lineno">13372</span>&#160;        }</div><div class="line"><a name="l13373"></a><span class="lineno">13373</span>&#160;    }</div><div class="line"><a name="l13374"></a><span class="lineno">13374</span>&#160;</div><div class="line"><a name="l13375"></a><span class="lineno">13375</span>&#160;    <span class="comment">// Custom pools</span></div><div class="line"><a name="l13376"></a><span class="lineno">13376</span>&#160;    {</div><div class="line"><a name="l13377"></a><span class="lineno">13377</span>&#160;        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);</div><div class="line"><a name="l13378"></a><span class="lineno">13378</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> poolCount = m_Pools.size();</div><div class="line"><a name="l13379"></a><span class="lineno">13379</span>&#160;        <span class="keywordflow">if</span>(poolCount &gt; 0)</div><div class="line"><a name="l13380"></a><span class="lineno">13380</span>&#160;        {</div><div class="line"><a name="l13381"></a><span class="lineno">13381</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Pools&quot;</span>);</div><div class="line"><a name="l13382"></a><span class="lineno">13382</span>&#160;            json.BeginObject();</div><div class="line"><a name="l13383"></a><span class="lineno">13383</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="l13384"></a><span class="lineno">13384</span>&#160;            {</div><div class="line"><a name="l13385"></a><span class="lineno">13385</span>&#160;                json.BeginString();</div><div class="line"><a name="l13386"></a><span class="lineno">13386</span>&#160;                json.ContinueString(m_Pools[poolIndex]-&gt;GetId());</div><div class="line"><a name="l13387"></a><span class="lineno">13387</span>&#160;                json.EndString();</div><div class="line"><a name="l13388"></a><span class="lineno">13388</span>&#160;</div><div class="line"><a name="l13389"></a><span class="lineno">13389</span>&#160;                m_Pools[poolIndex]-&gt;m_BlockVector.PrintDetailedMap(json);</div><div class="line"><a name="l13390"></a><span class="lineno">13390</span>&#160;            }</div><div class="line"><a name="l13391"></a><span class="lineno">13391</span>&#160;            json.EndObject();</div><div class="line"><a name="l13392"></a><span class="lineno">13392</span>&#160;        }</div><div class="line"><a name="l13393"></a><span class="lineno">13393</span>&#160;    }</div><div class="line"><a name="l13394"></a><span class="lineno">13394</span>&#160;}</div><div class="line"><a name="l13395"></a><span class="lineno">13395</span>&#160;</div><div class="line"><a name="l13396"></a><span class="lineno">13396</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l13397"></a><span class="lineno">13397</span>&#160;</div><div class="line"><a name="l13399"></a><span class="lineno">13399</span>&#160;<span class="comment">// Public interface</span></div><div class="line"><a name="l13400"></a><span class="lineno">13400</span>&#160;</div><div class="line"><a name="l13401"></a><span class="lineno">13401</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a200692051ddb34240248234f5f4c17bb">vmaCreateAllocator</a>(</div><div class="line"><a name="l13402"></a><span class="lineno">13402</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="l13403"></a><span class="lineno">13403</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a>* pAllocator)</div><div class="line"><a name="l13404"></a><span class="lineno">13404</span>&#160;{</div><div class="line"><a name="l13405"></a><span class="lineno">13405</span>&#160;    VMA_ASSERT(pCreateInfo &amp;&amp; pAllocator);</div><div class="line"><a name="l13406"></a><span class="lineno">13406</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateAllocator&quot;</span>);</div><div class="line"><a name="l13407"></a><span class="lineno">13407</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="l13408"></a><span class="lineno">13408</span>&#160;    <span class="keywordflow">return</span> (*pAllocator)-&gt;Init(pCreateInfo);</div><div class="line"><a name="l13409"></a><span class="lineno">13409</span>&#160;}</div><div class="line"><a name="l13410"></a><span class="lineno">13410</span>&#160;</div><div class="line"><a name="l13411"></a><span class="lineno">13411</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="l13412"></a><span class="lineno">13412</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator)</div><div class="line"><a name="l13413"></a><span class="lineno">13413</span>&#160;{</div><div class="line"><a name="l13414"></a><span class="lineno">13414</span>&#160;    <span class="keywordflow">if</span>(allocator != VK_NULL_HANDLE)</div><div class="line"><a name="l13415"></a><span class="lineno">13415</span>&#160;    {</div><div class="line"><a name="l13416"></a><span class="lineno">13416</span>&#160;        VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyAllocator&quot;</span>);</div><div class="line"><a name="l13417"></a><span class="lineno">13417</span>&#160;        VkAllocationCallbacks allocationCallbacks = allocator-&gt;m_AllocationCallbacks;</div><div class="line"><a name="l13418"></a><span class="lineno">13418</span>&#160;        vma_delete(&amp;allocationCallbacks, allocator);</div><div class="line"><a name="l13419"></a><span class="lineno">13419</span>&#160;    }</div><div class="line"><a name="l13420"></a><span class="lineno">13420</span>&#160;}</div><div class="line"><a name="l13421"></a><span class="lineno">13421</span>&#160;</div><div class="line"><a name="l13422"></a><span class="lineno">13422</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="l13423"></a><span class="lineno">13423</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13424"></a><span class="lineno">13424</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceProperties **ppPhysicalDeviceProperties)</div><div class="line"><a name="l13425"></a><span class="lineno">13425</span>&#160;{</div><div class="line"><a name="l13426"></a><span class="lineno">13426</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceProperties);</div><div class="line"><a name="l13427"></a><span class="lineno">13427</span>&#160;    *ppPhysicalDeviceProperties = &amp;allocator-&gt;m_PhysicalDeviceProperties;</div><div class="line"><a name="l13428"></a><span class="lineno">13428</span>&#160;}</div><div class="line"><a name="l13429"></a><span class="lineno">13429</span>&#160;</div><div class="line"><a name="l13430"></a><span class="lineno">13430</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="l13431"></a><span class="lineno">13431</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13432"></a><span class="lineno">13432</span>&#160;    <span class="keyword">const</span> VkPhysicalDeviceMemoryProperties** ppPhysicalDeviceMemoryProperties)</div><div class="line"><a name="l13433"></a><span class="lineno">13433</span>&#160;{</div><div class="line"><a name="l13434"></a><span class="lineno">13434</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppPhysicalDeviceMemoryProperties);</div><div class="line"><a name="l13435"></a><span class="lineno">13435</span>&#160;    *ppPhysicalDeviceMemoryProperties = &amp;allocator-&gt;m_MemProps;</div><div class="line"><a name="l13436"></a><span class="lineno">13436</span>&#160;}</div><div class="line"><a name="l13437"></a><span class="lineno">13437</span>&#160;</div><div class="line"><a name="l13438"></a><span class="lineno">13438</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="l13439"></a><span class="lineno">13439</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13440"></a><span class="lineno">13440</span>&#160;    uint32_t memoryTypeIndex,</div><div class="line"><a name="l13441"></a><span class="lineno">13441</span>&#160;    VkMemoryPropertyFlags* pFlags)</div><div class="line"><a name="l13442"></a><span class="lineno">13442</span>&#160;{</div><div class="line"><a name="l13443"></a><span class="lineno">13443</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pFlags);</div><div class="line"><a name="l13444"></a><span class="lineno">13444</span>&#160;    VMA_ASSERT(memoryTypeIndex &lt; allocator-&gt;GetMemoryTypeCount());</div><div class="line"><a name="l13445"></a><span class="lineno">13445</span>&#160;    *pFlags = allocator-&gt;m_MemProps.memoryTypes[memoryTypeIndex].propertyFlags;</div><div class="line"><a name="l13446"></a><span class="lineno">13446</span>&#160;}</div><div class="line"><a name="l13447"></a><span class="lineno">13447</span>&#160;</div><div class="line"><a name="l13448"></a><span class="lineno">13448</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="l13449"></a><span class="lineno">13449</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13450"></a><span class="lineno">13450</span>&#160;    uint32_t frameIndex)</div><div class="line"><a name="l13451"></a><span class="lineno">13451</span>&#160;{</div><div class="line"><a name="l13452"></a><span class="lineno">13452</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l13453"></a><span class="lineno">13453</span>&#160;    VMA_ASSERT(frameIndex != VMA_FRAME_INDEX_LOST);</div><div class="line"><a name="l13454"></a><span class="lineno">13454</span>&#160;</div><div class="line"><a name="l13455"></a><span class="lineno">13455</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13456"></a><span class="lineno">13456</span>&#160;</div><div class="line"><a name="l13457"></a><span class="lineno">13457</span>&#160;    allocator-&gt;SetCurrentFrameIndex(frameIndex);</div><div class="line"><a name="l13458"></a><span class="lineno">13458</span>&#160;}</div><div class="line"><a name="l13459"></a><span class="lineno">13459</span>&#160;</div><div class="line"><a name="l13460"></a><span class="lineno">13460</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="l13461"></a><span class="lineno">13461</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13462"></a><span class="lineno">13462</span>&#160;    <a class="code" href="struct_vma_stats.html">VmaStats</a>* pStats)</div><div class="line"><a name="l13463"></a><span class="lineno">13463</span>&#160;{</div><div class="line"><a name="l13464"></a><span class="lineno">13464</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pStats);</div><div class="line"><a name="l13465"></a><span class="lineno">13465</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13466"></a><span class="lineno">13466</span>&#160;    allocator-&gt;CalculateStats(pStats);</div><div class="line"><a name="l13467"></a><span class="lineno">13467</span>&#160;}</div><div class="line"><a name="l13468"></a><span class="lineno">13468</span>&#160;</div><div class="line"><a name="l13469"></a><span class="lineno">13469</span>&#160;<span class="preprocessor">#if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l13470"></a><span class="lineno">13470</span>&#160;</div><div class="line"><a name="l13471"></a><span class="lineno">13471</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="l13472"></a><span class="lineno">13472</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13473"></a><span class="lineno">13473</span>&#160;    <span class="keywordtype">char</span>** ppStatsString,</div><div class="line"><a name="l13474"></a><span class="lineno">13474</span>&#160;    VkBool32 detailedMap)</div><div class="line"><a name="l13475"></a><span class="lineno">13475</span>&#160;{</div><div class="line"><a name="l13476"></a><span class="lineno">13476</span>&#160;    VMA_ASSERT(allocator &amp;&amp; ppStatsString);</div><div class="line"><a name="l13477"></a><span class="lineno">13477</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13478"></a><span class="lineno">13478</span>&#160;</div><div class="line"><a name="l13479"></a><span class="lineno">13479</span>&#160;    VmaStringBuilder sb(allocator);</div><div class="line"><a name="l13480"></a><span class="lineno">13480</span>&#160;    {</div><div class="line"><a name="l13481"></a><span class="lineno">13481</span>&#160;        VmaJsonWriter json(allocator-&gt;GetAllocationCallbacks(), sb);</div><div class="line"><a name="l13482"></a><span class="lineno">13482</span>&#160;        json.BeginObject();</div><div class="line"><a name="l13483"></a><span class="lineno">13483</span>&#160;</div><div class="line"><a name="l13484"></a><span class="lineno">13484</span>&#160;        <a class="code" href="struct_vma_stats.html">VmaStats</a> stats;</div><div class="line"><a name="l13485"></a><span class="lineno">13485</span>&#160;        allocator-&gt;CalculateStats(&amp;stats);</div><div class="line"><a name="l13486"></a><span class="lineno">13486</span>&#160;</div><div class="line"><a name="l13487"></a><span class="lineno">13487</span>&#160;        json.WriteString(<span class="stringliteral">&quot;Total&quot;</span>);</div><div class="line"><a name="l13488"></a><span class="lineno">13488</span>&#160;        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a2e8f5b3353f2fefef3c27f29e245a1f9">total</a>);</div><div class="line"><a name="l13489"></a><span class="lineno">13489</span>&#160;    </div><div class="line"><a name="l13490"></a><span class="lineno">13490</span>&#160;        <span class="keywordflow">for</span>(uint32_t heapIndex = 0; heapIndex &lt; allocator-&gt;GetMemoryHeapCount(); ++heapIndex)</div><div class="line"><a name="l13491"></a><span class="lineno">13491</span>&#160;        {</div><div class="line"><a name="l13492"></a><span class="lineno">13492</span>&#160;            json.BeginString(<span class="stringliteral">&quot;Heap &quot;</span>);</div><div class="line"><a name="l13493"></a><span class="lineno">13493</span>&#160;            json.ContinueString(heapIndex);</div><div class="line"><a name="l13494"></a><span class="lineno">13494</span>&#160;            json.EndString();</div><div class="line"><a name="l13495"></a><span class="lineno">13495</span>&#160;            json.BeginObject();</div><div class="line"><a name="l13496"></a><span class="lineno">13496</span>&#160;</div><div class="line"><a name="l13497"></a><span class="lineno">13497</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Size&quot;</span>);</div><div class="line"><a name="l13498"></a><span class="lineno">13498</span>&#160;            json.WriteNumber(allocator-&gt;m_MemProps.memoryHeaps[heapIndex].size);</div><div class="line"><a name="l13499"></a><span class="lineno">13499</span>&#160;</div><div class="line"><a name="l13500"></a><span class="lineno">13500</span>&#160;            json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l13501"></a><span class="lineno">13501</span>&#160;            json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l13502"></a><span class="lineno">13502</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="l13503"></a><span class="lineno">13503</span>&#160;            {</div><div class="line"><a name="l13504"></a><span class="lineno">13504</span>&#160;                json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l13505"></a><span class="lineno">13505</span>&#160;            }</div><div class="line"><a name="l13506"></a><span class="lineno">13506</span>&#160;            json.EndArray();</div><div class="line"><a name="l13507"></a><span class="lineno">13507</span>&#160;</div><div class="line"><a name="l13508"></a><span class="lineno">13508</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="l13509"></a><span class="lineno">13509</span>&#160;            {</div><div class="line"><a name="l13510"></a><span class="lineno">13510</span>&#160;                json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l13511"></a><span class="lineno">13511</span>&#160;                VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a0e6611508c29a187f0fd14ff1a0329c0">memoryHeap</a>[heapIndex]);</div><div class="line"><a name="l13512"></a><span class="lineno">13512</span>&#160;            }</div><div class="line"><a name="l13513"></a><span class="lineno">13513</span>&#160;</div><div class="line"><a name="l13514"></a><span class="lineno">13514</span>&#160;            <span class="keywordflow">for</span>(uint32_t typeIndex = 0; typeIndex &lt; allocator-&gt;GetMemoryTypeCount(); ++typeIndex)</div><div class="line"><a name="l13515"></a><span class="lineno">13515</span>&#160;            {</div><div class="line"><a name="l13516"></a><span class="lineno">13516</span>&#160;                <span class="keywordflow">if</span>(allocator-&gt;MemoryTypeIndexToHeapIndex(typeIndex) == heapIndex)</div><div class="line"><a name="l13517"></a><span class="lineno">13517</span>&#160;                {</div><div class="line"><a name="l13518"></a><span class="lineno">13518</span>&#160;                    json.BeginString(<span class="stringliteral">&quot;Type &quot;</span>);</div><div class="line"><a name="l13519"></a><span class="lineno">13519</span>&#160;                    json.ContinueString(typeIndex);</div><div class="line"><a name="l13520"></a><span class="lineno">13520</span>&#160;                    json.EndString();</div><div class="line"><a name="l13521"></a><span class="lineno">13521</span>&#160;</div><div class="line"><a name="l13522"></a><span class="lineno">13522</span>&#160;                    json.BeginObject();</div><div class="line"><a name="l13523"></a><span class="lineno">13523</span>&#160;</div><div class="line"><a name="l13524"></a><span class="lineno">13524</span>&#160;                    json.WriteString(<span class="stringliteral">&quot;Flags&quot;</span>);</div><div class="line"><a name="l13525"></a><span class="lineno">13525</span>&#160;                    json.BeginArray(<span class="keyword">true</span>);</div><div class="line"><a name="l13526"></a><span class="lineno">13526</span>&#160;                    VkMemoryPropertyFlags flags = allocator-&gt;m_MemProps.memoryTypes[typeIndex].propertyFlags;</div><div class="line"><a name="l13527"></a><span class="lineno">13527</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0)</div><div class="line"><a name="l13528"></a><span class="lineno">13528</span>&#160;                    {</div><div class="line"><a name="l13529"></a><span class="lineno">13529</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;DEVICE_LOCAL&quot;</span>);</div><div class="line"><a name="l13530"></a><span class="lineno">13530</span>&#160;                    }</div><div class="line"><a name="l13531"></a><span class="lineno">13531</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)</div><div class="line"><a name="l13532"></a><span class="lineno">13532</span>&#160;                    {</div><div class="line"><a name="l13533"></a><span class="lineno">13533</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_VISIBLE&quot;</span>);</div><div class="line"><a name="l13534"></a><span class="lineno">13534</span>&#160;                    }</div><div class="line"><a name="l13535"></a><span class="lineno">13535</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0)</div><div class="line"><a name="l13536"></a><span class="lineno">13536</span>&#160;                    {</div><div class="line"><a name="l13537"></a><span class="lineno">13537</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_COHERENT&quot;</span>);</div><div class="line"><a name="l13538"></a><span class="lineno">13538</span>&#160;                    }</div><div class="line"><a name="l13539"></a><span class="lineno">13539</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0)</div><div class="line"><a name="l13540"></a><span class="lineno">13540</span>&#160;                    {</div><div class="line"><a name="l13541"></a><span class="lineno">13541</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;HOST_CACHED&quot;</span>);</div><div class="line"><a name="l13542"></a><span class="lineno">13542</span>&#160;                    }</div><div class="line"><a name="l13543"></a><span class="lineno">13543</span>&#160;                    <span class="keywordflow">if</span>((flags &amp; VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0)</div><div class="line"><a name="l13544"></a><span class="lineno">13544</span>&#160;                    {</div><div class="line"><a name="l13545"></a><span class="lineno">13545</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;LAZILY_ALLOCATED&quot;</span>);</div><div class="line"><a name="l13546"></a><span class="lineno">13546</span>&#160;                    }</div><div class="line"><a name="l13547"></a><span class="lineno">13547</span>&#160;                    json.EndArray();</div><div class="line"><a name="l13548"></a><span class="lineno">13548</span>&#160;</div><div class="line"><a name="l13549"></a><span class="lineno">13549</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="l13550"></a><span class="lineno">13550</span>&#160;                    {</div><div class="line"><a name="l13551"></a><span class="lineno">13551</span>&#160;                        json.WriteString(<span class="stringliteral">&quot;Stats&quot;</span>);</div><div class="line"><a name="l13552"></a><span class="lineno">13552</span>&#160;                        VmaPrintStatInfo(json, stats.<a class="code" href="struct_vma_stats.html#a13e3caf754be79352c42408756309331">memoryType</a>[typeIndex]);</div><div class="line"><a name="l13553"></a><span class="lineno">13553</span>&#160;                    }</div><div class="line"><a name="l13554"></a><span class="lineno">13554</span>&#160;</div><div class="line"><a name="l13555"></a><span class="lineno">13555</span>&#160;                    json.EndObject();</div><div class="line"><a name="l13556"></a><span class="lineno">13556</span>&#160;                }</div><div class="line"><a name="l13557"></a><span class="lineno">13557</span>&#160;            }</div><div class="line"><a name="l13558"></a><span class="lineno">13558</span>&#160;</div><div class="line"><a name="l13559"></a><span class="lineno">13559</span>&#160;            json.EndObject();</div><div class="line"><a name="l13560"></a><span class="lineno">13560</span>&#160;        }</div><div class="line"><a name="l13561"></a><span class="lineno">13561</span>&#160;        <span class="keywordflow">if</span>(detailedMap == VK_TRUE)</div><div class="line"><a name="l13562"></a><span class="lineno">13562</span>&#160;        {</div><div class="line"><a name="l13563"></a><span class="lineno">13563</span>&#160;            allocator-&gt;PrintDetailedMap(json);</div><div class="line"><a name="l13564"></a><span class="lineno">13564</span>&#160;        }</div><div class="line"><a name="l13565"></a><span class="lineno">13565</span>&#160;</div><div class="line"><a name="l13566"></a><span class="lineno">13566</span>&#160;        json.EndObject();</div><div class="line"><a name="l13567"></a><span class="lineno">13567</span>&#160;    }</div><div class="line"><a name="l13568"></a><span class="lineno">13568</span>&#160;</div><div class="line"><a name="l13569"></a><span class="lineno">13569</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">size_t</span> len = sb.GetLength();</div><div class="line"><a name="l13570"></a><span class="lineno">13570</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="l13571"></a><span class="lineno">13571</span>&#160;    <span class="keywordflow">if</span>(len &gt; 0)</div><div class="line"><a name="l13572"></a><span class="lineno">13572</span>&#160;    {</div><div class="line"><a name="l13573"></a><span class="lineno">13573</span>&#160;        memcpy(pChars, sb.GetData(), len);</div><div class="line"><a name="l13574"></a><span class="lineno">13574</span>&#160;    }</div><div class="line"><a name="l13575"></a><span class="lineno">13575</span>&#160;    pChars[len] = <span class="charliteral">&#39;\0&#39;</span>;</div><div class="line"><a name="l13576"></a><span class="lineno">13576</span>&#160;    *ppStatsString = pChars;</div><div class="line"><a name="l13577"></a><span class="lineno">13577</span>&#160;}</div><div class="line"><a name="l13578"></a><span class="lineno">13578</span>&#160;</div><div class="line"><a name="l13579"></a><span class="lineno">13579</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="l13580"></a><span class="lineno">13580</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13581"></a><span class="lineno">13581</span>&#160;    <span class="keywordtype">char</span>* pStatsString)</div><div class="line"><a name="l13582"></a><span class="lineno">13582</span>&#160;{</div><div class="line"><a name="l13583"></a><span class="lineno">13583</span>&#160;    <span class="keywordflow">if</span>(pStatsString != VMA_NULL)</div><div class="line"><a name="l13584"></a><span class="lineno">13584</span>&#160;    {</div><div class="line"><a name="l13585"></a><span class="lineno">13585</span>&#160;        VMA_ASSERT(allocator);</div><div class="line"><a name="l13586"></a><span class="lineno">13586</span>&#160;        <span class="keywordtype">size_t</span> len = strlen(pStatsString);</div><div class="line"><a name="l13587"></a><span class="lineno">13587</span>&#160;        vma_delete_array(allocator, pStatsString, len + 1);</div><div class="line"><a name="l13588"></a><span class="lineno">13588</span>&#160;    }</div><div class="line"><a name="l13589"></a><span class="lineno">13589</span>&#160;}</div><div class="line"><a name="l13590"></a><span class="lineno">13590</span>&#160;</div><div class="line"><a name="l13591"></a><span class="lineno">13591</span>&#160;<span class="preprocessor">#endif // #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l13592"></a><span class="lineno">13592</span>&#160;</div><div class="line"><a name="l13593"></a><span class="lineno">13593</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l13594"></a><span class="lineno">13594</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="l13595"></a><span class="lineno">13595</span>&#160;<span class="comment">*/</span></div><div class="line"><a name="l13596"></a><span class="lineno">13596</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l13597"></a><span class="lineno">13597</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13598"></a><span class="lineno">13598</span>&#160;    uint32_t memoryTypeBits,</div><div class="line"><a name="l13599"></a><span class="lineno">13599</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="l13600"></a><span class="lineno">13600</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l13601"></a><span class="lineno">13601</span>&#160;{</div><div class="line"><a name="l13602"></a><span class="lineno">13602</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l13603"></a><span class="lineno">13603</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l13604"></a><span class="lineno">13604</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l13605"></a><span class="lineno">13605</span>&#160;</div><div class="line"><a name="l13606"></a><span class="lineno">13606</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="l13607"></a><span class="lineno">13607</span>&#160;    {</div><div class="line"><a name="l13608"></a><span class="lineno">13608</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="l13609"></a><span class="lineno">13609</span>&#160;    }</div><div class="line"><a name="l13610"></a><span class="lineno">13610</span>&#160;    </div><div class="line"><a name="l13611"></a><span class="lineno">13611</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="l13612"></a><span class="lineno">13612</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="l13613"></a><span class="lineno">13613</span>&#160;</div><div class="line"><a name="l13614"></a><span class="lineno">13614</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> mapped = (pAllocationCreateInfo-&gt;<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="l13615"></a><span class="lineno">13615</span>&#160;    <span class="keywordflow">if</span>(mapped)</div><div class="line"><a name="l13616"></a><span class="lineno">13616</span>&#160;    {</div><div class="line"><a name="l13617"></a><span class="lineno">13617</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l13618"></a><span class="lineno">13618</span>&#160;    }</div><div class="line"><a name="l13619"></a><span class="lineno">13619</span>&#160;</div><div class="line"><a name="l13620"></a><span class="lineno">13620</span>&#160;    <span class="comment">// Convert usage to requiredFlags and preferredFlags.</span></div><div class="line"><a name="l13621"></a><span class="lineno">13621</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="l13622"></a><span class="lineno">13622</span>&#160;    {</div><div class="line"><a name="l13623"></a><span class="lineno">13623</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="l13624"></a><span class="lineno">13624</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13625"></a><span class="lineno">13625</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="l13626"></a><span class="lineno">13626</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l13627"></a><span class="lineno">13627</span>&#160;        {</div><div class="line"><a name="l13628"></a><span class="lineno">13628</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l13629"></a><span class="lineno">13629</span>&#160;        }</div><div class="line"><a name="l13630"></a><span class="lineno">13630</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13631"></a><span class="lineno">13631</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="l13632"></a><span class="lineno">13632</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;</div><div class="line"><a name="l13633"></a><span class="lineno">13633</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13634"></a><span class="lineno">13634</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="l13635"></a><span class="lineno">13635</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l13636"></a><span class="lineno">13636</span>&#160;        <span class="keywordflow">if</span>(!allocator-&gt;IsIntegratedGpu() || (preferredFlags &amp; VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)</div><div class="line"><a name="l13637"></a><span class="lineno">13637</span>&#160;        {</div><div class="line"><a name="l13638"></a><span class="lineno">13638</span>&#160;            preferredFlags |= VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;</div><div class="line"><a name="l13639"></a><span class="lineno">13639</span>&#160;        }</div><div class="line"><a name="l13640"></a><span class="lineno">13640</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13641"></a><span class="lineno">13641</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="l13642"></a><span class="lineno">13642</span>&#160;        requiredFlags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;</div><div class="line"><a name="l13643"></a><span class="lineno">13643</span>&#160;        preferredFlags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT;</div><div class="line"><a name="l13644"></a><span class="lineno">13644</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13645"></a><span class="lineno">13645</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l13646"></a><span class="lineno">13646</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l13647"></a><span class="lineno">13647</span>&#160;    }</div><div class="line"><a name="l13648"></a><span class="lineno">13648</span>&#160;</div><div class="line"><a name="l13649"></a><span class="lineno">13649</span>&#160;    *pMemoryTypeIndex = UINT32_MAX;</div><div class="line"><a name="l13650"></a><span class="lineno">13650</span>&#160;    uint32_t minCost = UINT32_MAX;</div><div class="line"><a name="l13651"></a><span class="lineno">13651</span>&#160;    <span class="keywordflow">for</span>(uint32_t memTypeIndex = 0, memTypeBit = 1;</div><div class="line"><a name="l13652"></a><span class="lineno">13652</span>&#160;        memTypeIndex &lt; allocator-&gt;GetMemoryTypeCount();</div><div class="line"><a name="l13653"></a><span class="lineno">13653</span>&#160;        ++memTypeIndex, memTypeBit &lt;&lt;= 1)</div><div class="line"><a name="l13654"></a><span class="lineno">13654</span>&#160;    {</div><div class="line"><a name="l13655"></a><span class="lineno">13655</span>&#160;        <span class="comment">// This memory type is acceptable according to memoryTypeBits bitmask.</span></div><div class="line"><a name="l13656"></a><span class="lineno">13656</span>&#160;        <span class="keywordflow">if</span>((memTypeBit &amp; memoryTypeBits) != 0)</div><div class="line"><a name="l13657"></a><span class="lineno">13657</span>&#160;        {</div><div class="line"><a name="l13658"></a><span class="lineno">13658</span>&#160;            <span class="keyword">const</span> VkMemoryPropertyFlags currFlags =</div><div class="line"><a name="l13659"></a><span class="lineno">13659</span>&#160;                allocator-&gt;m_MemProps.memoryTypes[memTypeIndex].propertyFlags;</div><div class="line"><a name="l13660"></a><span class="lineno">13660</span>&#160;            <span class="comment">// This memory type contains requiredFlags.</span></div><div class="line"><a name="l13661"></a><span class="lineno">13661</span>&#160;            <span class="keywordflow">if</span>((requiredFlags &amp; ~currFlags) == 0)</div><div class="line"><a name="l13662"></a><span class="lineno">13662</span>&#160;            {</div><div class="line"><a name="l13663"></a><span class="lineno">13663</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="l13664"></a><span class="lineno">13664</span>&#160;                uint32_t currCost = VmaCountBitsSet(preferredFlags &amp; ~currFlags);</div><div class="line"><a name="l13665"></a><span class="lineno">13665</span>&#160;                <span class="comment">// Remember memory type with lowest cost.</span></div><div class="line"><a name="l13666"></a><span class="lineno">13666</span>&#160;                <span class="keywordflow">if</span>(currCost &lt; minCost)</div><div class="line"><a name="l13667"></a><span class="lineno">13667</span>&#160;                {</div><div class="line"><a name="l13668"></a><span class="lineno">13668</span>&#160;                    *pMemoryTypeIndex = memTypeIndex;</div><div class="line"><a name="l13669"></a><span class="lineno">13669</span>&#160;                    <span class="keywordflow">if</span>(currCost == 0)</div><div class="line"><a name="l13670"></a><span class="lineno">13670</span>&#160;                    {</div><div class="line"><a name="l13671"></a><span class="lineno">13671</span>&#160;                        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l13672"></a><span class="lineno">13672</span>&#160;                    }</div><div class="line"><a name="l13673"></a><span class="lineno">13673</span>&#160;                    minCost = currCost;</div><div class="line"><a name="l13674"></a><span class="lineno">13674</span>&#160;                }</div><div class="line"><a name="l13675"></a><span class="lineno">13675</span>&#160;            }</div><div class="line"><a name="l13676"></a><span class="lineno">13676</span>&#160;        }</div><div class="line"><a name="l13677"></a><span class="lineno">13677</span>&#160;    }</div><div class="line"><a name="l13678"></a><span class="lineno">13678</span>&#160;    <span class="keywordflow">return</span> (*pMemoryTypeIndex != UINT32_MAX) ? VK_SUCCESS : VK_ERROR_FEATURE_NOT_PRESENT;</div><div class="line"><a name="l13679"></a><span class="lineno">13679</span>&#160;}</div><div class="line"><a name="l13680"></a><span class="lineno">13680</span>&#160;</div><div class="line"><a name="l13681"></a><span class="lineno">13681</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ae790ab9ffaf7667fb8f62523e6897888">vmaFindMemoryTypeIndexForBufferInfo</a>(</div><div class="line"><a name="l13682"></a><span class="lineno">13682</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13683"></a><span class="lineno">13683</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l13684"></a><span class="lineno">13684</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="l13685"></a><span class="lineno">13685</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l13686"></a><span class="lineno">13686</span>&#160;{</div><div class="line"><a name="l13687"></a><span class="lineno">13687</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l13688"></a><span class="lineno">13688</span>&#160;    VMA_ASSERT(pBufferCreateInfo != VMA_NULL);</div><div class="line"><a name="l13689"></a><span class="lineno">13689</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l13690"></a><span class="lineno">13690</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l13691"></a><span class="lineno">13691</span>&#160;</div><div class="line"><a name="l13692"></a><span class="lineno">13692</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l13693"></a><span class="lineno">13693</span>&#160;    VkBuffer hBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l13694"></a><span class="lineno">13694</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateBuffer(</div><div class="line"><a name="l13695"></a><span class="lineno">13695</span>&#160;        hDev, pBufferCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hBuffer);</div><div class="line"><a name="l13696"></a><span class="lineno">13696</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13697"></a><span class="lineno">13697</span>&#160;    {</div><div class="line"><a name="l13698"></a><span class="lineno">13698</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l13699"></a><span class="lineno">13699</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetBufferMemoryRequirements(</div><div class="line"><a name="l13700"></a><span class="lineno">13700</span>&#160;            hDev, hBuffer, &amp;memReq);</div><div class="line"><a name="l13701"></a><span class="lineno">13701</span>&#160;</div><div class="line"><a name="l13702"></a><span class="lineno">13702</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l13703"></a><span class="lineno">13703</span>&#160;            allocator,</div><div class="line"><a name="l13704"></a><span class="lineno">13704</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l13705"></a><span class="lineno">13705</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l13706"></a><span class="lineno">13706</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l13707"></a><span class="lineno">13707</span>&#160;</div><div class="line"><a name="l13708"></a><span class="lineno">13708</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyBuffer(</div><div class="line"><a name="l13709"></a><span class="lineno">13709</span>&#160;            hDev, hBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l13710"></a><span class="lineno">13710</span>&#160;    }</div><div class="line"><a name="l13711"></a><span class="lineno">13711</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13712"></a><span class="lineno">13712</span>&#160;}</div><div class="line"><a name="l13713"></a><span class="lineno">13713</span>&#160;</div><div class="line"><a name="l13714"></a><span class="lineno">13714</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a088da83d8eaf3ce9056d9ea0b981d472">vmaFindMemoryTypeIndexForImageInfo</a>(</div><div class="line"><a name="l13715"></a><span class="lineno">13715</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13716"></a><span class="lineno">13716</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l13717"></a><span class="lineno">13717</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="l13718"></a><span class="lineno">13718</span>&#160;    uint32_t* pMemoryTypeIndex)</div><div class="line"><a name="l13719"></a><span class="lineno">13719</span>&#160;{</div><div class="line"><a name="l13720"></a><span class="lineno">13720</span>&#160;    VMA_ASSERT(allocator != VK_NULL_HANDLE);</div><div class="line"><a name="l13721"></a><span class="lineno">13721</span>&#160;    VMA_ASSERT(pImageCreateInfo != VMA_NULL);</div><div class="line"><a name="l13722"></a><span class="lineno">13722</span>&#160;    VMA_ASSERT(pAllocationCreateInfo != VMA_NULL);</div><div class="line"><a name="l13723"></a><span class="lineno">13723</span>&#160;    VMA_ASSERT(pMemoryTypeIndex != VMA_NULL);</div><div class="line"><a name="l13724"></a><span class="lineno">13724</span>&#160;</div><div class="line"><a name="l13725"></a><span class="lineno">13725</span>&#160;    <span class="keyword">const</span> VkDevice hDev = allocator-&gt;m_hDevice;</div><div class="line"><a name="l13726"></a><span class="lineno">13726</span>&#160;    VkImage hImage = VK_NULL_HANDLE;</div><div class="line"><a name="l13727"></a><span class="lineno">13727</span>&#160;    VkResult res = allocator-&gt;GetVulkanFunctions().vkCreateImage(</div><div class="line"><a name="l13728"></a><span class="lineno">13728</span>&#160;        hDev, pImageCreateInfo, allocator-&gt;GetAllocationCallbacks(), &amp;hImage);</div><div class="line"><a name="l13729"></a><span class="lineno">13729</span>&#160;    <span class="keywordflow">if</span>(res == VK_SUCCESS)</div><div class="line"><a name="l13730"></a><span class="lineno">13730</span>&#160;    {</div><div class="line"><a name="l13731"></a><span class="lineno">13731</span>&#160;        VkMemoryRequirements memReq = {};</div><div class="line"><a name="l13732"></a><span class="lineno">13732</span>&#160;        allocator-&gt;GetVulkanFunctions().vkGetImageMemoryRequirements(</div><div class="line"><a name="l13733"></a><span class="lineno">13733</span>&#160;            hDev, hImage, &amp;memReq);</div><div class="line"><a name="l13734"></a><span class="lineno">13734</span>&#160;</div><div class="line"><a name="l13735"></a><span class="lineno">13735</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#aef15a94b58fbcb0fe706d5720e84a74a">vmaFindMemoryTypeIndex</a>(</div><div class="line"><a name="l13736"></a><span class="lineno">13736</span>&#160;            allocator,</div><div class="line"><a name="l13737"></a><span class="lineno">13737</span>&#160;            memReq.memoryTypeBits,</div><div class="line"><a name="l13738"></a><span class="lineno">13738</span>&#160;            pAllocationCreateInfo,</div><div class="line"><a name="l13739"></a><span class="lineno">13739</span>&#160;            pMemoryTypeIndex);</div><div class="line"><a name="l13740"></a><span class="lineno">13740</span>&#160;</div><div class="line"><a name="l13741"></a><span class="lineno">13741</span>&#160;        allocator-&gt;GetVulkanFunctions().vkDestroyImage(</div><div class="line"><a name="l13742"></a><span class="lineno">13742</span>&#160;            hDev, hImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l13743"></a><span class="lineno">13743</span>&#160;    }</div><div class="line"><a name="l13744"></a><span class="lineno">13744</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13745"></a><span class="lineno">13745</span>&#160;}</div><div class="line"><a name="l13746"></a><span class="lineno">13746</span>&#160;</div><div class="line"><a name="l13747"></a><span class="lineno">13747</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a5c8770ded7c59c8caac6de0c2cb00b50">vmaCreatePool</a>(</div><div class="line"><a name="l13748"></a><span class="lineno">13748</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13749"></a><span class="lineno">13749</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="l13750"></a><span class="lineno">13750</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a>* pPool)</div><div class="line"><a name="l13751"></a><span class="lineno">13751</span>&#160;{</div><div class="line"><a name="l13752"></a><span class="lineno">13752</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pCreateInfo &amp;&amp; pPool);</div><div class="line"><a name="l13753"></a><span class="lineno">13753</span>&#160;    </div><div class="line"><a name="l13754"></a><span class="lineno">13754</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreatePool&quot;</span>);</div><div class="line"><a name="l13755"></a><span class="lineno">13755</span>&#160;    </div><div class="line"><a name="l13756"></a><span class="lineno">13756</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13757"></a><span class="lineno">13757</span>&#160;    </div><div class="line"><a name="l13758"></a><span class="lineno">13758</span>&#160;    VkResult res = allocator-&gt;CreatePool(pCreateInfo, pPool);</div><div class="line"><a name="l13759"></a><span class="lineno">13759</span>&#160;    </div><div class="line"><a name="l13760"></a><span class="lineno">13760</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13761"></a><span class="lineno">13761</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13762"></a><span class="lineno">13762</span>&#160;    {</div><div class="line"><a name="l13763"></a><span class="lineno">13763</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreatePool(allocator-&gt;GetCurrentFrameIndex(), *pCreateInfo, *pPool);</div><div class="line"><a name="l13764"></a><span class="lineno">13764</span>&#160;    }</div><div class="line"><a name="l13765"></a><span class="lineno">13765</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13766"></a><span class="lineno">13766</span>&#160;    </div><div class="line"><a name="l13767"></a><span class="lineno">13767</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l13768"></a><span class="lineno">13768</span>&#160;}</div><div class="line"><a name="l13769"></a><span class="lineno">13769</span>&#160;</div><div class="line"><a name="l13770"></a><span class="lineno">13770</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="l13771"></a><span class="lineno">13771</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13772"></a><span class="lineno">13772</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l13773"></a><span class="lineno">13773</span>&#160;{</div><div class="line"><a name="l13774"></a><span class="lineno">13774</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l13775"></a><span class="lineno">13775</span>&#160;    </div><div class="line"><a name="l13776"></a><span class="lineno">13776</span>&#160;    <span class="keywordflow">if</span>(pool == VK_NULL_HANDLE)</div><div class="line"><a name="l13777"></a><span class="lineno">13777</span>&#160;    {</div><div class="line"><a name="l13778"></a><span class="lineno">13778</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l13779"></a><span class="lineno">13779</span>&#160;    }</div><div class="line"><a name="l13780"></a><span class="lineno">13780</span>&#160;    </div><div class="line"><a name="l13781"></a><span class="lineno">13781</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyPool&quot;</span>);</div><div class="line"><a name="l13782"></a><span class="lineno">13782</span>&#160;    </div><div class="line"><a name="l13783"></a><span class="lineno">13783</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13784"></a><span class="lineno">13784</span>&#160;    </div><div class="line"><a name="l13785"></a><span class="lineno">13785</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13786"></a><span class="lineno">13786</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13787"></a><span class="lineno">13787</span>&#160;    {</div><div class="line"><a name="l13788"></a><span class="lineno">13788</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyPool(allocator-&gt;GetCurrentFrameIndex(), pool);</div><div class="line"><a name="l13789"></a><span class="lineno">13789</span>&#160;    }</div><div class="line"><a name="l13790"></a><span class="lineno">13790</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13791"></a><span class="lineno">13791</span>&#160;</div><div class="line"><a name="l13792"></a><span class="lineno">13792</span>&#160;    allocator-&gt;DestroyPool(pool);</div><div class="line"><a name="l13793"></a><span class="lineno">13793</span>&#160;}</div><div class="line"><a name="l13794"></a><span class="lineno">13794</span>&#160;</div><div class="line"><a name="l13795"></a><span class="lineno">13795</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="l13796"></a><span class="lineno">13796</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13797"></a><span class="lineno">13797</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l13798"></a><span class="lineno">13798</span>&#160;    <a class="code" href="struct_vma_pool_stats.html">VmaPoolStats</a>* pPoolStats)</div><div class="line"><a name="l13799"></a><span class="lineno">13799</span>&#160;{</div><div class="line"><a name="l13800"></a><span class="lineno">13800</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool &amp;&amp; pPoolStats);</div><div class="line"><a name="l13801"></a><span class="lineno">13801</span>&#160;</div><div class="line"><a name="l13802"></a><span class="lineno">13802</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13803"></a><span class="lineno">13803</span>&#160;</div><div class="line"><a name="l13804"></a><span class="lineno">13804</span>&#160;    allocator-&gt;GetPoolStats(pool, pPoolStats);</div><div class="line"><a name="l13805"></a><span class="lineno">13805</span>&#160;}</div><div class="line"><a name="l13806"></a><span class="lineno">13806</span>&#160;</div><div class="line"><a name="l13807"></a><span class="lineno">13807</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="l13808"></a><span class="lineno">13808</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13809"></a><span class="lineno">13809</span>&#160;    <a class="code" href="struct_vma_pool.html">VmaPool</a> pool,</div><div class="line"><a name="l13810"></a><span class="lineno">13810</span>&#160;    <span class="keywordtype">size_t</span>* pLostAllocationCount)</div><div class="line"><a name="l13811"></a><span class="lineno">13811</span>&#160;{</div><div class="line"><a name="l13812"></a><span class="lineno">13812</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l13813"></a><span class="lineno">13813</span>&#160;</div><div class="line"><a name="l13814"></a><span class="lineno">13814</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13815"></a><span class="lineno">13815</span>&#160;</div><div class="line"><a name="l13816"></a><span class="lineno">13816</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13817"></a><span class="lineno">13817</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13818"></a><span class="lineno">13818</span>&#160;    {</div><div class="line"><a name="l13819"></a><span class="lineno">13819</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMakePoolAllocationsLost(allocator-&gt;GetCurrentFrameIndex(), pool);</div><div class="line"><a name="l13820"></a><span class="lineno">13820</span>&#160;    }</div><div class="line"><a name="l13821"></a><span class="lineno">13821</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13822"></a><span class="lineno">13822</span>&#160;</div><div class="line"><a name="l13823"></a><span class="lineno">13823</span>&#160;    allocator-&gt;MakePoolAllocationsLost(pool, pLostAllocationCount);</div><div class="line"><a name="l13824"></a><span class="lineno">13824</span>&#160;}</div><div class="line"><a name="l13825"></a><span class="lineno">13825</span>&#160;</div><div class="line"><a name="l13826"></a><span class="lineno">13826</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_pool.html">VmaPool</a> pool)</div><div class="line"><a name="l13827"></a><span class="lineno">13827</span>&#160;{</div><div class="line"><a name="l13828"></a><span class="lineno">13828</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pool);</div><div class="line"><a name="l13829"></a><span class="lineno">13829</span>&#160;</div><div class="line"><a name="l13830"></a><span class="lineno">13830</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13831"></a><span class="lineno">13831</span>&#160;</div><div class="line"><a name="l13832"></a><span class="lineno">13832</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckPoolCorruption&quot;</span>);</div><div class="line"><a name="l13833"></a><span class="lineno">13833</span>&#160;</div><div class="line"><a name="l13834"></a><span class="lineno">13834</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckPoolCorruption(pool);</div><div class="line"><a name="l13835"></a><span class="lineno">13835</span>&#160;}</div><div class="line"><a name="l13836"></a><span class="lineno">13836</span>&#160;</div><div class="line"><a name="l13837"></a><span class="lineno">13837</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#abf28077dbf82d0908b8acbe8ee8dd9b8">vmaAllocateMemory</a>(</div><div class="line"><a name="l13838"></a><span class="lineno">13838</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13839"></a><span class="lineno">13839</span>&#160;    <span class="keyword">const</span> VkMemoryRequirements* pVkMemoryRequirements,</div><div class="line"><a name="l13840"></a><span class="lineno">13840</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="l13841"></a><span class="lineno">13841</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l13842"></a><span class="lineno">13842</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l13843"></a><span class="lineno">13843</span>&#160;{</div><div class="line"><a name="l13844"></a><span class="lineno">13844</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pVkMemoryRequirements &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l13845"></a><span class="lineno">13845</span>&#160;</div><div class="line"><a name="l13846"></a><span class="lineno">13846</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemory&quot;</span>);</div><div class="line"><a name="l13847"></a><span class="lineno">13847</span>&#160;</div><div class="line"><a name="l13848"></a><span class="lineno">13848</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13849"></a><span class="lineno">13849</span>&#160;</div><div class="line"><a name="l13850"></a><span class="lineno">13850</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l13851"></a><span class="lineno">13851</span>&#160;        *pVkMemoryRequirements,</div><div class="line"><a name="l13852"></a><span class="lineno">13852</span>&#160;        <span class="keyword">false</span>, <span class="comment">// requiresDedicatedAllocation</span></div><div class="line"><a name="l13853"></a><span class="lineno">13853</span>&#160;        <span class="keyword">false</span>, <span class="comment">// prefersDedicatedAllocation</span></div><div class="line"><a name="l13854"></a><span class="lineno">13854</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l13855"></a><span class="lineno">13855</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l13856"></a><span class="lineno">13856</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l13857"></a><span class="lineno">13857</span>&#160;        VMA_SUBALLOCATION_TYPE_UNKNOWN,</div><div class="line"><a name="l13858"></a><span class="lineno">13858</span>&#160;        pAllocation);</div><div class="line"><a name="l13859"></a><span class="lineno">13859</span>&#160;</div><div class="line"><a name="l13860"></a><span class="lineno">13860</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13861"></a><span class="lineno">13861</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13862"></a><span class="lineno">13862</span>&#160;    {</div><div class="line"><a name="l13863"></a><span class="lineno">13863</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemory(</div><div class="line"><a name="l13864"></a><span class="lineno">13864</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l13865"></a><span class="lineno">13865</span>&#160;            *pVkMemoryRequirements,</div><div class="line"><a name="l13866"></a><span class="lineno">13866</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l13867"></a><span class="lineno">13867</span>&#160;            *pAllocation);</div><div class="line"><a name="l13868"></a><span class="lineno">13868</span>&#160;    }</div><div class="line"><a name="l13869"></a><span class="lineno">13869</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13870"></a><span class="lineno">13870</span>&#160;        </div><div class="line"><a name="l13871"></a><span class="lineno">13871</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l13872"></a><span class="lineno">13872</span>&#160;    {</div><div class="line"><a name="l13873"></a><span class="lineno">13873</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l13874"></a><span class="lineno">13874</span>&#160;    }</div><div class="line"><a name="l13875"></a><span class="lineno">13875</span>&#160;</div><div class="line"><a name="l13876"></a><span class="lineno">13876</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l13877"></a><span class="lineno">13877</span>&#160;}</div><div class="line"><a name="l13878"></a><span class="lineno">13878</span>&#160;</div><div class="line"><a name="l13879"></a><span class="lineno">13879</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a7fdf64415b6c3d83c454f28d2c53df7b">vmaAllocateMemoryForBuffer</a>(</div><div class="line"><a name="l13880"></a><span class="lineno">13880</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13881"></a><span class="lineno">13881</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l13882"></a><span class="lineno">13882</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="l13883"></a><span class="lineno">13883</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l13884"></a><span class="lineno">13884</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l13885"></a><span class="lineno">13885</span>&#160;{</div><div class="line"><a name="l13886"></a><span class="lineno">13886</span>&#160;    VMA_ASSERT(allocator &amp;&amp; buffer != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l13887"></a><span class="lineno">13887</span>&#160;</div><div class="line"><a name="l13888"></a><span class="lineno">13888</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForBuffer&quot;</span>);</div><div class="line"><a name="l13889"></a><span class="lineno">13889</span>&#160;</div><div class="line"><a name="l13890"></a><span class="lineno">13890</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13891"></a><span class="lineno">13891</span>&#160;</div><div class="line"><a name="l13892"></a><span class="lineno">13892</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l13893"></a><span class="lineno">13893</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l13894"></a><span class="lineno">13894</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l13895"></a><span class="lineno">13895</span>&#160;    allocator-&gt;GetBufferMemoryRequirements(buffer, vkMemReq,</div><div class="line"><a name="l13896"></a><span class="lineno">13896</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l13897"></a><span class="lineno">13897</span>&#160;        prefersDedicatedAllocation);</div><div class="line"><a name="l13898"></a><span class="lineno">13898</span>&#160;</div><div class="line"><a name="l13899"></a><span class="lineno">13899</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l13900"></a><span class="lineno">13900</span>&#160;        vkMemReq,</div><div class="line"><a name="l13901"></a><span class="lineno">13901</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l13902"></a><span class="lineno">13902</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l13903"></a><span class="lineno">13903</span>&#160;        buffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l13904"></a><span class="lineno">13904</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l13905"></a><span class="lineno">13905</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l13906"></a><span class="lineno">13906</span>&#160;        VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l13907"></a><span class="lineno">13907</span>&#160;        pAllocation);</div><div class="line"><a name="l13908"></a><span class="lineno">13908</span>&#160;</div><div class="line"><a name="l13909"></a><span class="lineno">13909</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13910"></a><span class="lineno">13910</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13911"></a><span class="lineno">13911</span>&#160;    {</div><div class="line"><a name="l13912"></a><span class="lineno">13912</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForBuffer(</div><div class="line"><a name="l13913"></a><span class="lineno">13913</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l13914"></a><span class="lineno">13914</span>&#160;            vkMemReq,</div><div class="line"><a name="l13915"></a><span class="lineno">13915</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l13916"></a><span class="lineno">13916</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l13917"></a><span class="lineno">13917</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l13918"></a><span class="lineno">13918</span>&#160;            *pAllocation);</div><div class="line"><a name="l13919"></a><span class="lineno">13919</span>&#160;    }</div><div class="line"><a name="l13920"></a><span class="lineno">13920</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13921"></a><span class="lineno">13921</span>&#160;</div><div class="line"><a name="l13922"></a><span class="lineno">13922</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l13923"></a><span class="lineno">13923</span>&#160;    {</div><div class="line"><a name="l13924"></a><span class="lineno">13924</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l13925"></a><span class="lineno">13925</span>&#160;    }</div><div class="line"><a name="l13926"></a><span class="lineno">13926</span>&#160;</div><div class="line"><a name="l13927"></a><span class="lineno">13927</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l13928"></a><span class="lineno">13928</span>&#160;}</div><div class="line"><a name="l13929"></a><span class="lineno">13929</span>&#160;</div><div class="line"><a name="l13930"></a><span class="lineno">13930</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a0faa3f9e5fb233d29d1e00390650febb">vmaAllocateMemoryForImage</a>(</div><div class="line"><a name="l13931"></a><span class="lineno">13931</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13932"></a><span class="lineno">13932</span>&#160;    VkImage image,</div><div class="line"><a name="l13933"></a><span class="lineno">13933</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="l13934"></a><span class="lineno">13934</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l13935"></a><span class="lineno">13935</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l13936"></a><span class="lineno">13936</span>&#160;{</div><div class="line"><a name="l13937"></a><span class="lineno">13937</span>&#160;    VMA_ASSERT(allocator &amp;&amp; image != VK_NULL_HANDLE &amp;&amp; pCreateInfo &amp;&amp; pAllocation);</div><div class="line"><a name="l13938"></a><span class="lineno">13938</span>&#160;</div><div class="line"><a name="l13939"></a><span class="lineno">13939</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaAllocateMemoryForImage&quot;</span>);</div><div class="line"><a name="l13940"></a><span class="lineno">13940</span>&#160;</div><div class="line"><a name="l13941"></a><span class="lineno">13941</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13942"></a><span class="lineno">13942</span>&#160;</div><div class="line"><a name="l13943"></a><span class="lineno">13943</span>&#160;    VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l13944"></a><span class="lineno">13944</span>&#160;    <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l13945"></a><span class="lineno">13945</span>&#160;    <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l13946"></a><span class="lineno">13946</span>&#160;    allocator-&gt;GetImageMemoryRequirements(image, vkMemReq,</div><div class="line"><a name="l13947"></a><span class="lineno">13947</span>&#160;        requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l13948"></a><span class="lineno">13948</span>&#160;</div><div class="line"><a name="l13949"></a><span class="lineno">13949</span>&#160;    VkResult result = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l13950"></a><span class="lineno">13950</span>&#160;        vkMemReq,</div><div class="line"><a name="l13951"></a><span class="lineno">13951</span>&#160;        requiresDedicatedAllocation,</div><div class="line"><a name="l13952"></a><span class="lineno">13952</span>&#160;        prefersDedicatedAllocation,</div><div class="line"><a name="l13953"></a><span class="lineno">13953</span>&#160;        VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l13954"></a><span class="lineno">13954</span>&#160;        image, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l13955"></a><span class="lineno">13955</span>&#160;        *pCreateInfo,</div><div class="line"><a name="l13956"></a><span class="lineno">13956</span>&#160;        VMA_SUBALLOCATION_TYPE_IMAGE_UNKNOWN,</div><div class="line"><a name="l13957"></a><span class="lineno">13957</span>&#160;        pAllocation);</div><div class="line"><a name="l13958"></a><span class="lineno">13958</span>&#160;</div><div class="line"><a name="l13959"></a><span class="lineno">13959</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13960"></a><span class="lineno">13960</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13961"></a><span class="lineno">13961</span>&#160;    {</div><div class="line"><a name="l13962"></a><span class="lineno">13962</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordAllocateMemoryForImage(</div><div class="line"><a name="l13963"></a><span class="lineno">13963</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l13964"></a><span class="lineno">13964</span>&#160;            vkMemReq,</div><div class="line"><a name="l13965"></a><span class="lineno">13965</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l13966"></a><span class="lineno">13966</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l13967"></a><span class="lineno">13967</span>&#160;            *pCreateInfo,</div><div class="line"><a name="l13968"></a><span class="lineno">13968</span>&#160;            *pAllocation);</div><div class="line"><a name="l13969"></a><span class="lineno">13969</span>&#160;    }</div><div class="line"><a name="l13970"></a><span class="lineno">13970</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l13971"></a><span class="lineno">13971</span>&#160;</div><div class="line"><a name="l13972"></a><span class="lineno">13972</span>&#160;    <span class="keywordflow">if</span>(pAllocationInfo &amp;&amp; result == VK_SUCCESS)</div><div class="line"><a name="l13973"></a><span class="lineno">13973</span>&#160;    {</div><div class="line"><a name="l13974"></a><span class="lineno">13974</span>&#160;        allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l13975"></a><span class="lineno">13975</span>&#160;    }</div><div class="line"><a name="l13976"></a><span class="lineno">13976</span>&#160;</div><div class="line"><a name="l13977"></a><span class="lineno">13977</span>&#160;    <span class="keywordflow">return</span> result;</div><div class="line"><a name="l13978"></a><span class="lineno">13978</span>&#160;}</div><div class="line"><a name="l13979"></a><span class="lineno">13979</span>&#160;</div><div class="line"><a name="l13980"></a><span class="lineno">13980</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="l13981"></a><span class="lineno">13981</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l13982"></a><span class="lineno">13982</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l13983"></a><span class="lineno">13983</span>&#160;{</div><div class="line"><a name="l13984"></a><span class="lineno">13984</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l13985"></a><span class="lineno">13985</span>&#160;    </div><div class="line"><a name="l13986"></a><span class="lineno">13986</span>&#160;    <span class="keywordflow">if</span>(allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l13987"></a><span class="lineno">13987</span>&#160;    {</div><div class="line"><a name="l13988"></a><span class="lineno">13988</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l13989"></a><span class="lineno">13989</span>&#160;    }</div><div class="line"><a name="l13990"></a><span class="lineno">13990</span>&#160;    </div><div class="line"><a name="l13991"></a><span class="lineno">13991</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFreeMemory&quot;</span>);</div><div class="line"><a name="l13992"></a><span class="lineno">13992</span>&#160;    </div><div class="line"><a name="l13993"></a><span class="lineno">13993</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l13994"></a><span class="lineno">13994</span>&#160;</div><div class="line"><a name="l13995"></a><span class="lineno">13995</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l13996"></a><span class="lineno">13996</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l13997"></a><span class="lineno">13997</span>&#160;    {</div><div class="line"><a name="l13998"></a><span class="lineno">13998</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFreeMemory(</div><div class="line"><a name="l13999"></a><span class="lineno">13999</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14000"></a><span class="lineno">14000</span>&#160;            allocation);</div><div class="line"><a name="l14001"></a><span class="lineno">14001</span>&#160;    }</div><div class="line"><a name="l14002"></a><span class="lineno">14002</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14003"></a><span class="lineno">14003</span>&#160;    </div><div class="line"><a name="l14004"></a><span class="lineno">14004</span>&#160;    allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l14005"></a><span class="lineno">14005</span>&#160;}</div><div class="line"><a name="l14006"></a><span class="lineno">14006</span>&#160;</div><div class="line"><a name="l14007"></a><span class="lineno">14007</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="l14008"></a><span class="lineno">14008</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14009"></a><span class="lineno">14009</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14010"></a><span class="lineno">14010</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l14011"></a><span class="lineno">14011</span>&#160;{</div><div class="line"><a name="l14012"></a><span class="lineno">14012</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; pAllocationInfo);</div><div class="line"><a name="l14013"></a><span class="lineno">14013</span>&#160;</div><div class="line"><a name="l14014"></a><span class="lineno">14014</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14015"></a><span class="lineno">14015</span>&#160;</div><div class="line"><a name="l14016"></a><span class="lineno">14016</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14017"></a><span class="lineno">14017</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14018"></a><span class="lineno">14018</span>&#160;    {</div><div class="line"><a name="l14019"></a><span class="lineno">14019</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordGetAllocationInfo(</div><div class="line"><a name="l14020"></a><span class="lineno">14020</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14021"></a><span class="lineno">14021</span>&#160;            allocation);</div><div class="line"><a name="l14022"></a><span class="lineno">14022</span>&#160;    }</div><div class="line"><a name="l14023"></a><span class="lineno">14023</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14024"></a><span class="lineno">14024</span>&#160;</div><div class="line"><a name="l14025"></a><span class="lineno">14025</span>&#160;    allocator-&gt;GetAllocationInfo(allocation, pAllocationInfo);</div><div class="line"><a name="l14026"></a><span class="lineno">14026</span>&#160;}</div><div class="line"><a name="l14027"></a><span class="lineno">14027</span>&#160;</div><div class="line"><a name="l14028"></a><span class="lineno">14028</span>&#160;VkBool32 <a class="code" href="vk__mem__alloc_8h.html#a43d8ba9673c846f049089a5029d5c73a">vmaTouchAllocation</a>(</div><div class="line"><a name="l14029"></a><span class="lineno">14029</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14030"></a><span class="lineno">14030</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14031"></a><span class="lineno">14031</span>&#160;{</div><div class="line"><a name="l14032"></a><span class="lineno">14032</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14033"></a><span class="lineno">14033</span>&#160;</div><div class="line"><a name="l14034"></a><span class="lineno">14034</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14035"></a><span class="lineno">14035</span>&#160;</div><div class="line"><a name="l14036"></a><span class="lineno">14036</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14037"></a><span class="lineno">14037</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14038"></a><span class="lineno">14038</span>&#160;    {</div><div class="line"><a name="l14039"></a><span class="lineno">14039</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordTouchAllocation(</div><div class="line"><a name="l14040"></a><span class="lineno">14040</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14041"></a><span class="lineno">14041</span>&#160;            allocation);</div><div class="line"><a name="l14042"></a><span class="lineno">14042</span>&#160;    }</div><div class="line"><a name="l14043"></a><span class="lineno">14043</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14044"></a><span class="lineno">14044</span>&#160;</div><div class="line"><a name="l14045"></a><span class="lineno">14045</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;TouchAllocation(allocation);</div><div class="line"><a name="l14046"></a><span class="lineno">14046</span>&#160;}</div><div class="line"><a name="l14047"></a><span class="lineno">14047</span>&#160;</div><div class="line"><a name="l14048"></a><span class="lineno">14048</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="l14049"></a><span class="lineno">14049</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14050"></a><span class="lineno">14050</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14051"></a><span class="lineno">14051</span>&#160;    <span class="keywordtype">void</span>* pUserData)</div><div class="line"><a name="l14052"></a><span class="lineno">14052</span>&#160;{</div><div class="line"><a name="l14053"></a><span class="lineno">14053</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14054"></a><span class="lineno">14054</span>&#160;</div><div class="line"><a name="l14055"></a><span class="lineno">14055</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14056"></a><span class="lineno">14056</span>&#160;</div><div class="line"><a name="l14057"></a><span class="lineno">14057</span>&#160;    allocation-&gt;SetUserData(allocator, pUserData);</div><div class="line"><a name="l14058"></a><span class="lineno">14058</span>&#160;</div><div class="line"><a name="l14059"></a><span class="lineno">14059</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14060"></a><span class="lineno">14060</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14061"></a><span class="lineno">14061</span>&#160;    {</div><div class="line"><a name="l14062"></a><span class="lineno">14062</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordSetAllocationUserData(</div><div class="line"><a name="l14063"></a><span class="lineno">14063</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14064"></a><span class="lineno">14064</span>&#160;            allocation,</div><div class="line"><a name="l14065"></a><span class="lineno">14065</span>&#160;            pUserData);</div><div class="line"><a name="l14066"></a><span class="lineno">14066</span>&#160;    }</div><div class="line"><a name="l14067"></a><span class="lineno">14067</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14068"></a><span class="lineno">14068</span>&#160;}</div><div class="line"><a name="l14069"></a><span class="lineno">14069</span>&#160;</div><div class="line"><a name="l14070"></a><span class="lineno">14070</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="l14071"></a><span class="lineno">14071</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14072"></a><span class="lineno">14072</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation)</div><div class="line"><a name="l14073"></a><span class="lineno">14073</span>&#160;{</div><div class="line"><a name="l14074"></a><span class="lineno">14074</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pAllocation);</div><div class="line"><a name="l14075"></a><span class="lineno">14075</span>&#160;</div><div class="line"><a name="l14076"></a><span class="lineno">14076</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK;</div><div class="line"><a name="l14077"></a><span class="lineno">14077</span>&#160;</div><div class="line"><a name="l14078"></a><span class="lineno">14078</span>&#160;    allocator-&gt;CreateLostAllocation(pAllocation);</div><div class="line"><a name="l14079"></a><span class="lineno">14079</span>&#160;</div><div class="line"><a name="l14080"></a><span class="lineno">14080</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14081"></a><span class="lineno">14081</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14082"></a><span class="lineno">14082</span>&#160;    {</div><div class="line"><a name="l14083"></a><span class="lineno">14083</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordCreateLostAllocation(</div><div class="line"><a name="l14084"></a><span class="lineno">14084</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14085"></a><span class="lineno">14085</span>&#160;            *pAllocation);</div><div class="line"><a name="l14086"></a><span class="lineno">14086</span>&#160;    }</div><div class="line"><a name="l14087"></a><span class="lineno">14087</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14088"></a><span class="lineno">14088</span>&#160;}</div><div class="line"><a name="l14089"></a><span class="lineno">14089</span>&#160;</div><div class="line"><a name="l14090"></a><span class="lineno">14090</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ad5bd1243512d099706de88168992f069">vmaMapMemory</a>(</div><div class="line"><a name="l14091"></a><span class="lineno">14091</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14092"></a><span class="lineno">14092</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14093"></a><span class="lineno">14093</span>&#160;    <span class="keywordtype">void</span>** ppData)</div><div class="line"><a name="l14094"></a><span class="lineno">14094</span>&#160;{</div><div class="line"><a name="l14095"></a><span class="lineno">14095</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; ppData);</div><div class="line"><a name="l14096"></a><span class="lineno">14096</span>&#160;</div><div class="line"><a name="l14097"></a><span class="lineno">14097</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14098"></a><span class="lineno">14098</span>&#160;</div><div class="line"><a name="l14099"></a><span class="lineno">14099</span>&#160;    VkResult res = allocator-&gt;Map(allocation, ppData);</div><div class="line"><a name="l14100"></a><span class="lineno">14100</span>&#160;</div><div class="line"><a name="l14101"></a><span class="lineno">14101</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14102"></a><span class="lineno">14102</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14103"></a><span class="lineno">14103</span>&#160;    {</div><div class="line"><a name="l14104"></a><span class="lineno">14104</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordMapMemory(</div><div class="line"><a name="l14105"></a><span class="lineno">14105</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14106"></a><span class="lineno">14106</span>&#160;            allocation);</div><div class="line"><a name="l14107"></a><span class="lineno">14107</span>&#160;    }</div><div class="line"><a name="l14108"></a><span class="lineno">14108</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14109"></a><span class="lineno">14109</span>&#160;</div><div class="line"><a name="l14110"></a><span class="lineno">14110</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14111"></a><span class="lineno">14111</span>&#160;}</div><div class="line"><a name="l14112"></a><span class="lineno">14112</span>&#160;</div><div class="line"><a name="l14113"></a><span class="lineno">14113</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="l14114"></a><span class="lineno">14114</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14115"></a><span class="lineno">14115</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14116"></a><span class="lineno">14116</span>&#160;{</div><div class="line"><a name="l14117"></a><span class="lineno">14117</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14118"></a><span class="lineno">14118</span>&#160;</div><div class="line"><a name="l14119"></a><span class="lineno">14119</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14120"></a><span class="lineno">14120</span>&#160;</div><div class="line"><a name="l14121"></a><span class="lineno">14121</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14122"></a><span class="lineno">14122</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14123"></a><span class="lineno">14123</span>&#160;    {</div><div class="line"><a name="l14124"></a><span class="lineno">14124</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordUnmapMemory(</div><div class="line"><a name="l14125"></a><span class="lineno">14125</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14126"></a><span class="lineno">14126</span>&#160;            allocation);</div><div class="line"><a name="l14127"></a><span class="lineno">14127</span>&#160;    }</div><div class="line"><a name="l14128"></a><span class="lineno">14128</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14129"></a><span class="lineno">14129</span>&#160;</div><div class="line"><a name="l14130"></a><span class="lineno">14130</span>&#160;    allocator-&gt;Unmap(allocation);</div><div class="line"><a name="l14131"></a><span class="lineno">14131</span>&#160;}</div><div class="line"><a name="l14132"></a><span class="lineno">14132</span>&#160;</div><div class="line"><a name="l14133"></a><span class="lineno">14133</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l14134"></a><span class="lineno">14134</span>&#160;{</div><div class="line"><a name="l14135"></a><span class="lineno">14135</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14136"></a><span class="lineno">14136</span>&#160;</div><div class="line"><a name="l14137"></a><span class="lineno">14137</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaFlushAllocation&quot;</span>);</div><div class="line"><a name="l14138"></a><span class="lineno">14138</span>&#160;</div><div class="line"><a name="l14139"></a><span class="lineno">14139</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14140"></a><span class="lineno">14140</span>&#160;</div><div class="line"><a name="l14141"></a><span class="lineno">14141</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_FLUSH);</div><div class="line"><a name="l14142"></a><span class="lineno">14142</span>&#160;</div><div class="line"><a name="l14143"></a><span class="lineno">14143</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14144"></a><span class="lineno">14144</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14145"></a><span class="lineno">14145</span>&#160;    {</div><div class="line"><a name="l14146"></a><span class="lineno">14146</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordFlushAllocation(</div><div class="line"><a name="l14147"></a><span class="lineno">14147</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14148"></a><span class="lineno">14148</span>&#160;            allocation, offset, size);</div><div class="line"><a name="l14149"></a><span class="lineno">14149</span>&#160;    }</div><div class="line"><a name="l14150"></a><span class="lineno">14150</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14151"></a><span class="lineno">14151</span>&#160;}</div><div class="line"><a name="l14152"></a><span class="lineno">14152</span>&#160;</div><div class="line"><a name="l14153"></a><span class="lineno">14153</span>&#160;<span class="keywordtype">void</span> <a class="code" href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="line"><a name="l14154"></a><span class="lineno">14154</span>&#160;{</div><div class="line"><a name="l14155"></a><span class="lineno">14155</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation);</div><div class="line"><a name="l14156"></a><span class="lineno">14156</span>&#160;</div><div class="line"><a name="l14157"></a><span class="lineno">14157</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaInvalidateAllocation&quot;</span>);</div><div class="line"><a name="l14158"></a><span class="lineno">14158</span>&#160;</div><div class="line"><a name="l14159"></a><span class="lineno">14159</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14160"></a><span class="lineno">14160</span>&#160;</div><div class="line"><a name="l14161"></a><span class="lineno">14161</span>&#160;    allocator-&gt;FlushOrInvalidateAllocation(allocation, offset, size, VMA_CACHE_INVALIDATE);</div><div class="line"><a name="l14162"></a><span class="lineno">14162</span>&#160;</div><div class="line"><a name="l14163"></a><span class="lineno">14163</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14164"></a><span class="lineno">14164</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14165"></a><span class="lineno">14165</span>&#160;    {</div><div class="line"><a name="l14166"></a><span class="lineno">14166</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordInvalidateAllocation(</div><div class="line"><a name="l14167"></a><span class="lineno">14167</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14168"></a><span class="lineno">14168</span>&#160;            allocation, offset, size);</div><div class="line"><a name="l14169"></a><span class="lineno">14169</span>&#160;    }</div><div class="line"><a name="l14170"></a><span class="lineno">14170</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14171"></a><span class="lineno">14171</span>&#160;}</div><div class="line"><a name="l14172"></a><span class="lineno">14172</span>&#160;</div><div class="line"><a name="l14173"></a><span class="lineno">14173</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a>(<a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator, uint32_t memoryTypeBits)</div><div class="line"><a name="l14174"></a><span class="lineno">14174</span>&#160;{</div><div class="line"><a name="l14175"></a><span class="lineno">14175</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l14176"></a><span class="lineno">14176</span>&#160;</div><div class="line"><a name="l14177"></a><span class="lineno">14177</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCheckCorruption&quot;</span>);</div><div class="line"><a name="l14178"></a><span class="lineno">14178</span>&#160;</div><div class="line"><a name="l14179"></a><span class="lineno">14179</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14180"></a><span class="lineno">14180</span>&#160;</div><div class="line"><a name="l14181"></a><span class="lineno">14181</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;CheckCorruption(memoryTypeBits);</div><div class="line"><a name="l14182"></a><span class="lineno">14182</span>&#160;}</div><div class="line"><a name="l14183"></a><span class="lineno">14183</span>&#160;</div><div class="line"><a name="l14184"></a><span class="lineno">14184</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6aced90fcc7b39882b6654a740a0b9bb">vmaDefragment</a>(</div><div class="line"><a name="l14185"></a><span class="lineno">14185</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14186"></a><span class="lineno">14186</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocations,</div><div class="line"><a name="l14187"></a><span class="lineno">14187</span>&#160;    <span class="keywordtype">size_t</span> allocationCount,</div><div class="line"><a name="l14188"></a><span class="lineno">14188</span>&#160;    VkBool32* pAllocationsChanged,</div><div class="line"><a name="l14189"></a><span class="lineno">14189</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="l14190"></a><span class="lineno">14190</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pDefragmentationStats)</div><div class="line"><a name="l14191"></a><span class="lineno">14191</span>&#160;{</div><div class="line"><a name="l14192"></a><span class="lineno">14192</span>&#160;    <span class="comment">// Deprecated interface, reimplemented using new one.</span></div><div class="line"><a name="l14193"></a><span class="lineno">14193</span>&#160;</div><div class="line"><a name="l14194"></a><span class="lineno">14194</span>&#160;    <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a> info2 = {};</div><div class="line"><a name="l14195"></a><span class="lineno">14195</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">allocationCount</a> = allocationCount;</div><div class="line"><a name="l14196"></a><span class="lineno">14196</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">pAllocations</a> = pAllocations;</div><div class="line"><a name="l14197"></a><span class="lineno">14197</span>&#160;    info2.<a class="code" href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">pAllocationsChanged</a> = pAllocationsChanged;</div><div class="line"><a name="l14198"></a><span class="lineno">14198</span>&#160;    <span class="keywordflow">if</span>(pDefragmentationInfo != VMA_NULL)</div><div class="line"><a name="l14199"></a><span class="lineno">14199</span>&#160;    {</div><div class="line"><a name="l14200"></a><span class="lineno">14200</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#aa7c7304e13c71f604c907196c4e28fbc">maxAllocationsToMove</a>;</div><div class="line"><a name="l14201"></a><span class="lineno">14201</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = pDefragmentationInfo-&gt;<a class="code" href="struct_vma_defragmentation_info.html#acb311c940a777270e67e1b81c5ab6a1d">maxBytesToMove</a>;</div><div class="line"><a name="l14202"></a><span class="lineno">14202</span>&#160;    }</div><div class="line"><a name="l14203"></a><span class="lineno">14203</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l14204"></a><span class="lineno">14204</span>&#160;    {</div><div class="line"><a name="l14205"></a><span class="lineno">14205</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">maxCpuAllocationsToMove</a> = UINT32_MAX;</div><div class="line"><a name="l14206"></a><span class="lineno">14206</span>&#160;        info2.<a class="code" href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">maxCpuBytesToMove</a> = VK_WHOLE_SIZE;</div><div class="line"><a name="l14207"></a><span class="lineno">14207</span>&#160;    }</div><div class="line"><a name="l14208"></a><span class="lineno">14208</span>&#160;    <span class="comment">// info2.flags, maxGpuAllocationsToMove, maxGpuBytesToMove, commandBuffer deliberately left zero.</span></div><div class="line"><a name="l14209"></a><span class="lineno">14209</span>&#160;</div><div class="line"><a name="l14210"></a><span class="lineno">14210</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> ctx;</div><div class="line"><a name="l14211"></a><span class="lineno">14211</span>&#160;    VkResult res = <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(allocator, &amp;info2, pDefragmentationStats, &amp;ctx);</div><div class="line"><a name="l14212"></a><span class="lineno">14212</span>&#160;    <span class="keywordflow">if</span>(res == VK_NOT_READY)</div><div class="line"><a name="l14213"></a><span class="lineno">14213</span>&#160;    {</div><div class="line"><a name="l14214"></a><span class="lineno">14214</span>&#160;        res = <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>( allocator, ctx);</div><div class="line"><a name="l14215"></a><span class="lineno">14215</span>&#160;    }</div><div class="line"><a name="l14216"></a><span class="lineno">14216</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14217"></a><span class="lineno">14217</span>&#160;}</div><div class="line"><a name="l14218"></a><span class="lineno">14218</span>&#160;</div><div class="line"><a name="l14219"></a><span class="lineno">14219</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a>(</div><div class="line"><a name="l14220"></a><span class="lineno">14220</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14221"></a><span class="lineno">14221</span>&#160;    <span class="keyword">const</span> <a class="code" href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a>* pInfo,</div><div class="line"><a name="l14222"></a><span class="lineno">14222</span>&#160;    <a class="code" href="struct_vma_defragmentation_stats.html">VmaDefragmentationStats</a>* pStats,</div><div class="line"><a name="l14223"></a><span class="lineno">14223</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> *pContext)</div><div class="line"><a name="l14224"></a><span class="lineno">14224</span>&#160;{</div><div class="line"><a name="l14225"></a><span class="lineno">14225</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pInfo &amp;&amp; pContext);</div><div class="line"><a name="l14226"></a><span class="lineno">14226</span>&#160;</div><div class="line"><a name="l14227"></a><span class="lineno">14227</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationBegin&quot;</span>);</div><div class="line"><a name="l14228"></a><span class="lineno">14228</span>&#160;</div><div class="line"><a name="l14229"></a><span class="lineno">14229</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14230"></a><span class="lineno">14230</span>&#160;</div><div class="line"><a name="l14231"></a><span class="lineno">14231</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;DefragmentationBegin(*pInfo, pStats, pContext);</div><div class="line"><a name="l14232"></a><span class="lineno">14232</span>&#160;}</div><div class="line"><a name="l14233"></a><span class="lineno">14233</span>&#160;</div><div class="line"><a name="l14234"></a><span class="lineno">14234</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a>(</div><div class="line"><a name="l14235"></a><span class="lineno">14235</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14236"></a><span class="lineno">14236</span>&#160;    <a class="code" href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a> context)</div><div class="line"><a name="l14237"></a><span class="lineno">14237</span>&#160;{</div><div class="line"><a name="l14238"></a><span class="lineno">14238</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l14239"></a><span class="lineno">14239</span>&#160;</div><div class="line"><a name="l14240"></a><span class="lineno">14240</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDefragmentationEnd&quot;</span>);</div><div class="line"><a name="l14241"></a><span class="lineno">14241</span>&#160;</div><div class="line"><a name="l14242"></a><span class="lineno">14242</span>&#160;    <span class="keywordflow">if</span>(context != VK_NULL_HANDLE)</div><div class="line"><a name="l14243"></a><span class="lineno">14243</span>&#160;    {</div><div class="line"><a name="l14244"></a><span class="lineno">14244</span>&#160;        VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14245"></a><span class="lineno">14245</span>&#160;</div><div class="line"><a name="l14246"></a><span class="lineno">14246</span>&#160;        <span class="keywordflow">return</span> allocator-&gt;DefragmentationEnd(context);</div><div class="line"><a name="l14247"></a><span class="lineno">14247</span>&#160;    }</div><div class="line"><a name="l14248"></a><span class="lineno">14248</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l14249"></a><span class="lineno">14249</span>&#160;    {</div><div class="line"><a name="l14250"></a><span class="lineno">14250</span>&#160;        <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l14251"></a><span class="lineno">14251</span>&#160;    }</div><div class="line"><a name="l14252"></a><span class="lineno">14252</span>&#160;}</div><div class="line"><a name="l14253"></a><span class="lineno">14253</span>&#160;</div><div class="line"><a name="l14254"></a><span class="lineno">14254</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a6b0929b914b60cf2d45cac4bf3547470">vmaBindBufferMemory</a>(</div><div class="line"><a name="l14255"></a><span class="lineno">14255</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14256"></a><span class="lineno">14256</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14257"></a><span class="lineno">14257</span>&#160;    VkBuffer buffer)</div><div class="line"><a name="l14258"></a><span class="lineno">14258</span>&#160;{</div><div class="line"><a name="l14259"></a><span class="lineno">14259</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; buffer);</div><div class="line"><a name="l14260"></a><span class="lineno">14260</span>&#160;</div><div class="line"><a name="l14261"></a><span class="lineno">14261</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindBufferMemory&quot;</span>);</div><div class="line"><a name="l14262"></a><span class="lineno">14262</span>&#160;</div><div class="line"><a name="l14263"></a><span class="lineno">14263</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14264"></a><span class="lineno">14264</span>&#160;</div><div class="line"><a name="l14265"></a><span class="lineno">14265</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindBufferMemory(allocation, buffer);</div><div class="line"><a name="l14266"></a><span class="lineno">14266</span>&#160;}</div><div class="line"><a name="l14267"></a><span class="lineno">14267</span>&#160;</div><div class="line"><a name="l14268"></a><span class="lineno">14268</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a3d3ca45799923aa5d138e9e5f9eb2da5">vmaBindImageMemory</a>(</div><div class="line"><a name="l14269"></a><span class="lineno">14269</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14270"></a><span class="lineno">14270</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation,</div><div class="line"><a name="l14271"></a><span class="lineno">14271</span>&#160;    VkImage image)</div><div class="line"><a name="l14272"></a><span class="lineno">14272</span>&#160;{</div><div class="line"><a name="l14273"></a><span class="lineno">14273</span>&#160;    VMA_ASSERT(allocator &amp;&amp; allocation &amp;&amp; image);</div><div class="line"><a name="l14274"></a><span class="lineno">14274</span>&#160;</div><div class="line"><a name="l14275"></a><span class="lineno">14275</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaBindImageMemory&quot;</span>);</div><div class="line"><a name="l14276"></a><span class="lineno">14276</span>&#160;</div><div class="line"><a name="l14277"></a><span class="lineno">14277</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14278"></a><span class="lineno">14278</span>&#160;</div><div class="line"><a name="l14279"></a><span class="lineno">14279</span>&#160;    <span class="keywordflow">return</span> allocator-&gt;BindImageMemory(allocation, image);</div><div class="line"><a name="l14280"></a><span class="lineno">14280</span>&#160;}</div><div class="line"><a name="l14281"></a><span class="lineno">14281</span>&#160;</div><div class="line"><a name="l14282"></a><span class="lineno">14282</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#ac72ee55598617e8eecca384e746bab51">vmaCreateBuffer</a>(</div><div class="line"><a name="l14283"></a><span class="lineno">14283</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14284"></a><span class="lineno">14284</span>&#160;    <span class="keyword">const</span> VkBufferCreateInfo* pBufferCreateInfo,</div><div class="line"><a name="l14285"></a><span class="lineno">14285</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="l14286"></a><span class="lineno">14286</span>&#160;    VkBuffer* pBuffer,</div><div class="line"><a name="l14287"></a><span class="lineno">14287</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l14288"></a><span class="lineno">14288</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l14289"></a><span class="lineno">14289</span>&#160;{</div><div class="line"><a name="l14290"></a><span class="lineno">14290</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pBufferCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pBuffer &amp;&amp; pAllocation);</div><div class="line"><a name="l14291"></a><span class="lineno">14291</span>&#160;    </div><div class="line"><a name="l14292"></a><span class="lineno">14292</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateBuffer&quot;</span>);</div><div class="line"><a name="l14293"></a><span class="lineno">14293</span>&#160;    </div><div class="line"><a name="l14294"></a><span class="lineno">14294</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14295"></a><span class="lineno">14295</span>&#160;</div><div class="line"><a name="l14296"></a><span class="lineno">14296</span>&#160;    *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l14297"></a><span class="lineno">14297</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l14298"></a><span class="lineno">14298</span>&#160;</div><div class="line"><a name="l14299"></a><span class="lineno">14299</span>&#160;    <span class="comment">// 1. Create VkBuffer.</span></div><div class="line"><a name="l14300"></a><span class="lineno">14300</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateBuffer)(</div><div class="line"><a name="l14301"></a><span class="lineno">14301</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l14302"></a><span class="lineno">14302</span>&#160;        pBufferCreateInfo,</div><div class="line"><a name="l14303"></a><span class="lineno">14303</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l14304"></a><span class="lineno">14304</span>&#160;        pBuffer);</div><div class="line"><a name="l14305"></a><span class="lineno">14305</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14306"></a><span class="lineno">14306</span>&#160;    {</div><div class="line"><a name="l14307"></a><span class="lineno">14307</span>&#160;        <span class="comment">// 2. vkGetBufferMemoryRequirements.</span></div><div class="line"><a name="l14308"></a><span class="lineno">14308</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l14309"></a><span class="lineno">14309</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14310"></a><span class="lineno">14310</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l14311"></a><span class="lineno">14311</span>&#160;        allocator-&gt;GetBufferMemoryRequirements(*pBuffer, vkMemReq,</div><div class="line"><a name="l14312"></a><span class="lineno">14312</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l14313"></a><span class="lineno">14313</span>&#160;</div><div class="line"><a name="l14314"></a><span class="lineno">14314</span>&#160;        <span class="comment">// Make sure alignment requirements for specific buffer usages reported</span></div><div class="line"><a name="l14315"></a><span class="lineno">14315</span>&#160;        <span class="comment">// in Physical Device Properties are included in alignment reported by memory requirements.</span></div><div class="line"><a name="l14316"></a><span class="lineno">14316</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="l14317"></a><span class="lineno">14317</span>&#160;        {</div><div class="line"><a name="l14318"></a><span class="lineno">14318</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l14319"></a><span class="lineno">14319</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);</div><div class="line"><a name="l14320"></a><span class="lineno">14320</span>&#160;        }</div><div class="line"><a name="l14321"></a><span class="lineno">14321</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)</div><div class="line"><a name="l14322"></a><span class="lineno">14322</span>&#160;        {</div><div class="line"><a name="l14323"></a><span class="lineno">14323</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l14324"></a><span class="lineno">14324</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);</div><div class="line"><a name="l14325"></a><span class="lineno">14325</span>&#160;        }</div><div class="line"><a name="l14326"></a><span class="lineno">14326</span>&#160;        <span class="keywordflow">if</span>((pBufferCreateInfo-&gt;usage &amp; VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)</div><div class="line"><a name="l14327"></a><span class="lineno">14327</span>&#160;        {</div><div class="line"><a name="l14328"></a><span class="lineno">14328</span>&#160;           VMA_ASSERT(vkMemReq.alignment %</div><div class="line"><a name="l14329"></a><span class="lineno">14329</span>&#160;              allocator-&gt;m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);</div><div class="line"><a name="l14330"></a><span class="lineno">14330</span>&#160;        }</div><div class="line"><a name="l14331"></a><span class="lineno">14331</span>&#160;</div><div class="line"><a name="l14332"></a><span class="lineno">14332</span>&#160;        <span class="comment">// 3. Allocate memory using allocator.</span></div><div class="line"><a name="l14333"></a><span class="lineno">14333</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l14334"></a><span class="lineno">14334</span>&#160;            vkMemReq,</div><div class="line"><a name="l14335"></a><span class="lineno">14335</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l14336"></a><span class="lineno">14336</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l14337"></a><span class="lineno">14337</span>&#160;            *pBuffer, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l14338"></a><span class="lineno">14338</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l14339"></a><span class="lineno">14339</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l14340"></a><span class="lineno">14340</span>&#160;            VMA_SUBALLOCATION_TYPE_BUFFER,</div><div class="line"><a name="l14341"></a><span class="lineno">14341</span>&#160;            pAllocation);</div><div class="line"><a name="l14342"></a><span class="lineno">14342</span>&#160;</div><div class="line"><a name="l14343"></a><span class="lineno">14343</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14344"></a><span class="lineno">14344</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14345"></a><span class="lineno">14345</span>&#160;        {</div><div class="line"><a name="l14346"></a><span class="lineno">14346</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateBuffer(</div><div class="line"><a name="l14347"></a><span class="lineno">14347</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14348"></a><span class="lineno">14348</span>&#160;                *pBufferCreateInfo,</div><div class="line"><a name="l14349"></a><span class="lineno">14349</span>&#160;                *pAllocationCreateInfo,</div><div class="line"><a name="l14350"></a><span class="lineno">14350</span>&#160;                *pAllocation);</div><div class="line"><a name="l14351"></a><span class="lineno">14351</span>&#160;        }</div><div class="line"><a name="l14352"></a><span class="lineno">14352</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14353"></a><span class="lineno">14353</span>&#160;</div><div class="line"><a name="l14354"></a><span class="lineno">14354</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14355"></a><span class="lineno">14355</span>&#160;        {</div><div class="line"><a name="l14356"></a><span class="lineno">14356</span>&#160;            <span class="comment">// 3. Bind buffer with memory.</span></div><div class="line"><a name="l14357"></a><span class="lineno">14357</span>&#160;            res = allocator-&gt;BindBufferMemory(*pAllocation, *pBuffer);</div><div class="line"><a name="l14358"></a><span class="lineno">14358</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14359"></a><span class="lineno">14359</span>&#160;            {</div><div class="line"><a name="l14360"></a><span class="lineno">14360</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l14361"></a><span class="lineno">14361</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l14362"></a><span class="lineno">14362</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pBufferCreateInfo-&gt;usage);</div><div class="line"><a name="l14363"></a><span class="lineno">14363</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l14364"></a><span class="lineno">14364</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l14365"></a><span class="lineno">14365</span>&#160;                {</div><div class="line"><a name="l14366"></a><span class="lineno">14366</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l14367"></a><span class="lineno">14367</span>&#160;                }</div><div class="line"><a name="l14368"></a><span class="lineno">14368</span>&#160;</div><div class="line"><a name="l14369"></a><span class="lineno">14369</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l14370"></a><span class="lineno">14370</span>&#160;            }</div><div class="line"><a name="l14371"></a><span class="lineno">14371</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l14372"></a><span class="lineno">14372</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l14373"></a><span class="lineno">14373</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14374"></a><span class="lineno">14374</span>&#160;            *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l14375"></a><span class="lineno">14375</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14376"></a><span class="lineno">14376</span>&#160;        }</div><div class="line"><a name="l14377"></a><span class="lineno">14377</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, *pBuffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14378"></a><span class="lineno">14378</span>&#160;        *pBuffer = VK_NULL_HANDLE;</div><div class="line"><a name="l14379"></a><span class="lineno">14379</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14380"></a><span class="lineno">14380</span>&#160;    }</div><div class="line"><a name="l14381"></a><span class="lineno">14381</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14382"></a><span class="lineno">14382</span>&#160;}</div><div class="line"><a name="l14383"></a><span class="lineno">14383</span>&#160;</div><div class="line"><a name="l14384"></a><span class="lineno">14384</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="l14385"></a><span class="lineno">14385</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14386"></a><span class="lineno">14386</span>&#160;    VkBuffer buffer,</div><div class="line"><a name="l14387"></a><span class="lineno">14387</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14388"></a><span class="lineno">14388</span>&#160;{</div><div class="line"><a name="l14389"></a><span class="lineno">14389</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l14390"></a><span class="lineno">14390</span>&#160;</div><div class="line"><a name="l14391"></a><span class="lineno">14391</span>&#160;    <span class="keywordflow">if</span>(buffer == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l14392"></a><span class="lineno">14392</span>&#160;    {</div><div class="line"><a name="l14393"></a><span class="lineno">14393</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l14394"></a><span class="lineno">14394</span>&#160;    }</div><div class="line"><a name="l14395"></a><span class="lineno">14395</span>&#160;</div><div class="line"><a name="l14396"></a><span class="lineno">14396</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyBuffer&quot;</span>);</div><div class="line"><a name="l14397"></a><span class="lineno">14397</span>&#160;</div><div class="line"><a name="l14398"></a><span class="lineno">14398</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14399"></a><span class="lineno">14399</span>&#160;</div><div class="line"><a name="l14400"></a><span class="lineno">14400</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14401"></a><span class="lineno">14401</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14402"></a><span class="lineno">14402</span>&#160;    {</div><div class="line"><a name="l14403"></a><span class="lineno">14403</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyBuffer(</div><div class="line"><a name="l14404"></a><span class="lineno">14404</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14405"></a><span class="lineno">14405</span>&#160;            allocation);</div><div class="line"><a name="l14406"></a><span class="lineno">14406</span>&#160;    }</div><div class="line"><a name="l14407"></a><span class="lineno">14407</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14408"></a><span class="lineno">14408</span>&#160;</div><div class="line"><a name="l14409"></a><span class="lineno">14409</span>&#160;    <span class="keywordflow">if</span>(buffer != VK_NULL_HANDLE)</div><div class="line"><a name="l14410"></a><span class="lineno">14410</span>&#160;    {</div><div class="line"><a name="l14411"></a><span class="lineno">14411</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyBuffer)(allocator-&gt;m_hDevice, buffer, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14412"></a><span class="lineno">14412</span>&#160;    }</div><div class="line"><a name="l14413"></a><span class="lineno">14413</span>&#160;</div><div class="line"><a name="l14414"></a><span class="lineno">14414</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l14415"></a><span class="lineno">14415</span>&#160;    {</div><div class="line"><a name="l14416"></a><span class="lineno">14416</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l14417"></a><span class="lineno">14417</span>&#160;    }</div><div class="line"><a name="l14418"></a><span class="lineno">14418</span>&#160;}</div><div class="line"><a name="l14419"></a><span class="lineno">14419</span>&#160;</div><div class="line"><a name="l14420"></a><span class="lineno">14420</span>&#160;VkResult <a class="code" href="vk__mem__alloc_8h.html#a02a94f25679275851a53e82eacbcfc73">vmaCreateImage</a>(</div><div class="line"><a name="l14421"></a><span class="lineno">14421</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14422"></a><span class="lineno">14422</span>&#160;    <span class="keyword">const</span> VkImageCreateInfo* pImageCreateInfo,</div><div class="line"><a name="l14423"></a><span class="lineno">14423</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="l14424"></a><span class="lineno">14424</span>&#160;    VkImage* pImage,</div><div class="line"><a name="l14425"></a><span class="lineno">14425</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a>* pAllocation,</div><div class="line"><a name="l14426"></a><span class="lineno">14426</span>&#160;    <a class="code" href="struct_vma_allocation_info.html">VmaAllocationInfo</a>* pAllocationInfo)</div><div class="line"><a name="l14427"></a><span class="lineno">14427</span>&#160;{</div><div class="line"><a name="l14428"></a><span class="lineno">14428</span>&#160;    VMA_ASSERT(allocator &amp;&amp; pImageCreateInfo &amp;&amp; pAllocationCreateInfo &amp;&amp; pImage &amp;&amp; pAllocation);</div><div class="line"><a name="l14429"></a><span class="lineno">14429</span>&#160;</div><div class="line"><a name="l14430"></a><span class="lineno">14430</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaCreateImage&quot;</span>);</div><div class="line"><a name="l14431"></a><span class="lineno">14431</span>&#160;</div><div class="line"><a name="l14432"></a><span class="lineno">14432</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14433"></a><span class="lineno">14433</span>&#160;</div><div class="line"><a name="l14434"></a><span class="lineno">14434</span>&#160;    *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l14435"></a><span class="lineno">14435</span>&#160;    *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l14436"></a><span class="lineno">14436</span>&#160;</div><div class="line"><a name="l14437"></a><span class="lineno">14437</span>&#160;    <span class="comment">// 1. Create VkImage.</span></div><div class="line"><a name="l14438"></a><span class="lineno">14438</span>&#160;    VkResult res = (*allocator-&gt;GetVulkanFunctions().vkCreateImage)(</div><div class="line"><a name="l14439"></a><span class="lineno">14439</span>&#160;        allocator-&gt;m_hDevice,</div><div class="line"><a name="l14440"></a><span class="lineno">14440</span>&#160;        pImageCreateInfo,</div><div class="line"><a name="l14441"></a><span class="lineno">14441</span>&#160;        allocator-&gt;GetAllocationCallbacks(),</div><div class="line"><a name="l14442"></a><span class="lineno">14442</span>&#160;        pImage);</div><div class="line"><a name="l14443"></a><span class="lineno">14443</span>&#160;    <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14444"></a><span class="lineno">14444</span>&#160;    {</div><div class="line"><a name="l14445"></a><span class="lineno">14445</span>&#160;        VmaSuballocationType suballocType = pImageCreateInfo-&gt;tiling == VK_IMAGE_TILING_OPTIMAL ?</div><div class="line"><a name="l14446"></a><span class="lineno">14446</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_OPTIMAL :</div><div class="line"><a name="l14447"></a><span class="lineno">14447</span>&#160;            VMA_SUBALLOCATION_TYPE_IMAGE_LINEAR;</div><div class="line"><a name="l14448"></a><span class="lineno">14448</span>&#160;        </div><div class="line"><a name="l14449"></a><span class="lineno">14449</span>&#160;        <span class="comment">// 2. Allocate memory using allocator.</span></div><div class="line"><a name="l14450"></a><span class="lineno">14450</span>&#160;        VkMemoryRequirements vkMemReq = {};</div><div class="line"><a name="l14451"></a><span class="lineno">14451</span>&#160;        <span class="keywordtype">bool</span> requiresDedicatedAllocation = <span class="keyword">false</span>;</div><div class="line"><a name="l14452"></a><span class="lineno">14452</span>&#160;        <span class="keywordtype">bool</span> prefersDedicatedAllocation  = <span class="keyword">false</span>;</div><div class="line"><a name="l14453"></a><span class="lineno">14453</span>&#160;        allocator-&gt;GetImageMemoryRequirements(*pImage, vkMemReq,</div><div class="line"><a name="l14454"></a><span class="lineno">14454</span>&#160;            requiresDedicatedAllocation, prefersDedicatedAllocation);</div><div class="line"><a name="l14455"></a><span class="lineno">14455</span>&#160;</div><div class="line"><a name="l14456"></a><span class="lineno">14456</span>&#160;        res = allocator-&gt;AllocateMemory(</div><div class="line"><a name="l14457"></a><span class="lineno">14457</span>&#160;            vkMemReq,</div><div class="line"><a name="l14458"></a><span class="lineno">14458</span>&#160;            requiresDedicatedAllocation,</div><div class="line"><a name="l14459"></a><span class="lineno">14459</span>&#160;            prefersDedicatedAllocation,</div><div class="line"><a name="l14460"></a><span class="lineno">14460</span>&#160;            VK_NULL_HANDLE, <span class="comment">// dedicatedBuffer</span></div><div class="line"><a name="l14461"></a><span class="lineno">14461</span>&#160;            *pImage, <span class="comment">// dedicatedImage</span></div><div class="line"><a name="l14462"></a><span class="lineno">14462</span>&#160;            *pAllocationCreateInfo,</div><div class="line"><a name="l14463"></a><span class="lineno">14463</span>&#160;            suballocType,</div><div class="line"><a name="l14464"></a><span class="lineno">14464</span>&#160;            pAllocation);</div><div class="line"><a name="l14465"></a><span class="lineno">14465</span>&#160;</div><div class="line"><a name="l14466"></a><span class="lineno">14466</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14467"></a><span class="lineno">14467</span>&#160;        <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14468"></a><span class="lineno">14468</span>&#160;        {</div><div class="line"><a name="l14469"></a><span class="lineno">14469</span>&#160;            allocator-&gt;GetRecorder()-&gt;RecordCreateImage(</div><div class="line"><a name="l14470"></a><span class="lineno">14470</span>&#160;                allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14471"></a><span class="lineno">14471</span>&#160;                *pImageCreateInfo,</div><div class="line"><a name="l14472"></a><span class="lineno">14472</span>&#160;                *pAllocationCreateInfo,</div><div class="line"><a name="l14473"></a><span class="lineno">14473</span>&#160;                *pAllocation);</div><div class="line"><a name="l14474"></a><span class="lineno">14474</span>&#160;        }</div><div class="line"><a name="l14475"></a><span class="lineno">14475</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14476"></a><span class="lineno">14476</span>&#160;</div><div class="line"><a name="l14477"></a><span class="lineno">14477</span>&#160;        <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14478"></a><span class="lineno">14478</span>&#160;        {</div><div class="line"><a name="l14479"></a><span class="lineno">14479</span>&#160;            <span class="comment">// 3. Bind image with memory.</span></div><div class="line"><a name="l14480"></a><span class="lineno">14480</span>&#160;            res = allocator-&gt;BindImageMemory(*pAllocation, *pImage);</div><div class="line"><a name="l14481"></a><span class="lineno">14481</span>&#160;            <span class="keywordflow">if</span>(res &gt;= 0)</div><div class="line"><a name="l14482"></a><span class="lineno">14482</span>&#160;            {</div><div class="line"><a name="l14483"></a><span class="lineno">14483</span>&#160;                <span class="comment">// All steps succeeded.</span></div><div class="line"><a name="l14484"></a><span class="lineno">14484</span>&#160;<span class="preprocessor">                #if VMA_STATS_STRING_ENABLED</span></div><div class="line"><a name="l14485"></a><span class="lineno">14485</span>&#160;                    (*pAllocation)-&gt;InitBufferImageUsage(pImageCreateInfo-&gt;usage);</div><div class="line"><a name="l14486"></a><span class="lineno">14486</span>&#160;<span class="preprocessor">                #endif</span></div><div class="line"><a name="l14487"></a><span class="lineno">14487</span>&#160;                <span class="keywordflow">if</span>(pAllocationInfo != VMA_NULL)</div><div class="line"><a name="l14488"></a><span class="lineno">14488</span>&#160;                {</div><div class="line"><a name="l14489"></a><span class="lineno">14489</span>&#160;                    allocator-&gt;GetAllocationInfo(*pAllocation, pAllocationInfo);</div><div class="line"><a name="l14490"></a><span class="lineno">14490</span>&#160;                }</div><div class="line"><a name="l14491"></a><span class="lineno">14491</span>&#160;</div><div class="line"><a name="l14492"></a><span class="lineno">14492</span>&#160;                <span class="keywordflow">return</span> VK_SUCCESS;</div><div class="line"><a name="l14493"></a><span class="lineno">14493</span>&#160;            }</div><div class="line"><a name="l14494"></a><span class="lineno">14494</span>&#160;            allocator-&gt;FreeMemory(*pAllocation);</div><div class="line"><a name="l14495"></a><span class="lineno">14495</span>&#160;            *pAllocation = VK_NULL_HANDLE;</div><div class="line"><a name="l14496"></a><span class="lineno">14496</span>&#160;            (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14497"></a><span class="lineno">14497</span>&#160;            *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l14498"></a><span class="lineno">14498</span>&#160;            <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14499"></a><span class="lineno">14499</span>&#160;        }</div><div class="line"><a name="l14500"></a><span class="lineno">14500</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, *pImage, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14501"></a><span class="lineno">14501</span>&#160;        *pImage = VK_NULL_HANDLE;</div><div class="line"><a name="l14502"></a><span class="lineno">14502</span>&#160;        <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14503"></a><span class="lineno">14503</span>&#160;    }</div><div class="line"><a name="l14504"></a><span class="lineno">14504</span>&#160;    <span class="keywordflow">return</span> res;</div><div class="line"><a name="l14505"></a><span class="lineno">14505</span>&#160;}</div><div class="line"><a name="l14506"></a><span class="lineno">14506</span>&#160;</div><div class="line"><a name="l14507"></a><span class="lineno">14507</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="l14508"></a><span class="lineno">14508</span>&#160;    <a class="code" href="struct_vma_allocator.html">VmaAllocator</a> allocator,</div><div class="line"><a name="l14509"></a><span class="lineno">14509</span>&#160;    VkImage image,</div><div class="line"><a name="l14510"></a><span class="lineno">14510</span>&#160;    <a class="code" href="struct_vma_allocation.html">VmaAllocation</a> allocation)</div><div class="line"><a name="l14511"></a><span class="lineno">14511</span>&#160;{</div><div class="line"><a name="l14512"></a><span class="lineno">14512</span>&#160;    VMA_ASSERT(allocator);</div><div class="line"><a name="l14513"></a><span class="lineno">14513</span>&#160;</div><div class="line"><a name="l14514"></a><span class="lineno">14514</span>&#160;    <span class="keywordflow">if</span>(image == VK_NULL_HANDLE &amp;&amp; allocation == VK_NULL_HANDLE)</div><div class="line"><a name="l14515"></a><span class="lineno">14515</span>&#160;    {</div><div class="line"><a name="l14516"></a><span class="lineno">14516</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l14517"></a><span class="lineno">14517</span>&#160;    }</div><div class="line"><a name="l14518"></a><span class="lineno">14518</span>&#160;</div><div class="line"><a name="l14519"></a><span class="lineno">14519</span>&#160;    VMA_DEBUG_LOG(<span class="stringliteral">&quot;vmaDestroyImage&quot;</span>);</div><div class="line"><a name="l14520"></a><span class="lineno">14520</span>&#160;</div><div class="line"><a name="l14521"></a><span class="lineno">14521</span>&#160;    VMA_DEBUG_GLOBAL_MUTEX_LOCK</div><div class="line"><a name="l14522"></a><span class="lineno">14522</span>&#160;</div><div class="line"><a name="l14523"></a><span class="lineno">14523</span>&#160;<span class="preprocessor">#if VMA_RECORDING_ENABLED</span></div><div class="line"><a name="l14524"></a><span class="lineno">14524</span>&#160;    <span class="keywordflow">if</span>(allocator-&gt;GetRecorder() != VMA_NULL)</div><div class="line"><a name="l14525"></a><span class="lineno">14525</span>&#160;    {</div><div class="line"><a name="l14526"></a><span class="lineno">14526</span>&#160;        allocator-&gt;GetRecorder()-&gt;RecordDestroyImage(</div><div class="line"><a name="l14527"></a><span class="lineno">14527</span>&#160;            allocator-&gt;GetCurrentFrameIndex(),</div><div class="line"><a name="l14528"></a><span class="lineno">14528</span>&#160;            allocation);</div><div class="line"><a name="l14529"></a><span class="lineno">14529</span>&#160;    }</div><div class="line"><a name="l14530"></a><span class="lineno">14530</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l14531"></a><span class="lineno">14531</span>&#160;</div><div class="line"><a name="l14532"></a><span class="lineno">14532</span>&#160;    <span class="keywordflow">if</span>(image != VK_NULL_HANDLE)</div><div class="line"><a name="l14533"></a><span class="lineno">14533</span>&#160;    {</div><div class="line"><a name="l14534"></a><span class="lineno">14534</span>&#160;        (*allocator-&gt;GetVulkanFunctions().vkDestroyImage)(allocator-&gt;m_hDevice, image, allocator-&gt;GetAllocationCallbacks());</div><div class="line"><a name="l14535"></a><span class="lineno">14535</span>&#160;    }</div><div class="line"><a name="l14536"></a><span class="lineno">14536</span>&#160;    <span class="keywordflow">if</span>(allocation != VK_NULL_HANDLE)</div><div class="line"><a name="l14537"></a><span class="lineno">14537</span>&#160;    {</div><div class="line"><a name="l14538"></a><span class="lineno">14538</span>&#160;        allocator-&gt;FreeMemory(allocation);</div><div class="line"><a name="l14539"></a><span class="lineno">14539</span>&#160;    }</div><div class="line"><a name="l14540"></a><span class="lineno">14540</span>&#160;}</div><div class="line"><a name="l14541"></a><span class="lineno">14541</span>&#160;</div><div class="line"><a name="l14542"></a><span class="lineno">14542</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:1567</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:1868</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:1643</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_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:1624</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info2_html_a94c2c7223d52878445a8cccce396b671"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a94c2c7223d52878445a8cccce396b671">VmaDefragmentationInfo2::maxCpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxCpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on CPU side...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2592</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">Deprecated. Compacts memory by moving allocations. </div></div>
+<div class="ttc" id="struct_vma_defragmentation_stats_html_a87f0adc9588757b1e3ac1815597ace03"><div class="ttname"><a href="struct_vma_defragmentation_stats.html#a87f0adc9588757b1e3ac1815597ace03">VmaDefragmentationStats::allocationsLost</a></div><div class="ttdeci">uint32_t allocationsLost</div><div class="ttdoc">Number of allocations that became lost in the process of defragmentation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2633</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a0d0eb0c1102268fa9a476d12ecbe4006"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0d0eb0c1102268fa9a476d12ecbe4006">vmaInvalidateAllocation</a></div><div class="ttdeci">void vmaInvalidateAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Invalidates memory of given allocation. </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="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1617</div></div>
-<div class="ttc" id="struct_vma_pool_stats_html_aa0b5cb45cef6f18571cefb03b9a230e7"><div class="ttname"><a href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">VmaPoolStats::blockCount</a></div><div class="ttdeci">size_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory blocks allocated for this pool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2212</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:1598</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a20dd17d69966dbffa054739d6090b85e">VMA_RECORD_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1598</div></div>
+<div class="ttc" id="struct_vma_pool_stats_html_aa0b5cb45cef6f18571cefb03b9a230e7"><div class="ttname"><a href="struct_vma_pool_stats.html#aa0b5cb45cef6f18571cefb03b9a230e7">VmaPoolStats::blockCount</a></div><div class="ttdeci">size_t blockCount</div><div class="ttdoc">Number of VkDeviceMemory blocks allocated for this pool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2190</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:1579</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:1844</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1947</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:1590</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:2312</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:1640</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:2582</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:2101</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a1f0c126759fc96ccb6e2d23c101d770c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="ttdeci">#define VMA_RECORDING_ENABLED</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1487</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:1825</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a839826775c62319466441f86496f036d">VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1928</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info2_html_a53e844ee5633e229cf6daf14b2d9fff9"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a53e844ee5633e229cf6daf14b2d9fff9">VmaDefragmentationInfo2::flags</a></div><div class="ttdeci">VmaDefragmentationFlags flags</div><div class="ttdoc">Flags for defragmentation. Use VmaDefragmentationFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2567</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:1571</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:2290</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:1621</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:2619</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:2079</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a1f0c126759fc96ccb6e2d23c101d770c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a1f0c126759fc96ccb6e2d23c101d770c">VMA_RECORDING_ENABLED</a></div><div class="ttdeci">#define VMA_RECORDING_ENABLED</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1468</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:2193</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:1924</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:1579</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:2000</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:1871</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:1652</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a></div><div class="ttdoc">Enables alternative, buddy allocation algorithm in this pool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2129</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:2171</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:1905</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:1560</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:1978</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:1852</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:1633</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a97a0dc38e5161b780594d998d313d35e">VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT</a></div><div class="ttdoc">Enables alternative, buddy allocation algorithm in this pool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2107</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:1705</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:1637</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:1686</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:1618</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:1875</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:1856</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:1777</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:1595</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:1776</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:2586</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:1758</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:1576</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:1757</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:2623</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:1669</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:1786</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:2594</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:1984</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:2577</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:1596</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:1521</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:1650</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:1767</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:2631</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:1962</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:2614</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:1577</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:1502</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:1646</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:1627</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:2143</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:2137</div></div>
-<div class="ttc" id="struct_vma_allocator_create_info_html_ace2aa4877b16a42b0b7673d4e26000ee"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">VmaAllocatorCreateInfo::pRecordSettings</a></div><div class="ttdeci">const VmaRecordSettings * pRecordSettings</div><div class="ttdoc">Parameters for recording of VMA calls. Can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1712</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:2322</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:2121</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:2115</div></div>
+<div class="ttc" id="struct_vma_allocator_create_info_html_ace2aa4877b16a42b0b7673d4e26000ee"><div class="ttname"><a href="struct_vma_allocator_create_info.html#ace2aa4877b16a42b0b7673d4e26000ee">VmaAllocatorCreateInfo::pRecordSettings</a></div><div class="ttdeci">const VmaRecordSettings * pRecordSettings</div><div class="ttdoc">Parameters for recording of VMA calls. Can be null. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1693</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:2300</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:1591</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a></div><div class="ttdoc">Enables flush after recording every function call. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1615</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:2021</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:2163</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:2199</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:1572</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a36ba776fd7fd5cb1e9359fdc0d8e6e8a"><div class="ttname"><a href="vk__mem__alloc_8h.html#a36ba776fd7fd5cb1e9359fdc0d8e6e8a">vmaDefragmentationBegin</a></div><div class="ttdeci">VkResult vmaDefragmentationBegin(VmaAllocator allocator, const VmaDefragmentationInfo2 *pInfo, VmaDefragmentationStats *pStats, VmaDefragmentationContext *pContext)</div><div class="ttdoc">Begins defragmentation process. </div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2a8e7ab322e8732654be627c4ea8f36cc7">VMA_RECORD_FLUSH_AFTER_CALL_BIT</a></div><div class="ttdoc">Enables flush after recording every function call. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1596</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:1999</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:2141</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:2177</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:1577</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:2146</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:1558</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:2124</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:1822</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info2_html_a4ddbc898d0afe1518f863a3763628f08"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a4ddbc898d0afe1518f863a3763628f08">VmaDefragmentationInfo2::maxGpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxGpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2597</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:1803</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_info2_html_a8943f8d65969ce8e2189a1cdf3205e96"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a8943f8d65969ce8e2189a1cdf3205e96">VmaDefragmentationInfo2::pAllocations</a></div><div class="ttdeci">VmaAllocation * pAllocations</div><div class="ttdoc">Pointer to array of allocations that can be defragmented. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2576</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_abc34ee6f021f459aff885f3758c435de"><div class="ttname"><a href="vk__mem__alloc_8h.html#abc34ee6f021f459aff885f3758c435de">vmaFlushAllocation</a></div><div class="ttdeci">void vmaFlushAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize offset, VkDeviceSize size)</div><div class="ttdoc">Flushes memory of given allocation. </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:2572</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">Deprecated. Optional configuration parameters to be passed to function vmaDefragment(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2609</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info2_html_ae41a36871f23fdd34df9c72149204c57"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#ae41a36871f23fdd34df9c72149204c57">VmaDefragmentationInfo2::allocationCount</a></div><div class="ttdeci">size_t allocationCount</div><div class="ttdoc">Number of allocations in pAllocations array. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2570</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:2590</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:1861</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:2008</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:1594</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:2627</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:1842</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:1986</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:1575</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:1782</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:1527</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">Deprecated. Optional configuration parameters to be passed to function vmaDefragment(). </div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a8774e20e91e245aae959ba63efa15dd2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a8774e20e91e245aae959ba63efa15dd2">vmaDefragmentationEnd</a></div><div class="ttdeci">VkResult vmaDefragmentationEnd(VmaAllocator allocator, VmaDefragmentationContext context)</div><div class="ttdoc">Ends defragmentation process. </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:1763</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:1508</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a88a77cef37e5d3c4fc9eb328885d048d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a88a77cef37e5d3c4fc9eb328885d048d">VmaDefragmentationFlags</a></div><div class="ttdeci">VkFlags VmaDefragmentationFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2558</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_ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1968</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cab87ec33154803bfeb5ac2b379f1d6a97">VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2556</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a621b704103eb3360230c860acf36e706">VMA_ALLOCATION_CREATE_STRATEGY_MIN_FRAGMENTATION_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1946</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info2_html_a76d51a644dc7f5405d0cdd0025ecd0cc"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a76d51a644dc7f5405d0cdd0025ecd0cc">VmaDefragmentationInfo2::pAllocationsChanged</a></div><div class="ttdeci">VkBool32 * pAllocationsChanged</div><div class="ttdoc">Optional, output. Pointer to array that will be filled with information whether the allocation at cer...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2582</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:1548</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:1529</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_af3929a1a4547c592fc0b0e55ef452828"><div class="ttname"><a href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a></div><div class="ttdeci">VkFlags VmaRecordFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1619</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:1553</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:2592</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_af3929a1a4547c592fc0b0e55ef452828"><div class="ttname"><a href="vk__mem__alloc_8h.html#af3929a1a4547c592fc0b0e55ef452828">VmaRecordFlags</a></div><div class="ttdeci">VkFlags VmaRecordFlags</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1600</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:1534</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:2629</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:1995</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 available for new allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2209</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:1973</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 available for new allocation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2187</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:1587</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:1765</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. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2158</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:1540</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2133</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:1568</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca4e406da317f64208d0b26eb82c8d8071">VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2537</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:1746</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. Optional. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2136</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:1521</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7af4d270f8f42517a0f70037ceb6ac1d9c">VMA_POOL_CREATE_ALGORITHM_MASK</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2111</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:1931</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:1778</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:1544</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1958</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:2149</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:1870</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a5c1093bc32386a8060c37c9f282078a1"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">VmaVulkanFunctions::vkInvalidateMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1593</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:1912</div></div>
+<div class="ttc" id="struct_vma_defragmentation_context_html"><div class="ttname"><a href="struct_vma_defragmentation_context.html">VmaDefragmentationContext</a></div><div class="ttdoc">Represents Opaque object that represents started defragmentation process. </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:1759</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:1525</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a33eb2052674f3ad92386c714a65fb777">VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1936</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:2127</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:1851</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a5c1093bc32386a8060c37c9f282078a1"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a5c1093bc32386a8060c37c9f282078a1">VmaVulkanFunctions::vkInvalidateMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1574</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:1990</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:1981</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:1968</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:1959</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:1768</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:1589</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:2171</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:1655</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:2202</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:1979</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:2014</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:1749</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:1570</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:2149</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:1636</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:2180</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:1957</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info2_html_af78e1ea40c22d85137b65f6b384a4d0a"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#af78e1ea40c22d85137b65f6b384a4d0a">VmaDefragmentationInfo2::maxCpuBytesToMove</a></div><div class="ttdeci">VkDeviceSize maxCpuBytesToMove</div><div class="ttdoc">Maximum total numbers of bytes that can be copied while moving allocations to different places using ...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2587</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:1992</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:1693</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:1784</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:1911</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:1777</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:1674</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:1765</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50ca72611a502fd73f59c478475a3e18ca7f">VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2544</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:1892</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:1758</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:1600</div></div>
-<div class="ttc" id="struct_vma_record_settings_html_ad8fdcc92119ae7a8c08c1a564c01d63a"><div class="ttname"><a href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings::flags</a></div><div class="ttdeci">VmaRecordFlags flags</div><div class="ttdoc">Flags for recording. Use VmaRecordFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1625</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:1542</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:1599</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:1581</div></div>
+<div class="ttc" id="struct_vma_record_settings_html_ad8fdcc92119ae7a8c08c1a564c01d63a"><div class="ttname"><a href="struct_vma_record_settings.html#ad8fdcc92119ae7a8c08c1a564c01d63a">VmaRecordSettings::flags</a></div><div class="ttdeci">VmaRecordFlags flags</div><div class="ttdoc">Flags for recording. Use VmaRecordFlagBits enum. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1606</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50c"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50c">VmaDefragmentationFlagBits</a></div><div class="ttdeci">VmaDefragmentationFlagBits</div><div class="ttdoc">Flags to be used in vmaDefragmentationBegin(). </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2533</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:1523</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:1580</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:2185</div></div>
-<div class="ttc" id="struct_vma_vulkan_functions_html_a33c322f4c4ad2810f8a9c97a277572f9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">VmaVulkanFunctions::vkFlushMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1592</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1942</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:2163</div></div>
+<div class="ttc" id="struct_vma_vulkan_functions_html_a33c322f4c4ad2810f8a9c97a277572f9"><div class="ttname"><a href="struct_vma_vulkan_functions.html#a33c322f4c4ad2810f8a9c97a277572f9">VmaVulkanFunctions::vkFlushMappedMemoryRanges</a></div><div class="ttdeci">PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1573</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a42ba3a2d2c7117953210b7c3ef8da0df">VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1923</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_record_settings_html_a6cb1fdbf6bcb610b68f2010dd629e89d"><div class="ttname"><a href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">VmaRecordSettings::pFilePath</a></div><div class="ttdeci">const char * pFilePath</div><div class="ttdoc">Path to the file that should be written by the recording. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1633</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:2336</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:1649</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:1777</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:1774</div></div>
+<div class="ttc" id="struct_vma_record_settings_html_a6cb1fdbf6bcb610b68f2010dd629e89d"><div class="ttname"><a href="struct_vma_record_settings.html#a6cb1fdbf6bcb610b68f2010dd629e89d">VmaRecordSettings::pFilePath</a></div><div class="ttdeci">const char * pFilePath</div><div class="ttdoc">Path to the file that should be written by the recording. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1614</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:2314</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:1630</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:1758</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:1755</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="vk__mem__alloc_8h_html_a49329a7f030dafcf82f7b73334c22e98"><div class="ttname"><a href="vk__mem__alloc_8h.html#a49329a7f030dafcf82f7b73334c22e98">vmaCheckCorruption</a></div><div class="ttdeci">VkResult vmaCheckCorruption(VmaAllocator allocator, uint32_t memoryTypeBits)</div><div class="ttdoc">Checks magic number in margins around all allocations in given memory types (in both default and cust...</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:2190</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:2168</div></div>
+<div class="ttc" id="struct_vma_defragmentation_info2_html"><div class="ttname"><a href="struct_vma_defragmentation_info2.html">VmaDefragmentationInfo2</a></div><div class="ttdoc">Parameters for defragmentation. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2564</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_ad535935619c7a549bf837e1bb0068f89"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad535935619c7a549bf837e1bb0068f89">vmaCheckPoolCorruption</a></div><div class="ttdeci">VkResult vmaCheckPoolCorruption(VmaAllocator allocator, VmaPool pool)</div><div class="ttdoc">Checks magic number in margins around all allocations in given memory pool in search for corruptions...</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1951</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:2317</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1965</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:1977</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:2588</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:1585</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597ad242a04f802e25fef0b880afe8bb0a62">VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1932</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:2295</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a0729e932b7ea170e3a128cad96c5cf6d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1943</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:1955</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:2625</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:1566</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_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:1772</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:1827</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:2139</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:1753</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:1808</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cacf7eb65ad6d2423ebe2ca3f56bb77a46">VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2549</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:2117</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_record_settings_html"><div class="ttname"><a href="struct_vma_record_settings.html">VmaRecordSettings</a></div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1622</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:1770</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:1597</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:1601</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:1898</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1972</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:1854</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:2331</div></div>
+<div class="ttc" id="struct_vma_record_settings_html"><div class="ttname"><a href="struct_vma_record_settings.html">VmaRecordSettings</a></div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1603</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:1751</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:1578</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:1582</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:1879</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d"><div class="ttname"><a href="vk__mem__alloc_8h.html#a6552a65b71d16f378c6994b3ceaef50cad5069876a2b8b45065b91e43ef906c1d">VMA_DEFRAGMENTATION_ALGORITHM_MASK</a></div><div class="ttdoc">A bit mask to extract only ALGORITHM bits from entire set of flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2552</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8e16845d81ae3d27c47106d4770d5c7e">VMA_ALLOCATION_CREATE_STRATEGY_MASK</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1950</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:1835</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:2309</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:1575</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:1556</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:1588</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a></div><div class="ttdoc">Enables alternative, linear allocation algorithm in this pool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2118</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a0ff488958ca72b28e545880463cb8696"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0ff488958ca72b28e545880463cb8696">vmaResizeAllocation</a></div><div class="ttdeci">VkResult vmaResizeAllocation(VmaAllocator allocator, VmaAllocation allocation, VkDeviceSize newSize)</div><div class="ttdoc">Tries to resize an allocation in place, if there is enough free memory after it. </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:2298</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:1569</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726"><div class="ttname"><a href="vk__mem__alloc_8h.html#a9a7c45f9c863695d98c83fa5ac940fe7a13c8a444197c67866be9cb05599fc726">VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT</a></div><div class="ttdoc">Enables alternative, linear allocation algorithm in this pool. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2096</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:2276</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_ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1962</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:2083</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:1778</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d"><div class="ttname"><a href="vk__mem__alloc_8h.html#ad9889c10c798b040d59c92f257cae597a8af1210cf591784afa026d94998f735d">VMA_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT</a></div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1940</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:2061</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:1759</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:1937</div></div>
-<div class="ttc" id="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a></div><div class="ttdeci">VmaRecordFlagBits</div><div class="ttdoc">Flags to be used in VmaRecordSettings::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1609</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:1785</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:1918</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_a4dd2c44642312a147a4e93373a6e64d2"><div class="ttname"><a href="vk__mem__alloc_8h.html#a4dd2c44642312a147a4e93373a6e64d2">VmaRecordFlagBits</a></div><div class="ttdeci">VmaRecordFlagBits</div><div class="ttdoc">Flags to be used in VmaRecordSettings::flags. </div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:1590</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:1766</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:2196</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:1778</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:2174</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:1759</div></div>
+<div class="ttc" id="vk__mem__alloc_8h_html_abac0e85abaa6ea1ffd63bde29c5c3a29"><div class="ttname"><a href="vk__mem__alloc_8h.html#abac0e85abaa6ea1ffd63bde29c5c3a29">VmaDefragmentationInfo2</a></div><div class="ttdeci">struct VmaDefragmentationInfo2 VmaDefragmentationInfo2</div><div class="ttdoc">Parameters for defragmentation. </div></div>
+<div class="ttc" id="struct_vma_defragmentation_info2_html_a40d53d33e71ba0b66f844ed63c05a3f6"><div class="ttname"><a href="struct_vma_defragmentation_info2.html#a40d53d33e71ba0b66f844ed63c05a3f6">VmaDefragmentationInfo2::maxGpuAllocationsToMove</a></div><div class="ttdeci">uint32_t maxGpuAllocationsToMove</div><div class="ttdoc">Maximum number of allocations that can be moved to a different place using transfers on GPU side...</div><div class="ttdef"><b>Definition:</b> vk_mem_alloc.h:2602</div></div>
 <div class="ttc" id="vk__mem__alloc_8h_html_a0ab61e87ff6365f1d59915eadc37a9f0"><div class="ttname"><a href="vk__mem__alloc_8h.html#a0ab61e87ff6365f1d59915eadc37a9f0">VmaRecordSettings</a></div><div class="ttdeci">struct VmaRecordSettings VmaRecordSettings</div><div class="ttdoc">Parameters for recording calls to VMA functions. To be used in VmaAllocatorCreateInfo::pRecordSetting...</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:2303</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:2281</div></div>
 </div><!-- fragment --></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>
diff --git a/src/Common.h b/src/Common.h
index 0e32c78..714fa6a 100644
--- a/src/Common.h
+++ b/src/Common.h
@@ -57,6 +57,11 @@
 {

     return (x+y-1) / y;

 }

+template <typename T>

+inline T round_div(T x, T y)

+{

+    return (x+y/(T)2) / y;

+}

 

 template <typename T>

 static inline T align_up(T val, T align)

diff --git a/src/Tests.cpp b/src/Tests.cpp
index f7536c4..ff6aa3a 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -9,6 +9,10 @@
 

 static const char* CODE_DESCRIPTION = "Foo";

 

+extern VkCommandBuffer g_hTemporaryCommandBuffer;

+void BeginSingleTimeCommands();

+void EndSingleTimeCommands();

+

 enum CONFIG_TYPE {

     CONFIG_TYPE_MINIMUM,

     CONFIG_TYPE_SMALL,

@@ -18,8 +22,8 @@
     CONFIG_TYPE_COUNT

 };

 

-//static constexpr CONFIG_TYPE ConfigType = CONFIG_TYPE_SMALL;

-static constexpr CONFIG_TYPE ConfigType = CONFIG_TYPE_LARGE;

+static constexpr CONFIG_TYPE ConfigType = CONFIG_TYPE_SMALL;

+//static constexpr CONFIG_TYPE ConfigType = CONFIG_TYPE_LARGE;

 

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

 

@@ -645,17 +649,340 @@
 

 struct AllocInfo

 {

-    VmaAllocation m_Allocation;

-    VkBuffer m_Buffer;

-    VkImage m_Image;

-    uint32_t m_StartValue;

+    VmaAllocation m_Allocation = VK_NULL_HANDLE;

+    VkBuffer m_Buffer = VK_NULL_HANDLE;

+    VkImage m_Image = VK_NULL_HANDLE;

+    uint32_t m_StartValue = 0;

     union

     {

         VkBufferCreateInfo m_BufferInfo;

         VkImageCreateInfo m_ImageInfo;

     };

+

+    void CreateBuffer(

+        const VkBufferCreateInfo& bufCreateInfo,

+        const VmaAllocationCreateInfo& allocCreateInfo);

+    void Destroy();

 };

 

+void AllocInfo::CreateBuffer(

+    const VkBufferCreateInfo& bufCreateInfo,

+    const VmaAllocationCreateInfo& allocCreateInfo)

+{

+    m_BufferInfo = bufCreateInfo;

+    VkResult res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &m_Buffer, &m_Allocation, nullptr);

+    TEST(res == VK_SUCCESS);

+}

+

+void AllocInfo::Destroy()

+{

+    if(m_Image)

+    {

+        vkDestroyImage(g_hDevice, m_Image, nullptr);

+    }

+    if(m_Buffer)

+    {

+        vkDestroyBuffer(g_hDevice, m_Buffer, nullptr);

+    }

+    if(m_Allocation)

+    {

+        vmaFreeMemory(g_hAllocator, m_Allocation);

+    }

+}

+

+class StagingBufferCollection

+{

+public:

+    StagingBufferCollection() { }

+    ~StagingBufferCollection();

+    // Returns false if maximum total size of buffers would be exceeded.

+    bool AcquireBuffer(VkDeviceSize size, VkBuffer& outBuffer, void*& outMappedPtr);

+    void ReleaseAllBuffers();

+

+private:

+    static const VkDeviceSize MAX_TOTAL_SIZE = 256ull * 1024 * 1024;

+    struct BufInfo

+    {

+        VmaAllocation Allocation = VK_NULL_HANDLE;

+        VkBuffer Buffer = VK_NULL_HANDLE;

+        VkDeviceSize Size = VK_WHOLE_SIZE;

+        void* MappedPtr = nullptr;

+        bool Used = false;

+    };

+    std::vector<BufInfo> m_Bufs;

+    // Including both used and unused.

+    VkDeviceSize m_TotalSize = 0;

+};

+

+StagingBufferCollection::~StagingBufferCollection()

+{

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

+    {

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

+    }

+}

+

+bool StagingBufferCollection::AcquireBuffer(VkDeviceSize size, VkBuffer& outBuffer, void*& outMappedPtr)

+{

+    assert(size <= MAX_TOTAL_SIZE);

+

+    // Try to find existing unused buffer with best size.

+    size_t bestIndex = SIZE_MAX;

+    for(size_t i = 0, count = m_Bufs.size(); i < count; ++i)

+    {

+        BufInfo& currBufInfo = m_Bufs[i];

+        if(!currBufInfo.Used && currBufInfo.Size >= size &&

+            (bestIndex == SIZE_MAX || currBufInfo.Size < m_Bufs[bestIndex].Size))

+        {

+            bestIndex = i;

+        }

+    }

+

+    if(bestIndex != SIZE_MAX)

+    {

+        m_Bufs[bestIndex].Used = true;

+        outBuffer = m_Bufs[bestIndex].Buffer;

+        outMappedPtr = m_Bufs[bestIndex].MappedPtr;

+        return true;

+    }

+    

+    // Allocate new buffer with requested size.

+    if(m_TotalSize + size <= MAX_TOTAL_SIZE)

+    {

+        BufInfo bufInfo;

+        bufInfo.Size = size;

+        bufInfo.Used = true;

+

+        VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+        bufCreateInfo.size = size;

+        bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;

+

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.usage = VMA_MEMORY_USAGE_CPU_ONLY;

+        allocCreateInfo.flags = VMA_ALLOCATION_CREATE_MAPPED_BIT;

+

+        VmaAllocationInfo allocInfo;

+        VkResult res = vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &bufInfo.Buffer, &bufInfo.Allocation, &allocInfo);

+        bufInfo.MappedPtr = allocInfo.pMappedData;

+        TEST(res == VK_SUCCESS && bufInfo.MappedPtr);

+

+        outBuffer = bufInfo.Buffer;

+        outMappedPtr = bufInfo.MappedPtr;

+

+        m_Bufs.push_back(std::move(bufInfo));

+

+        m_TotalSize += size;

+

+        return true;

+    }

+

+    // There are some unused but smaller buffers: Free them and try again.

+    bool hasUnused = false;

+    for(size_t i = 0, count = m_Bufs.size(); i < count; ++i)

+    {

+        if(!m_Bufs[i].Used)

+        {

+            hasUnused = true;

+            break;

+        }

+    }

+    if(hasUnused)

+    {

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

+        {

+            if(!m_Bufs[i].Used)

+            {

+                m_TotalSize -= m_Bufs[i].Size;

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

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

+            }

+        }

+

+        return AcquireBuffer(size, outBuffer, outMappedPtr);

+   }

+

+    return false;

+}

+

+void StagingBufferCollection::ReleaseAllBuffers()

+{

+    for(size_t i = 0, count = m_Bufs.size(); i < count; ++i)

+    {

+        m_Bufs[i].Used = false;

+    }

+}

+

+static void UploadGpuData(const AllocInfo* allocInfo, size_t allocInfoCount)

+{

+    StagingBufferCollection stagingBufs;

+

+    bool cmdBufferStarted = false;

+    for(size_t allocInfoIndex = 0; allocInfoIndex < allocInfoCount; ++allocInfoIndex)

+    {

+        const AllocInfo& currAllocInfo = allocInfo[allocInfoIndex];

+        if(currAllocInfo.m_Buffer)

+        {

+            const VkDeviceSize size = currAllocInfo.m_BufferInfo.size;

+

+            VkBuffer stagingBuf = VK_NULL_HANDLE;

+            void* stagingBufMappedPtr = nullptr;

+            if(!stagingBufs.AcquireBuffer(size, stagingBuf, stagingBufMappedPtr))

+            {

+                TEST(cmdBufferStarted);

+                EndSingleTimeCommands();

+                stagingBufs.ReleaseAllBuffers();

+                cmdBufferStarted = false;

+

+                bool ok = stagingBufs.AcquireBuffer(size, stagingBuf, stagingBufMappedPtr);

+                TEST(ok);

+            }

+

+            // Fill staging buffer.

+            {

+                assert(size % sizeof(uint32_t) == 0);

+                uint32_t* stagingValPtr = (uint32_t*)stagingBufMappedPtr;

+                uint32_t val = currAllocInfo.m_StartValue;

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

+                {

+                    *stagingValPtr = val;

+                    ++stagingValPtr;

+                    ++val;

+                }

+            }

+

+            // Issue copy command from staging buffer to destination buffer.

+            if(!cmdBufferStarted)

+            {

+                cmdBufferStarted = true;

+                BeginSingleTimeCommands();

+            }

+

+            VkBufferCopy copy = {};

+            copy.srcOffset = 0;

+            copy.dstOffset = 0;

+            copy.size = size;

+            vkCmdCopyBuffer(g_hTemporaryCommandBuffer, stagingBuf, currAllocInfo.m_Buffer, 1, &copy);

+        }

+        else

+        {

+            TEST(0 && "Images not currently supported.");

+        }

+    }

+

+    if(cmdBufferStarted)

+    {

+        EndSingleTimeCommands();

+        stagingBufs.ReleaseAllBuffers();

+    }

+}

+

+static void ValidateGpuData(const AllocInfo* allocInfo, size_t allocInfoCount)

+{

+    StagingBufferCollection stagingBufs;

+

+    bool cmdBufferStarted = false;

+    size_t validateAllocIndexOffset = 0;

+    std::vector<void*> validateStagingBuffers;

+    for(size_t allocInfoIndex = 0; allocInfoIndex < allocInfoCount; ++allocInfoIndex)

+    {

+        const AllocInfo& currAllocInfo = allocInfo[allocInfoIndex];

+        if(currAllocInfo.m_Buffer)

+        {

+            const VkDeviceSize size = currAllocInfo.m_BufferInfo.size;

+

+            VkBuffer stagingBuf = VK_NULL_HANDLE;

+            void* stagingBufMappedPtr = nullptr;

+            if(!stagingBufs.AcquireBuffer(size, stagingBuf, stagingBufMappedPtr))

+            {

+                TEST(cmdBufferStarted);

+                EndSingleTimeCommands();

+                cmdBufferStarted = false;

+

+                for(size_t validateIndex = 0;

+                    validateIndex < validateStagingBuffers.size();

+                    ++validateIndex)

+                {

+                    const size_t validateAllocIndex = validateIndex + validateAllocIndexOffset;

+                    const VkDeviceSize validateSize = allocInfo[validateAllocIndex].m_BufferInfo.size;

+                    TEST(validateSize % sizeof(uint32_t) == 0);

+                    const uint32_t* stagingValPtr = (const uint32_t*)validateStagingBuffers[validateIndex];

+                    uint32_t val = allocInfo[validateAllocIndex].m_StartValue;

+                    bool valid = true;

+                    for(size_t i = 0; i < validateSize / sizeof(uint32_t); ++i)

+                    {

+                        if(*stagingValPtr != val)

+                        {

+                            valid = false;

+                            break;

+                        }

+                        ++stagingValPtr;

+                        ++val;

+                    }

+                    TEST(valid);

+                }

+

+                stagingBufs.ReleaseAllBuffers();

+

+                validateAllocIndexOffset = allocInfoIndex;

+                validateStagingBuffers.clear();

+

+                bool ok = stagingBufs.AcquireBuffer(size, stagingBuf, stagingBufMappedPtr);

+                TEST(ok);

+            }

+

+            // Issue copy command from staging buffer to destination buffer.

+            if(!cmdBufferStarted)

+            {

+                cmdBufferStarted = true;

+                BeginSingleTimeCommands();

+            }

+

+            VkBufferCopy copy = {};

+            copy.srcOffset = 0;

+            copy.dstOffset = 0;

+            copy.size = size;

+            vkCmdCopyBuffer(g_hTemporaryCommandBuffer, currAllocInfo.m_Buffer, stagingBuf, 1, &copy);

+

+            // Sava mapped pointer for later validation.

+            validateStagingBuffers.push_back(stagingBufMappedPtr);

+        }

+        else

+        {

+            TEST(0 && "Images not currently supported.");

+        }

+    }

+

+    if(cmdBufferStarted)

+    {

+        EndSingleTimeCommands();

+

+        for(size_t validateIndex = 0;

+            validateIndex < validateStagingBuffers.size();

+            ++validateIndex)

+        {

+            const size_t validateAllocIndex = validateIndex + validateAllocIndexOffset;

+            const VkDeviceSize validateSize = allocInfo[validateAllocIndex].m_BufferInfo.size;

+            TEST(validateSize % sizeof(uint32_t) == 0);

+            const uint32_t* stagingValPtr = (const uint32_t*)validateStagingBuffers[validateIndex];

+            uint32_t val = allocInfo[validateAllocIndex].m_StartValue;

+            bool valid = true;

+            for(size_t i = 0; i < validateSize / sizeof(uint32_t); ++i)

+            {

+                if(*stagingValPtr != val)

+                {

+                    valid = false;

+                    break;

+                }

+                ++stagingValPtr;

+                ++val;

+            }

+            TEST(valid);

+        }

+

+        stagingBufs.ReleaseAllBuffers();

+    }

+}

+

 static void GetMemReq(VmaAllocationCreateInfo& outMemReq)

 {

     outMemReq = {};

@@ -700,7 +1027,7 @@
     }

 }

 

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

+static void CreateAllocation(AllocInfo& outAllocation)

 {

     outAllocation.m_Allocation = nullptr;

     outAllocation.m_Buffer = nullptr;

@@ -724,7 +1051,7 @@
         bufferInfo.size = bufferSize;

         bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

 

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

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

         outAllocation.m_BufferInfo = bufferInfo;

         TEST(res == VK_SUCCESS);

     }

@@ -750,7 +1077,7 @@
         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);

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

         outAllocation.m_ImageInfo = imageInfo;

         TEST(res == VK_SUCCESS);

     }

@@ -758,7 +1085,7 @@
     uint32_t* data = (uint32_t*)allocInfo.pMappedData;

     if(allocInfo.pMappedData == nullptr)

     {

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

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

         TEST(res == VK_SUCCESS);

     }

 

@@ -768,7 +1095,7 @@
         data[i] = value++;

 

     if(allocInfo.pMappedData == nullptr)

-        vmaUnmapMemory(allocator, outAllocation.m_Allocation);

+        vmaUnmapMemory(g_hAllocator, outAllocation.m_Allocation);

 }

 

 static void DestroyAllocation(const AllocInfo& allocation)

@@ -1042,7 +1369,7 @@
     for(size_t i = 0; i < 400; ++i)

     {

         AllocInfo allocation;

-        CreateAllocation(allocation, g_hAllocator);

+        CreateAllocation(allocation);

         allocations.push_back(allocation);

     }

 

@@ -1118,6 +1445,113 @@
     DestroyAllAllocations(allocations);

 }

 

+static void TestDefragmentationGpu()

+{

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

+    g_MemoryAliasingWarningEnabled = false;

+

+    std::vector<AllocInfo> allocations;

+

+    // Create that many allocations to surely fill 3 new blocks of 256 MB.

+    const VkDeviceSize bufSize = 10ull * 1024 * 1024;

+    const VkDeviceSize totalSize = 3ull * 256 * 1024 * 1024;

+    const size_t bufCount = (size_t)(totalSize / bufSize);

+    const size_t percentToLeave = 20;

+    RandomNumberGenerator rand = { 234522 };

+

+    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+    bufCreateInfo.size = bufSize;

+    bufCreateInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |

+        VK_BUFFER_USAGE_TRANSFER_DST_BIT |

+        VK_BUFFER_USAGE_TRANSFER_SRC_BIT;

+

+    VmaAllocationCreateInfo allocCreateInfo = {};

+    allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;

+    allocCreateInfo.flags = VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT;

+    allocCreateInfo.pUserData = "TestDefragmentationGpu";

+

+    // Create all intended buffers.

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

+    {

+        AllocInfo alloc;

+        alloc.CreateBuffer(bufCreateInfo, allocCreateInfo);

+        alloc.m_StartValue = rand.Generate();

+        allocations.push_back(alloc);

+    }

+

+    // Destroy some percentage of them.

+    {

+        const size_t buffersToDestroy = round_div<size_t>(bufCount * (100 - percentToLeave), 100);

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

+        {

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

+            allocations[index].Destroy();

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

+        }

+    }

+

+    // Fill them with meaningful data.

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

+

+    SaveAllocatorStatsToFile(L"GPU_defragmentation_A_before.json");

+

+    // Defragment using GPU only.

+    {

+        const size_t allocCount = allocations.size();

+

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

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

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

+        {

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

+        }

+        memset(allocationChanged.data(), 0, allocCount * sizeof(VkBool32));

+

+        BeginSingleTimeCommands();

+

+        VmaDefragmentationInfo2 defragInfo = {};

+        defragInfo.allocationCount = (uint32_t)allocCount;

+        defragInfo.pAllocations = allocationPtrs.data();

+        defragInfo.pAllocationsChanged = allocationChanged.data();

+        defragInfo.maxGpuBytesToMove = VK_WHOLE_SIZE;

+        defragInfo.maxGpuAllocationsToMove = UINT32_MAX;

+        defragInfo.commandBuffer = g_hTemporaryCommandBuffer;

+

+        VmaDefragmentationStats stats = {};

+        VmaDefragmentationContext ctx = VK_NULL_HANDLE;

+        VkResult res = vmaDefragmentationBegin(g_hAllocator, &defragInfo, &stats, &ctx);

+        TEST(res >= VK_SUCCESS);

+

+        EndSingleTimeCommands();

+

+        vmaDefragmentationEnd(g_hAllocator, ctx);

+

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

+        {

+            if(allocationChanged[i])

+            {

+                RecreateAllocationResource(allocations[i]);

+            }

+        }

+

+        TEST(stats.allocationsMoved > 0 && stats.bytesMoved > 0);

+        TEST(stats.deviceMemoryBlocksFreed > 0 && stats.bytesFreed > 0);

+        TEST(stats.allocationsLost == 0);

+    }

+

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

+

+    SaveAllocatorStatsToFile(L"GPU_defragmentation_B_after.json");

+

+    // Destroy all remaining buffers.

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

+    {

+        allocations[i].Destroy();

+    }

+

+    g_MemoryAliasingWarningEnabled = true;

+}

+

 static void TestUserData()

 {

     VkResult res;

@@ -4418,23 +4852,61 @@
     vmaDestroyPool(g_hAllocator, pool);

 }

 

+// Test the testing environment.

+static void TestGpuData()

+{

+    RandomNumberGenerator rand = { 53434 };

+

+    std::vector<AllocInfo> allocInfo;

+

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

+    {

+        AllocInfo info = {};

+

+        info.m_BufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;

+        info.m_BufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT |

+            VK_BUFFER_USAGE_TRANSFER_SRC_BIT |

+            VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;

+        info.m_BufferInfo.size = 1024 * 1024 * (rand.Generate() % 9 + 1);

+

+        VmaAllocationCreateInfo allocCreateInfo = {};

+        allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;

+

+        VkResult res = vmaCreateBuffer(g_hAllocator, &info.m_BufferInfo, &allocCreateInfo, &info.m_Buffer, &info.m_Allocation, nullptr);

+        TEST(res == VK_SUCCESS);

+

+        info.m_StartValue = rand.Generate();

+

+        allocInfo.push_back(std::move(info));

+    }

+

+    UploadGpuData(allocInfo.data(), allocInfo.size());

+

+    ValidateGpuData(allocInfo.data(), allocInfo.size());

+

+    DestroyAllAllocations(allocInfo);

+}

+

 void Test()

 {

     wprintf(L"TESTING:\n");

 

-    if(false)

+    if(true)

     {

         // # Temporarily insert custom tests here

         // ########################################

         // ########################################

         

-        TestResize();

+        TestDefragmentationGpu();

+        TestDefragmentationSimple();

+        TestDefragmentationFull();

         return;

     }

 

     // # Simple tests

 

     TestBasics();

+    //TestGpuData(); // Not calling this because it's just testing the testing environment.

 #if VMA_DEBUG_MARGIN

     TestDebugMargin();

 #else

@@ -4463,6 +4935,7 @@
 

     TestDefragmentationSimple();

     TestDefragmentationFull();

+    TestDefragmentationGpu();

 

     // # Detailed tests

     FILE* file;

diff --git a/src/VmaReplay/VmaReplay.cpp b/src/VmaReplay/VmaReplay.cpp
index a9acfa5..e81aa1d 100644
--- a/src/VmaReplay/VmaReplay.cpp
+++ b/src/VmaReplay/VmaReplay.cpp
@@ -41,6 +41,7 @@
     CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION,

     CMD_LINE_OPT_MEM_STATS,

     CMD_LINE_OPT_DUMP_STATS_AFTER_LINE,

+    CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE,

     CMD_LINE_OPT_DUMP_DETAILED_STATS_AFTER_LINE,

 };

 

@@ -140,7 +141,9 @@
     bool operator==(const StatsAfterLineEntry& rhs) const { return line == rhs.line; }

 };

 static std::vector<StatsAfterLineEntry> g_DumpStatsAfterLine;

+static std::vector<size_t> g_DefragmentAfterLine;

 static size_t g_DumpStatsAfterLineNextIndex = 0;

+static size_t g_DefragmentAfterLineNextIndex = 0;

 

 static bool ValidateFileVersion()

 {

@@ -923,6 +926,7 @@
     void ApplyConfig(ConfigurationParser& configParser);

     void ExecuteLine(size_t lineNumber, const StrRange& line);

     void DumpStats(const char* fileNameFormat, size_t lineNumber, bool detailed);

+    void Defragment();

 

     void PrintStats();

 

@@ -934,9 +938,14 @@
 

     VkInstance m_VulkanInstance = VK_NULL_HANDLE;

     VkPhysicalDevice m_PhysicalDevice = VK_NULL_HANDLE;

-    uint32_t m_GraphicsQueueFamilyIndex = UINT_MAX;

+    uint32_t m_GraphicsQueueFamilyIndex = UINT32_MAX;

+    uint32_t m_TransferQueueFamilyIndex = UINT32_MAX;

     VkDevice m_Device = VK_NULL_HANDLE;

+    VkQueue m_GraphicsQueue = VK_NULL_HANDLE;

+    VkQueue m_TransferQueue = VK_NULL_HANDLE;

     VmaAllocator m_Allocator = VK_NULL_HANDLE;

+    VkCommandPool m_CommandPool = VK_NULL_HANDLE;

+    VkCommandBuffer m_CommandBuffer = VK_NULL_HANDLE;

     bool m_DedicatedAllocationEnabled = false;

     const VkPhysicalDeviceProperties* m_DevProps = nullptr;

     const VkPhysicalDeviceMemoryProperties* m_MemProps = nullptr;

@@ -1020,6 +1029,9 @@
     void ExecuteResizeAllocation(size_t lineNumber, const CsvSplit& csvSplit);

 

     void DestroyAllocation(size_t lineNumber, const CsvSplit& csvSplit);

+

+    void PrintStats(const VmaStats& stats, const char* suffix);

+    void PrintStatInfo(const VmaStatInfo& info);

 };

 

 Player::Player()

@@ -1418,11 +1430,18 @@
         vkGetPhysicalDeviceQueueFamilyProperties(m_PhysicalDevice, &queueFamilyCount, queueFamilies.data());

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

         {

-            if(queueFamilies[i].queueCount > 0 &&

-                (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0)

+            if(queueFamilies[i].queueCount > 0)

             {

-                m_GraphicsQueueFamilyIndex = i;

-                break;

+                if(m_GraphicsQueueFamilyIndex == UINT32_MAX &&

+                    (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0)

+                {

+                    m_GraphicsQueueFamilyIndex = i;

+                }

+                if(m_TransferQueueFamilyIndex == UINT32_MAX &&

+                    (queueFamilies[i].queueFlags & VK_QUEUE_TRANSFER_BIT) != 0)

+                {

+                    m_TransferQueueFamilyIndex = i;

+                }

             }

         }

     }

@@ -1431,6 +1450,11 @@
         printf("ERROR: Couldn't find graphics queue.\n");

         return RESULT_ERROR_VULKAN;

     }

+    if(m_TransferQueueFamilyIndex == UINT_MAX)

+    {

+        printf("ERROR: Couldn't find transfer queue.\n");

+        return RESULT_ERROR_VULKAN;

+    }

 

     VkPhysicalDeviceFeatures supportedFeatures;

     vkGetPhysicalDeviceFeatures(m_PhysicalDevice, &supportedFeatures);

@@ -1439,10 +1463,19 @@
 

     const float queuePriority = 1.f;

 

-    VkDeviceQueueCreateInfo deviceQueueCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO };

-    deviceQueueCreateInfo.queueFamilyIndex = m_GraphicsQueueFamilyIndex;

-    deviceQueueCreateInfo.queueCount = 1;

-    deviceQueueCreateInfo.pQueuePriorities = &queuePriority;

+    VkDeviceQueueCreateInfo deviceQueueCreateInfo[2] = {};

+    deviceQueueCreateInfo[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;

+    deviceQueueCreateInfo[0].queueFamilyIndex = m_GraphicsQueueFamilyIndex;

+    deviceQueueCreateInfo[0].queueCount = 1;

+    deviceQueueCreateInfo[0].pQueuePriorities = &queuePriority;

+

+    if(m_TransferQueueFamilyIndex != m_GraphicsQueueFamilyIndex)

+    {

+        deviceQueueCreateInfo[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;

+        deviceQueueCreateInfo[1].queueFamilyIndex = m_TransferQueueFamilyIndex;

+        deviceQueueCreateInfo[1].queueCount = 1;

+        deviceQueueCreateInfo[1].pQueuePriorities = &queuePriority;

+    }

 

     // Enable something what may interact with memory/buffer/image support.

     VkPhysicalDeviceFeatures enabledFeatures;

@@ -1508,8 +1541,8 @@
     VkDeviceCreateInfo deviceCreateInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };

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

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

-    deviceCreateInfo.queueCreateInfoCount = 1;

-    deviceCreateInfo.pQueueCreateInfos = &deviceQueueCreateInfo;

+    deviceCreateInfo.queueCreateInfoCount = m_TransferQueueFamilyIndex != m_GraphicsQueueFamilyIndex ? 2 : 1;

+    deviceCreateInfo.pQueueCreateInfos = deviceQueueCreateInfo;

     deviceCreateInfo.pEnabledFeatures = &enabledFeatures;

 

     res = vkCreateDevice(m_PhysicalDevice, &deviceCreateInfo, nullptr, &m_Device);

@@ -1519,6 +1552,10 @@
         return RESULT_ERROR_VULKAN;

     }

 

+    // Fetch queues

+    vkGetDeviceQueue(m_Device, m_GraphicsQueueFamilyIndex, 0, &m_GraphicsQueue);

+    vkGetDeviceQueue(m_Device, m_TransferQueueFamilyIndex, 0, &m_TransferQueue);

+

     // Create memory allocator

 

     VmaAllocatorCreateInfo allocatorInfo = {};

@@ -1541,6 +1578,32 @@
     vmaGetPhysicalDeviceProperties(m_Allocator, &m_DevProps);

     vmaGetMemoryProperties(m_Allocator, &m_MemProps);

 

+    // Create command pool

+

+    VkCommandPoolCreateInfo cmdPoolCreateInfo = { VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO };

+    cmdPoolCreateInfo.queueFamilyIndex = m_TransferQueueFamilyIndex;

+    cmdPoolCreateInfo.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT;

+

+    res = vkCreateCommandPool(m_Device, &cmdPoolCreateInfo, nullptr, &m_CommandPool);

+    if(res != VK_SUCCESS)

+    {

+        printf("ERROR: vkCreateCommandPool failed (%d)\n", res);

+        return RESULT_ERROR_VULKAN;

+    }

+

+    // Create command buffer

+

+    VkCommandBufferAllocateInfo cmdBufAllocInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO };

+    cmdBufAllocInfo.commandBufferCount = 1;

+    cmdBufAllocInfo.commandPool = m_CommandPool;

+    cmdBufAllocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;

+    res = vkAllocateCommandBuffers(m_Device, &cmdBufAllocInfo, &m_CommandBuffer);

+    if(res != VK_SUCCESS)

+    {

+        printf("ERROR: vkAllocateCommandBuffers failed (%d)\n", res);

+        return RESULT_ERROR_VULKAN;

+    }

+

     return 0;

 }

 

@@ -1578,6 +1641,18 @@
 

     vkDeviceWaitIdle(m_Device);

 

+    if(m_CommandBuffer != VK_NULL_HANDLE)

+    {

+        vkFreeCommandBuffers(m_Device, m_CommandPool, 1, &m_CommandBuffer);

+        m_CommandBuffer = VK_NULL_HANDLE;

+    }

+

+    if(m_CommandPool != VK_NULL_HANDLE)

+    {

+        vkDestroyCommandPool(m_Device, m_CommandPool, nullptr);

+        m_CommandPool = VK_NULL_HANDLE;

+    }

+

     if(m_Allocator != VK_NULL_HANDLE)

     {

         vmaDestroyAllocator(m_Allocator);

@@ -1630,6 +1705,139 @@
     assert(res == VK_SUCCESS);

 }

 

+void Player::Defragment()

+{

+    VmaStats stats;

+    vmaCalculateStats(m_Allocator, &stats);

+    PrintStats(stats, "before defragmentation");

+

+    const size_t allocCount = m_Allocations.size();

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

+    size_t notNullAllocCount = 0;

+    for(const auto& it : m_Allocations)

+    {

+        if(it.second.allocation != VK_NULL_HANDLE)

+        {

+            allocations[notNullAllocCount] = it.second.allocation;

+            ++notNullAllocCount;

+        }

+    }

+    if(notNullAllocCount == 0)

+    {

+        printf("    Nothing to defragment.\n");

+        return;

+    }

+

+    allocations.resize(notNullAllocCount);

+    std::vector<VkBool32> allocationsChanged(notNullAllocCount);

+

+    VmaDefragmentationStats defragStats = {};

+

+    VkCommandBufferBeginInfo cmdBufBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };

+    cmdBufBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;

+    VkResult res = vkBeginCommandBuffer(m_CommandBuffer, &cmdBufBeginInfo);

+    if(res != VK_SUCCESS)

+    {

+        printf("ERROR: vkBeginCommandBuffer failed (%d)\n", res);

+        return;

+    }

+

+    g_MemoryAliasingWarningEnabled = false;

+

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

+

+    VmaDefragmentationInfo2 defragInfo = {};

+    defragInfo.allocationCount = (uint32_t)notNullAllocCount;

+    defragInfo.pAllocations = allocations.data();

+    defragInfo.pAllocationsChanged = allocationsChanged.data();

+    defragInfo.maxCpuAllocationsToMove = UINT32_MAX;

+    defragInfo.maxCpuBytesToMove = VK_WHOLE_SIZE;

+    defragInfo.maxGpuAllocationsToMove = UINT32_MAX;

+    defragInfo.maxGpuBytesToMove = VK_WHOLE_SIZE;

+    defragInfo.flags = VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT;

+    defragInfo.commandBuffer = m_CommandBuffer;

+

+    VmaDefragmentationContext defragCtx = VK_NULL_HANDLE;

+    res = vmaDefragmentationBegin(m_Allocator, &defragInfo, &defragStats, &defragCtx);

+    

+    const time_point timeAfterDefragBegin = std::chrono::high_resolution_clock::now();

+

+    vkEndCommandBuffer(m_CommandBuffer);

+

+    if(res >= VK_SUCCESS)

+    {

+        VkSubmitInfo submitInfo = { VK_STRUCTURE_TYPE_SUBMIT_INFO };

+        submitInfo.commandBufferCount = 1;

+        submitInfo.pCommandBuffers = &m_CommandBuffer;

+        vkQueueSubmit(m_TransferQueue, 1, &submitInfo, VK_NULL_HANDLE);

+        vkQueueWaitIdle(m_TransferQueue);

+

+        const time_point timeAfterGpu = std::chrono::high_resolution_clock::now();

+

+        vmaDefragmentationEnd(m_Allocator, defragCtx);

+

+        const time_point timeAfterDefragEnd = std::chrono::high_resolution_clock::now();

+

+        const duration defragDurationBegin = timeAfterDefragBegin - timeBeg;

+        const duration defragDurationGpu   = timeAfterGpu - timeAfterDefragBegin;

+        const duration defragDurationEnd   = timeAfterDefragEnd - timeAfterGpu;

+

+        // If anything changed.

+        if(defragStats.allocationsLost > 0 || defragStats.allocationsMoved > 0)

+        {

+            // Go over allocation that changed and destroy their buffers and images.

+            size_t i = 0;

+            for(auto& it : m_Allocations)

+            {

+                if(allocationsChanged[i] != VK_FALSE)

+                {

+                    if(it.second.buffer != VK_NULL_HANDLE)

+                    {

+                        vkDestroyBuffer(m_Device, it.second.buffer, nullptr);

+                        it.second.buffer = VK_NULL_HANDLE;

+                    }

+                    if(it.second.image != VK_NULL_HANDLE)

+                    {

+                        vkDestroyImage(m_Device, it.second.image, nullptr);

+                        it.second.image = VK_NULL_HANDLE;

+                    }

+                }

+                ++i;

+            }

+        }

+

+        // Print statistics

+        std::string defragDurationBeginStr;

+        std::string defragDurationGpuStr;

+        std::string defragDurationEndStr;

+        SecondsToFriendlyStr(ToFloatSeconds(defragDurationBegin), defragDurationBeginStr);

+        SecondsToFriendlyStr(ToFloatSeconds(defragDurationGpu), defragDurationGpuStr);

+        SecondsToFriendlyStr(ToFloatSeconds(defragDurationEnd), defragDurationEndStr);

+

+        printf("    Defragmentation took:\n");

+        printf("        vmaDefragmentationBegin: %s\n", defragDurationBeginStr.c_str());

+        printf("        GPU: %s\n", defragDurationGpuStr.c_str());

+        printf("        vmaDefragmentationEnd: %s\n", defragDurationEndStr.c_str());

+        printf("    VmaDefragmentationStats:\n");

+        printf("        bytesMoved: %llu\n", defragStats.bytesMoved);

+        printf("        bytesFreed: %llu\n", defragStats.bytesFreed);

+        printf("        allocationsMoved: %u\n", defragStats.allocationsMoved);

+        printf("        deviceMemoryBlocksMoved: %u\n", defragStats.deviceMemoryBlocksFreed);

+        printf("        allocationsLost: %u\n", defragStats.allocationsLost);

+

+        vmaCalculateStats(m_Allocator, &stats);

+        PrintStats(stats, "after defragmentation");

+    }

+    else

+    {

+        printf("vmaDefragmentationBegin failed (%d).\n", res);

+    }

+

+    vkResetCommandPool(m_Device, m_CommandPool, 0);

+

+    g_MemoryAliasingWarningEnabled = true;

+}

+

 void Player::PrintStats()

 {

     if(g_Verbosity == VERBOSITY::MINIMUM)

@@ -2001,6 +2209,9 @@
         {

             FindPool(lineNumber, origPool, allocCreateInfo.pool);

 

+            // Forcing VK_SHARING_MODE_EXCLUSIVE because we use only one queue anyway.

+            bufCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;

+

             if(csvSplit.GetCount() > FIRST_PARAM_INDEX + 11)

             {

                 PrepareUserData(

@@ -2065,6 +2276,42 @@
     }

 }

 

+void Player::PrintStats(const VmaStats& stats, const char* suffix)

+{

+    printf("    VmaStats %s:\n", suffix);

+    printf("        total:\n");

+    PrintStatInfo(stats.total);

+

+    if(g_Verbosity == VERBOSITY::MAXIMUM)

+    {

+        for(uint32_t i = 0; i < m_MemProps->memoryHeapCount; ++i)

+        {

+            printf("        memoryHeap[%u]:\n", i);

+            PrintStatInfo(stats.memoryHeap[i]);

+        }

+        for(uint32_t i = 0; i < m_MemProps->memoryTypeCount; ++i)

+        {

+            printf("        memoryType[%u]:\n", i);

+            PrintStatInfo(stats.memoryType[i]);

+        }

+    }

+}

+

+void Player::PrintStatInfo(const VmaStatInfo& info)

+{

+    printf("            blockCount: %u\n", info.blockCount);

+    printf("            allocationCount: %u\n", info.allocationCount);

+    printf("            unusedRangeCount: %u\n", info.unusedRangeCount);

+    printf("            usedBytes: %llu\n", info.usedBytes);

+    printf("            unusedBytes: %llu\n", info.unusedBytes);

+    printf("            allocationSizeMin: %llu\n", info.allocationSizeMin);

+    printf("            allocationSizeAvg: %llu\n", info.allocationSizeAvg);

+    printf("            allocationSizeMax: %llu\n", info.allocationSizeMax);

+    printf("            unusedRangeSizeMin: %llu\n", info.unusedRangeSizeMin);

+    printf("            unusedRangeSizeAvg: %llu\n", info.unusedRangeSizeAvg);

+    printf("            unusedRangeSizeMax: %llu\n", info.unusedRangeSizeMax);

+}

+

 void Player::ExecuteCreateImage(size_t lineNumber, const CsvSplit& csvSplit)

 {

     m_Stats.RegisterFunctionCall(VMA_FUNCTION::CreateImage);

@@ -2099,6 +2346,9 @@
         {

             FindPool(lineNumber, origPool, allocCreateInfo.pool);

 

+            // Forcing VK_SHARING_MODE_EXCLUSIVE because we use only one queue anyway.

+            imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;

+

             if(csvSplit.GetCount() > FIRST_PARAM_INDEX + 20)

             {

                 PrepareUserData(

@@ -2664,6 +2914,8 @@
         "        File is written to current directory with name: VmaReplay_Line####.json.\n"

         "        This parameter can be repeated.\n"

         "    --DumpDetailedStatsAfterLine <Line> - Like command above, but includes detailed map.\n"

+        "    --DefragmentAfterLine <Line> - Defragment memory after specified source file line and print statistics.\n"

+        "        It also prints detailed statistics to files VmaReplay_Line####_Defragment*.json\n"

         "    --Lines <Ranges> - Replay only limited set of lines from file\n"

         "        Ranges is comma-separated list of ranges, e.g. \"-10,15,18-25,31-\".\n"

         "    --PhysicalDevice <Index> - Choice of Vulkan physical device. Default: 0.\n"

@@ -2682,6 +2934,7 @@
 

     const bool useLineRanges = !g_LineRanges.IsEmpty();

     const bool useDumpStatsAfterLine = !g_DumpStatsAfterLine.empty();

+    const bool useDefragmentAfterLine = !g_DefragmentAfterLine.empty();

 

     LineSplit lineSplit(data, numBytes);

     StrRange line;

@@ -2777,6 +3030,25 @@
                 

                 ++g_DumpStatsAfterLineNextIndex;

             }

+

+            while(useDefragmentAfterLine &&

+                g_DefragmentAfterLineNextIndex < g_DefragmentAfterLine.size() &&

+                currLineNumber >= g_DefragmentAfterLine[g_DefragmentAfterLineNextIndex])

+            {

+                const size_t requestedLine = g_DefragmentAfterLine[g_DefragmentAfterLineNextIndex];

+                if(g_Verbosity >= VERBOSITY::DEFAULT)

+                {

+                    printf("Defragmenting after line %zu actual line %zu...\n",

+                        requestedLine,

+                        currLineNumber);

+                }

+

+                player.DumpStats("VmaReplay_Line%04zu_Defragment_1Before.json", requestedLine, true);

+                player.Defragment();

+                player.DumpStats("VmaReplay_Line%04zu_Defragment_2After.json", requestedLine, true);

+                

+                ++g_DefragmentAfterLineNextIndex;

+            }

         }

 

         const duration playDuration = std::chrono::high_resolution_clock::now() - timeBeg;

@@ -2875,6 +3147,7 @@
     cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION, VALIDATION_LAYER_NAME, true);

     cmdLineParser.RegisterOpt(CMD_LINE_OPT_MEM_STATS, "MemStats", true);

     cmdLineParser.RegisterOpt(CMD_LINE_OPT_DUMP_STATS_AFTER_LINE, "DumpStatsAfterLine", true);

+    cmdLineParser.RegisterOpt(CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE, "DefragmentAfterLine", true);

     cmdLineParser.RegisterOpt(CMD_LINE_OPT_DUMP_DETAILED_STATS_AFTER_LINE, "DumpDetailedStatsAfterLine", true);

 

     CmdLineParser::RESULT res;

@@ -2984,6 +3257,20 @@
                     }

                 }

                 break;

+            case CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE:

+                {

+                    size_t line;

+                    if(StrRangeToUint(StrRange(cmdLineParser.GetParameter()), line))

+                    {

+                        g_DefragmentAfterLine.push_back(line);

+                    }

+                    else

+                    {

+                        PrintCommandLineSyntax();

+                        return RESULT_ERROR_COMMAND_LINE;

+                    }

+                }

+                break;

             default:

                 assert(0);

             }

@@ -3022,6 +3309,12 @@
         std::unique(g_DumpStatsAfterLine.begin(), g_DumpStatsAfterLine.end()),

         g_DumpStatsAfterLine.end());

 

+    // Sort g_DefragmentAfterLine and make unique.

+    std::sort(g_DefragmentAfterLine.begin(), g_DefragmentAfterLine.end());

+    g_DefragmentAfterLine.erase(

+        std::unique(g_DefragmentAfterLine.begin(), g_DefragmentAfterLine.end()),

+        g_DefragmentAfterLine.end());

+

     return ProcessFile();

 }

 

diff --git a/src/VmaUsage.h b/src/VmaUsage.h
index bd31938..43e1671 100644
--- a/src/VmaUsage.h
+++ b/src/VmaUsage.h
@@ -24,6 +24,8 @@
 //#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1

 //#define VMA_RECORDING_ENABLED 0

 //#define VMA_DEBUG_MIN_BUFFER_IMAGE_GRANULARITY 256

+//#define VMA_USE_STL_SHARED_MUTEX 0

+//#define VMA_DEBUG_GLOBAL_MUTEX 1

 

 #pragma warning(push, 4)

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

diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index 8c7b2c6..8d3b05c 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -86,7 +86,7 @@
 static VkDebugReportCallbackEXT g_hCallback;

 

 static VkQueue g_hGraphicsQueue;

-static VkCommandBuffer g_hTemporaryCommandBuffer;

+VkCommandBuffer g_hTemporaryCommandBuffer;

 

 static VkPipelineLayout g_hPipelineLayout;

 static VkRenderPass g_hRenderPass;

@@ -125,14 +125,14 @@
     _aligned_free(pMemory);

 }

 

-static void BeginSingleTimeCommands()

+void BeginSingleTimeCommands()

 {

     VkCommandBufferBeginInfo cmdBufBeginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };

     cmdBufBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;

     ERR_GUARD_VULKAN( vkBeginCommandBuffer(g_hTemporaryCommandBuffer, &cmdBufBeginInfo) );

 }

 

-static void EndSingleTimeCommands()

+void EndSingleTimeCommands()

 {

     ERR_GUARD_VULKAN( vkEndCommandBuffer(g_hTemporaryCommandBuffer) );

 

diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index f504e3e..a59134f 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -720,7 +720,7 @@
 To mitigate this problem, you can use vmaDefragment(). Given set of allocations,

 this function can move them to compact used memory, ensure more continuous free

 space and possibly also free some `VkDeviceMemory`. Currently it can work only on

-allocations made from memory type that is `HOST_VISIBLE` and `HOST_COHERENT`. Allocations are

+allocations made from memory type that is `HOST_VISIBLE`. Allocations are

 modified to point to the new `VkDeviceMemory` and offset. Data in this memory is

 also `memmove`-ed to the new place. However, if you have images or buffers bound

 to these allocations (and you certainly do), you need to destroy, recreate, and

@@ -1427,6 +1427,7 @@
 - *Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug.*

   - It happens when you use lost allocations, and a new image or buffer is

     created in place of an existing object that bacame lost.

+  - It may happen also when you use [defragmentation](@ref defragmentation).

 

 \section general_considerations_allocation_algorithm Allocation algorithm

 

@@ -1454,7 +1455,7 @@
   Any explicit support for sparse binding/residency would rather

   require another, higher-level library on top of VMA.

 - Data transfer - issuing commands that transfer data between buffers or images, any usage of

-  `VkCommandList` or `VkQueue` and related synchronization is responsibility of the user.

+  `VkCommandBuffer` or `VkQueue` and related synchronization is responsibility of the user.

 - Allocations for imported/exported external memory. They tend to require

   explicit memory type index and dedicated allocation anyway, so they don't

   interact with main features of this library. Such special purpose allocations

@@ -1509,7 +1510,7 @@
 /** \struct VmaAllocator

 \brief Represents main object of this library initialized.

 

-Fill structure VmaAllocatorCreateInfo and call function vmaCreateAllocator() to create it.

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

@@ -1599,6 +1600,7 @@
     PFN_vkDestroyBuffer vkDestroyBuffer;

     PFN_vkCreateImage vkCreateImage;

     PFN_vkDestroyImage vkDestroyImage;

+    PFN_vkCmdCopyBuffer vkCmdCopyBuffer;

 #if VMA_DEDICATED_ALLOCATION

     PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;

     PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;

@@ -2568,7 +2570,100 @@
 */

 VkResult vmaCheckCorruption(VmaAllocator allocator, uint32_t memoryTypeBits);

 

-/** \brief Optional configuration parameters to be passed to function vmaDefragment(). */

+/** \struct VmaDefragmentationContext

+\brief Represents Opaque object that represents started defragmentation process.

+

+Fill structure #VmaDefragmentationInfo2 and call function vmaDefragmentationBegin() to create it.

+Call function vmaDefragmentationEnd() to destroy it.

+*/

+VK_DEFINE_HANDLE(VmaDefragmentationContext)

+

+/// Flags to be used in vmaDefragmentationBegin().

+typedef enum VmaDefragmentationFlagBits {

+    /** Add this flag to enable allocations created with #VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT

+    flag to become lost during defragmentation process if the algorithm decides it is beneficial.

+    */

+    VMA_DEFRAGMENTATION_CAN_MAKE_LOST_BIT = 0x00000001,

+

+    /** Add this flag to change defragmentation algorithm to fast rather than default (balanced).

+    This algorithm will favor speed over quality of defragmentation.

+    Defragmentation will be done as fast and move as little allocations and bytes as possible while

+    still providing some benefits.

+    */

+    VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT = 0x000010000,

+    /** Add this flag to change defragmentation algorithm to optimal rather than default (balanced).

+    This algorithm will favor quality of defragmentation over speed.

+    Allocations will be as perfectly compacted as possible.

+    */

+    VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT = 0x00002000,

+    /** \brief A bit mask to extract only `ALGORITHM` bits from entire set of flags.

+    */

+    VMA_DEFRAGMENTATION_ALGORITHM_MASK =

+        VMA_DEFRAGMENTATION_FAST_ALGORITHM_BIT |

+        VMA_DEFRAGMENTATION_OPTIMAL_ALGORITHM_BIT,

+

+    VMA_DEFRAGMENTATION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF

+} VmaDefragmentationFlagBits;

+typedef VkFlags VmaDefragmentationFlags;

+

+/** \brief Parameters for defragmentation.

+

+To be used with function vmaDefragmentationBegin().

+*/

+typedef struct VmaDefragmentationInfo2 {

+    /** \brief Flags for defragmentation. Use #VmaDefragmentationFlagBits enum.

+    */

+    VmaDefragmentationFlags flags;

+    /** \brief Number of allocations in `pAllocations` array.

+    */

+    uint32_t allocationCount;

+    /** \brief Pointer to array of allocations that can be defragmented.

+

+    The array should have `allocationCount` elements.

+    All other allocations are considered non-moveable during this defragmentation.

+    */

+    VmaAllocation* pAllocations;

+    /** \brief Optional, output. Pointer to array that will be filled with information whether the allocation at certain index has been changed (moved or lost) during defragmentation.

+

+    The array should have `allocationCount` elements.

+    You can pass null if you are not interested in this information.

+    */

+    VkBool32* pAllocationsChanged;

+    /** \brief Maximum total numbers of bytes that can be copied while moving allocations to different places using transfers on CPU side, like `memcpy()`, `memmove()`.

+    

+    `VK_WHOLE_SIZE` means no limit.

+    */

+    VkDeviceSize maxCpuBytesToMove;

+    /** \brief Maximum number of allocations that can be moved to a different place using transfers on CPU side, like `memcpy()`, `memmove()`.

+

+    `UINT32_MAX` means no limit.

+    */

+    uint32_t maxCpuAllocationsToMove;

+    /** \brief Maximum total numbers of bytes that can be copied while moving allocations to different places using transfers on GPU side, posted to `commandBuffer`.

+    

+    `VK_WHOLE_SIZE` means no limit.

+    */

+    VkDeviceSize maxGpuBytesToMove;

+    /** \brief Maximum number of allocations that can be moved to a different place using transfers on GPU side, posted to `commandBuffer`.

+

+    `UINT32_MAX` means no limit.

+    */

+    uint32_t maxGpuAllocationsToMove;

+    /** \brief Optional. Command buffer where GPU copy commands will be posted.

+

+    If not null, it must be a valid command buffer handle that supports Transfer queue type.

+    It must be in the recording state and outside of a render pass instance.

+    You need to submit it and make sure it finished execution before calling vmaDefragmentationEnd().

+

+    Passing null means that only CPU defragmentation will be performed.

+    */

+    VkCommandBuffer commandBuffer;

+} VmaDefragmentationInfo2;

+

+/** \brief Deprecated. Optional configuration parameters to be passed to function vmaDefragment().

+

+\deprecated This is a part of the old interface. It is recommended to use structure #VmaDefragmentationInfo2 and function vmaDefragmentationBegin() instead.

+*/

 typedef struct VmaDefragmentationInfo {

     /** \brief Maximum total numbers of bytes that can be copied while moving allocations to different places.

     

@@ -2592,16 +2687,60 @@
     uint32_t allocationsMoved;

     /// Number of empty `VkDeviceMemory` objects that have been released to the system.

     uint32_t deviceMemoryBlocksFreed;

+    /// Number of allocations that became lost in the process of defragmentation.

+    uint32_t allocationsLost;

 } VmaDefragmentationStats;

 

-/** \brief Compacts memory by moving allocations.

+/** \brief Begins defragmentation process.

+

+@param allocator Allocator object.

+@param pInfo Structure filled with parameters of defragmentation.

+@param pStats[out] Optional. Statistics of defragmentation. You can pass null if you are not interested in this information.

+@param pContext[out] Context object that must be passed to vmaDefragmentationEnd() to finish defragmentation.

+@return `VK_SUCCESS` and `*pContext == null` if defragmentation finished within this function call. `VK_NOT_READY` and `*pContext != null` if defragmentation has been started and you need to call vmaDefragmentationEnd() to finish it. Negative value in case of error.

+

+Use this function instead of old, deprecated vmaDefragment().

+

+Warning! Between the call to vmaDefragmentationBegin() and vmaDefragmentationEnd():

+

+- You should not use any of allocations passed as `pInfo->pAllocations`,

+  including calling vmaGetAllocationInfo(), vmaTouchAllocation(), or accessing

+  their data.

+- Some mutexes protecting internal data structures may be locked, so trying to

+  make or free any allocations, bind buffers or images, map memory, or launch

+  another simultaneous defragmentation in between may cause stall (when done on

+  another thread) or deadlock (when done on the same thread), unless you are

+  100% sure that defragmented allocations are from different pool.

+- Information returned via `pStats` and `pInfo->pAllocationsChanged` are undefined.

+  They become valid after call to vmaDefragmentationEnd().

+- If `pInfo->commandBuffer != VK_NULL_HANDLE`, you must submit that command buffer

+  and make sure it finished execution before calling vmaDefragmentationEnd().

+*/

+VkResult vmaDefragmentationBegin(

+    VmaAllocator allocator,

+    const VmaDefragmentationInfo2* pInfo,

+    VmaDefragmentationStats* pStats,

+    VmaDefragmentationContext *pContext);

+

+/** \brief Ends defragmentation process.

+

+Use this function to finish defragmentation started by vmaDefragmentationBegin().

+It is safe to pass `context == null`. The function then does nothing.

+*/

+VkResult vmaDefragmentationEnd(

+    VmaAllocator allocator,

+    VmaDefragmentationContext context);

+

+/** \brief Deprecated. Compacts memory by moving allocations.

 

 @param pAllocations Array of allocations that can be moved during this compation.

 @param allocationCount Number of elements in pAllocations and pAllocationsChanged arrays.

 @param[out] pAllocationsChanged Array of boolean values that will indicate whether matching allocation in pAllocations array has been moved. This parameter is optional. Pass null if you don't need this information.

 @param pDefragmentationInfo Configuration parameters. Optional - pass null to use default values.

 @param[out] pDefragmentationStats Statistics returned by the function. Optional - pass null if you don't need this information.

-@return `VK_SUCCESS` if completed, `VK_INCOMPLETE` if succeeded but didn't make all possible optimizations because limits specified in `pDefragmentationInfo` have been reached, negative error code in case of error.

+@return `VK_SUCCESS` if completed, negative error code in case of error.

+

+\deprecated This is a part of the old interface. It is recommended to use structure #VmaDefragmentationInfo2 and function vmaDefragmentationBegin() instead.

 

 This function works by moving allocations to different places (different

 `VkDeviceMemory` objects and/or different offsets) in order to optimize memory

@@ -2802,6 +2941,13 @@
    #define VMA_USE_STL_LIST 1

 #endif

 

+#ifndef VMA_USE_STL_SHARED_MUTEX

+    // Minimum Visual Studio 2015 Update 2

+    #if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918

+        #define VMA_USE_STL_SHARED_MUTEX 1

+    #endif

+#endif

+

 #if VMA_USE_STL_VECTOR

    #include <vector>

 #endif

@@ -2820,7 +2966,7 @@
 */

 #include <cassert> // for assert

 #include <algorithm> // for min, max

-#include <mutex> // for std::mutex

+#include <mutex>

 #include <atomic> // for std::atomic

 

 #ifndef VMA_NULL

@@ -2947,8 +3093,6 @@
     class VmaMutex

     {

     public:

-        VmaMutex() { }

-        ~VmaMutex() { }

         void Lock() { m_Mutex.lock(); }

         void Unlock() { m_Mutex.unlock(); }

     private:

@@ -2957,6 +3101,52 @@
     #define VMA_MUTEX VmaMutex

 #endif

 

+// Read-write mutex, where "read" is shared access, "write" is exclusive access.

+#ifndef VMA_RW_MUTEX

+    #if VMA_USE_STL_SHARED_MUTEX

+        // Use std::shared_mutex from C++17.

+        #include <shared_mutex>

+        class VmaRWMutex

+        {

+        public:

+            void LockRead() { m_Mutex.lock_shared(); }

+            void UnlockRead() { m_Mutex.unlock_shared(); }

+            void LockWrite() { m_Mutex.lock(); }

+            void UnlockWrite() { m_Mutex.unlock(); }

+        private:

+            std::shared_mutex m_Mutex;

+        };

+        #define VMA_RW_MUTEX VmaRWMutex

+    #elif defined(_WIN32)

+        // Use SRWLOCK from WinAPI.

+        class VmaRWMutex

+        {

+        public:

+            VmaRWMutex() { InitializeSRWLock(&m_Lock); }

+            void LockRead() { AcquireSRWLockShared(&m_Lock); }

+            void UnlockRead() { ReleaseSRWLockShared(&m_Lock); }

+            void LockWrite() { AcquireSRWLockExclusive(&m_Lock); }

+            void UnlockWrite() { ReleaseSRWLockExclusive(&m_Lock); }

+        private:

+            SRWLOCK m_Lock;

+        };

+        #define VMA_RW_MUTEX VmaRWMutex

+    #else

+        // Less efficient fallback: Use normal mutex.

+        class VmaRWMutex

+        {

+        public:

+            void LockRead() { m_Mutex.Lock(); }

+            void UnlockRead() { m_Mutex.Unlock(); }

+            void LockWrite() { m_Mutex.Lock(); }

+            void UnlockWrite() { m_Mutex.Unlock(); }

+        private:

+            VMA_MUTEX m_Mutex;

+        };

+        #define VMA_RW_MUTEX VmaRWMutex

+    #endif // #if VMA_USE_STL_SHARED_MUTEX

+#endif // #ifndef VMA_RW_MUTEX

+

 /*

 If providing your own implementation, you need to implement a subset of std::atomic:

 

@@ -3315,25 +3505,39 @@
 public:

     VmaMutexLock(VMA_MUTEX& mutex, bool useMutex) :

         m_pMutex(useMutex ? &mutex : VMA_NULL)

-    {

-        if(m_pMutex)

-        {

-            m_pMutex->Lock();

-        }

-    }

-    

+    { if(m_pMutex) { m_pMutex->Lock(); } }

     ~VmaMutexLock()

-    {

-        if(m_pMutex)

-        {

-            m_pMutex->Unlock();

-        }

-    }

-

+    { if(m_pMutex) { m_pMutex->Unlock(); } }

 private:

     VMA_MUTEX* m_pMutex;

 };

 

+// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for reading.

+struct VmaMutexLockRead

+{

+    VMA_CLASS_NO_COPY(VmaMutexLockRead)

+public:

+    VmaMutexLockRead(VMA_RW_MUTEX& mutex, bool useMutex) :

+        m_pMutex(useMutex ? &mutex : VMA_NULL)

+    { if(m_pMutex) { m_pMutex->LockRead(); } }

+    ~VmaMutexLockRead() { if(m_pMutex) { m_pMutex->UnlockRead(); } }

+private:

+    VMA_RW_MUTEX* m_pMutex;

+};

+

+// Helper RAII class to lock a RW mutex in constructor and unlock it in destructor (at the end of scope), for writing.

+struct VmaMutexLockWrite

+{

+    VMA_CLASS_NO_COPY(VmaMutexLockWrite)

+public:

+    VmaMutexLockWrite(VMA_RW_MUTEX& mutex, bool useMutex) :

+        m_pMutex(useMutex ? &mutex : VMA_NULL)

+    { if(m_pMutex) { m_pMutex->LockWrite(); } }

+    ~VmaMutexLockWrite() { if(m_pMutex) { m_pMutex->UnlockWrite(); } }

+private:

+    VMA_RW_MUTEX* m_pMutex;

+};

+

 #if VMA_DEBUG_GLOBAL_MUTEX

     static VMA_MUTEX gDebugGlobalMutex;

     #define VMA_DEBUG_GLOBAL_MUTEX_LOCK VmaMutexLock debugGlobalMutexLock(gDebugGlobalMutex, true);

@@ -5308,8 +5512,11 @@
     uint32_t m_Id;

     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.

+    /*

+    Protects access to m_hMemory so it's not used by multiple threads simultaneously, e.g. vkMapMemory, vkBindBufferMemory.

+    Also protects m_MapCount, m_pMappedData.

+    Allocations, deallocations, any change in m_pMetadata is protected by parent's VmaBlockVector::m_Mutex.

+    */

     VMA_MUTEX m_Mutex;

     uint32_t m_MapCount;

     void* m_pMappedData;

@@ -5323,7 +5530,16 @@
     }

 };

 

-class VmaDefragmentator;

+struct VmaDefragmentationMove

+{

+    size_t srcBlockIndex;

+    size_t dstBlockIndex;

+    VkDeviceSize srcOffset;

+    VkDeviceSize dstOffset;

+    VkDeviceSize size;

+};

+

+class VmaDefragmentationAlgorithm;

 

 /*

 Sequence of VmaDeviceMemoryBlock. Represents memory blocks allocated for a specific

@@ -5385,19 +5601,19 @@
         size_t* pLostAllocationCount);

     VkResult CheckCorruption();

 

-    VmaDefragmentator* EnsureDefragmentator(

-        VmaAllocator hAllocator,

-        uint32_t currentFrameIndex);

-

-    VkResult Defragment(

-        VmaDefragmentationStats* pDefragmentationStats,

-        VkDeviceSize& maxBytesToMove,

-        uint32_t& maxAllocationsToMove);

-

-    void DestroyDefragmentator();

+    // Saves results in pCtx->res.

+    void Defragment(

+        class VmaBlockVectorDefragmentationContext* pCtx,

+        VmaDefragmentationStats* pStats,

+        VkDeviceSize& maxCpuBytesToMove, uint32_t& maxCpuAllocationsToMove,

+        VkDeviceSize& maxGpuBytesToMove, uint32_t& maxGpuAllocationsToMove,

+        VkCommandBuffer commandBuffer);

+    void DefragmentationEnd(

+        class VmaBlockVectorDefragmentationContext* pCtx,

+        VmaDefragmentationStats* pStats);

 

 private:

-    friend class VmaDefragmentator;

+    friend class VmaDefragmentationAlgorithm;

 

     const VmaAllocator m_hAllocator;

     const uint32_t m_MemoryTypeIndex;

@@ -5409,14 +5625,13 @@
     const bool m_IsCustomPool;

     const bool m_ExplicitBlockSize;

     const uint32_t m_Algorithm;

-    bool m_HasEmptyBlock;

-    VMA_MUTEX m_Mutex;

-    // Incrementally sorted by sumFreeSize, ascending.

-    VmaVector< VmaDeviceMemoryBlock*, VmaStlAllocator<VmaDeviceMemoryBlock*> > m_Blocks;

     /* There can be at most one allocation that is completely empty - a

     hysteresis to avoid pessimistic case of alternating creation and destruction

     of a VkDeviceMemory. */

-    VmaDefragmentator* m_pDefragmentator;

+    bool m_HasEmptyBlock;

+    VMA_RW_MUTEX m_Mutex;

+    // Incrementally sorted by sumFreeSize, ascending.

+    VmaVector< VmaDeviceMemoryBlock*, VmaStlAllocator<VmaDeviceMemoryBlock*> > m_Blocks;

     uint32_t m_NextBlockId;

 

     VkDeviceSize CalcMaxBlockSize() const;

@@ -5442,6 +5657,22 @@
         VmaAllocation* pAllocation);

 

     VkResult CreateBlock(VkDeviceSize blockSize, size_t* pNewBlockIndex);

+

+    // Saves result to pCtx->res.

+    void ApplyDefragmentationMovesCpu(

+        class VmaBlockVectorDefragmentationContext* pDefragCtx,

+        const VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves);

+    // Saves result to pCtx->res.

+    void ApplyDefragmentationMovesGpu(

+        class VmaBlockVectorDefragmentationContext* pDefragCtx,

+        const VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,

+        VkCommandBuffer commandBuffer);

+

+    /*

+    Used during defragmentation. pDefragmentationStats is optional. It's in/out

+    - updated with new data.

+    */

+    void FreeEmptyBlocks(VmaDefragmentationStats* pDefragmentationStats);

 };

 

 struct VmaPool_T

@@ -5467,13 +5698,38 @@
     uint32_t m_Id;

 };

 

-class VmaDefragmentator

+/*

+Performs defragmentation:

+

+- Updates `pBlockVector->m_pMetadata`.

+- Updates allocations by calling ChangeBlockAllocation().

+- Does not move actual data, only returns requested moves as `moves`.

+*/

+class VmaDefragmentationAlgorithm

 {

-    VMA_CLASS_NO_COPY(VmaDefragmentator)

+    VMA_CLASS_NO_COPY(VmaDefragmentationAlgorithm)

+public:

+    VmaDefragmentationAlgorithm(

+        VmaAllocator hAllocator,

+        VmaBlockVector* pBlockVector,

+        uint32_t currentFrameIndex);

+    virtual ~VmaDefragmentationAlgorithm();

+

+    void AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged);

+

+    VkResult Defragment(

+        VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,

+        VkDeviceSize maxBytesToMove,

+        uint32_t maxAllocationsToMove);

+

+    VkDeviceSize GetBytesMoved() const { return m_BytesMoved; }

+    uint32_t GetAllocationsMoved() const { return m_AllocationsMoved; }

+

 private:

-    const VmaAllocator m_hAllocator;

+    VmaAllocator const m_hAllocator;

     VmaBlockVector* const m_pBlockVector;

-    uint32_t m_CurrentFrameIndex;

+    const uint32_t m_CurrentFrameIndex;

+

     VkDeviceSize m_BytesMoved;

     uint32_t m_AllocationsMoved;

 

@@ -5502,15 +5758,16 @@
 

     struct BlockInfo

     {

+        size_t m_OriginalBlockIndex;

         VmaDeviceMemoryBlock* m_pBlock;

         bool m_HasNonMovableAllocations;

         VmaVector< AllocationInfo, VmaStlAllocator<AllocationInfo> > m_Allocations;

 

         BlockInfo(const VkAllocationCallbacks* pAllocationCallbacks) :

+            m_OriginalBlockIndex(SIZE_MAX),

             m_pBlock(VMA_NULL),

             m_HasNonMovableAllocations(true),

-            m_Allocations(pAllocationCallbacks),

-            m_pMappedDataForDefragmentation(VMA_NULL)

+            m_Allocations(pAllocationCallbacks)

         {

         }

 

@@ -5525,13 +5782,6 @@
         {

             VMA_SORT(m_Allocations.begin(), m_Allocations.end(), AllocationInfoSizeGreater());

         }

-

-        VkResult EnsureMapping(VmaAllocator hAllocator, void** ppMappedData);

-        void Unmap(VmaAllocator hAllocator);

-

-    private:

-        // Not null if mapped for defragmentation only, not originally mapped.

-        void* m_pMappedDataForDefragmentation;

     };

 

     struct BlockPointerLess

@@ -5572,29 +5822,98 @@
     BlockInfoVector m_Blocks;

 

     VkResult DefragmentRound(

+        VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,

         VkDeviceSize maxBytesToMove,

         uint32_t maxAllocationsToMove);

 

     static bool MoveMakesSense(

         size_t dstBlockIndex, VkDeviceSize dstOffset,

         size_t srcBlockIndex, VkDeviceSize srcOffset);

+};

 

+struct VmaBlockDefragmentationContext

+{

+private:

+    VMA_CLASS_NO_COPY(VmaBlockDefragmentationContext)

 public:

-    VmaDefragmentator(

+    enum BLOCK_FLAG

+    {

+        BLOCK_FLAG_USED = 0x00000001,

+    };

+    uint32_t flags;

+    VkBuffer hBuffer;

+

+    VmaBlockDefragmentationContext() :

+        flags(0),

+        hBuffer(VK_NULL_HANDLE)

+    {

+    }

+};

+

+class VmaBlockVectorDefragmentationContext

+{

+    VMA_CLASS_NO_COPY(VmaBlockVectorDefragmentationContext)

+public:

+    VkResult res;

+    bool mutexLocked;

+    VmaVector< VmaBlockDefragmentationContext, VmaStlAllocator<VmaBlockDefragmentationContext> > blockContexts;

+

+    VmaBlockVectorDefragmentationContext(

         VmaAllocator hAllocator,

+        VmaPool hCustomPool, // Optional.

         VmaBlockVector* pBlockVector,

-        uint32_t currentFrameIndex);

+        uint32_t currFrameIndex);

+    ~VmaBlockVectorDefragmentationContext();

 

-    ~VmaDefragmentator();

+    VmaPool GetCustomPool() const { return m_hCustomPool; }

+    VmaBlockVector* GetBlockVector() const { return m_pBlockVector; }

+    VmaDefragmentationAlgorithm* GetAlgorithm() const { return m_pAlgorithm; }

 

-    VkDeviceSize GetBytesMoved() const { return m_BytesMoved; }

-    uint32_t GetAllocationsMoved() const { return m_AllocationsMoved; }

+private:

+    const VmaAllocator m_hAllocator;

+    // Null if not from custom pool.

+    const VmaPool m_hCustomPool;

+    // Redundant, for convenience not to fetch from m_hCustomPool->m_BlockVector or m_hAllocator->m_pBlockVectors.

+    VmaBlockVector* const m_pBlockVector;

+    // Owner of this object.

+    VmaDefragmentationAlgorithm* m_pAlgorithm;

+};

 

-    void AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged);

+struct VmaDefragmentationContext_T

+{

+private:

+    VMA_CLASS_NO_COPY(VmaDefragmentationContext_T)

+public:

+    VmaDefragmentationContext_T(

+        VmaAllocator hAllocator,

+        uint32_t currFrameIndex,

+        VmaDefragmentationStats* pStats);

+    ~VmaDefragmentationContext_T();

 

+    void AddAllocations(

+        uint32_t allocationCount,

+        VmaAllocation* pAllocations,

+        VkBool32* pAllocationsChanged);

+

+    /*

+    Returns:

+    - `VK_SUCCESS` if succeeded and object can be destroyed immediately.

+    - `VK_NOT_READY` if succeeded but the object must remain alive until vmaDefragmentationEnd().

+    - Negative value if error occured and object can be destroyed immediately.

+    */

     VkResult Defragment(

-        VkDeviceSize maxBytesToMove,

-        uint32_t maxAllocationsToMove);

+        VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,

+        VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,

+        VkCommandBuffer commandBuffer, VmaDefragmentationStats* pStats);

+

+private:

+    const VmaAllocator m_hAllocator;

+    const uint32_t m_CurrFrameIndex;

+    VmaDefragmentationStats* const m_pStats;

+    // Owner of these objects.

+    VmaBlockVectorDefragmentationContext* m_DefaultPoolContexts[VK_MAX_MEMORY_TYPES];

+    // Owner of these objects.

+    VmaVector< VmaBlockVectorDefragmentationContext*, VmaStlAllocator<VmaBlockVectorDefragmentationContext*> > m_CustomPoolContexts;

 };

 

 #if VMA_RECORDING_ENABLED

@@ -5713,7 +6032,7 @@
     VkAllocationCallbacks m_AllocationCallbacks;

     VmaDeviceMemoryCallbacks m_DeviceMemoryCallbacks;

     

-    // Number of bytes free out of limit, or VK_WHOLE_SIZE if not limit for that heap.

+    // Number of bytes free out of limit, or VK_WHOLE_SIZE if no limit for that heap.

     VkDeviceSize m_HeapSizeLimit[VK_MAX_MEMORY_HEAPS];

     VMA_MUTEX m_HeapSizeLimitMutex;

 

@@ -5726,7 +6045,7 @@
     // Each vector is sorted by memory (handle value).

     typedef VmaVector< VmaAllocation, VmaStlAllocator<VmaAllocation> > AllocationVectorType;

     AllocationVectorType* m_pDedicatedAllocations[VK_MAX_MEMORY_TYPES];

-    VMA_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];

+    VMA_RW_MUTEX m_DedicatedAllocationsMutex[VK_MAX_MEMORY_TYPES];

 

     VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo);

     VkResult Init(const VmaAllocatorCreateInfo* pCreateInfo);

@@ -5814,12 +6133,12 @@
     void PrintDetailedMap(class VmaJsonWriter& json);

 #endif

 

-    VkResult Defragment(

-        VmaAllocation* pAllocations,

-        size_t allocationCount,

-        VkBool32* pAllocationsChanged,

-        const VmaDefragmentationInfo* pDefragmentationInfo,

-        VmaDefragmentationStats* pDefragmentationStats);

+    VkResult DefragmentationBegin(

+        const VmaDefragmentationInfo2& info,

+        VmaDefragmentationStats* pStats,

+        VmaDefragmentationContext* pContext);

+    VkResult DefragmentationEnd(

+        VmaDefragmentationContext context);

 

     void GetAllocationInfo(VmaAllocation hAllocation, VmaAllocationInfo* pAllocationInfo);

     bool TouchAllocation(VmaAllocation hAllocation);

@@ -5861,7 +6180,7 @@
     VkPhysicalDevice m_PhysicalDevice;

     VMA_ATOMIC_UINT32 m_CurrentFrameIndex;

     

-    VMA_MUTEX m_PoolsMutex;

+    VMA_RW_MUTEX m_PoolsMutex;

     // Protected by m_PoolsMutex. Sorted by pointer value.

     VmaVector<VmaPool, VmaStlAllocator<VmaPool> > m_Pools;

     uint32_t m_NextPoolId;

@@ -10358,15 +10677,12 @@
     m_Algorithm(algorithm),

     m_HasEmptyBlock(false),

     m_Blocks(VmaStlAllocator<VmaDeviceMemoryBlock*>(hAllocator->GetAllocationCallbacks())),

-    m_pDefragmentator(VMA_NULL),

     m_NextBlockId(0)

 {

 }

 

 VmaBlockVector::~VmaBlockVector()

 {

-    VMA_ASSERT(m_pDefragmentator == VMA_NULL);

-

     for(size_t i = m_Blocks.size(); i--; )

     {

         m_Blocks[i]->Destroy(m_hAllocator);

@@ -10389,7 +10705,7 @@
 

 void VmaBlockVector::GetPoolStats(VmaPoolStats* pStats)

 {

-    VmaMutexLock lock(m_Mutex, m_hAllocator->m_UseMutex);

+    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);

 

     const size_t blockCount = m_Blocks.size();

 

@@ -10471,7 +10787,7 @@
         return VK_ERROR_OUT_OF_DEVICE_MEMORY;

     }

 

-    VmaMutexLock lock(m_Mutex, m_hAllocator->m_UseMutex);

+    VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);

 

     /*

     Under certain condition, this whole section can be skipped for optimization, so

@@ -10801,7 +11117,7 @@
 

     // Scope for lock.

     {

-        VmaMutexLock lock(m_Mutex, m_hAllocator->m_UseMutex);

+        VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);

 

         VmaDeviceMemoryBlock* pBlock = hAllocation->GetBlock();

 

@@ -11013,11 +11329,234 @@
     return VK_SUCCESS;

 }

 

+void VmaBlockVector::ApplyDefragmentationMovesCpu(

+    class VmaBlockVectorDefragmentationContext* pDefragCtx,

+    const VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves)

+{

+    const size_t blockCount = m_Blocks.size();

+    const bool isNonCoherent = m_hAllocator->IsMemoryTypeNonCoherent(m_MemoryTypeIndex);

+

+    enum BLOCK_FLAG

+    {

+        BLOCK_FLAG_USED = 0x00000001,

+        BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION = 0x00000002,

+    };

+

+    struct BlockInfo

+    {

+        uint32_t flags;

+        void* pMappedData;

+    };

+    VmaVector< BlockInfo, VmaStlAllocator<BlockInfo> >

+        blockInfo(blockCount, VmaStlAllocator<BlockInfo>(m_hAllocator->GetAllocationCallbacks()));

+    memset(blockInfo.data(), 0, blockCount * sizeof(BlockInfo));

+

+    // Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.

+    const size_t moveCount = moves.size();

+    for(size_t moveIndex = 0; moveIndex < moveCount; ++moveIndex)

+    {

+        const VmaDefragmentationMove& move = moves[moveIndex];

+        blockInfo[move.srcBlockIndex].flags |= BLOCK_FLAG_USED;

+        blockInfo[move.dstBlockIndex].flags |= BLOCK_FLAG_USED;

+    }

+

+    VMA_ASSERT(pDefragCtx->res == VK_SUCCESS);

+

+    // Go over all blocks. Get mapped pointer or map if necessary.

+    for(size_t blockIndex = 0; pDefragCtx->res == VK_SUCCESS && blockIndex < blockCount; ++blockIndex)

+    {

+        BlockInfo& currBlockInfo = blockInfo[blockIndex];

+        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];

+        if((currBlockInfo.flags & BLOCK_FLAG_USED) != 0)

+        {

+            currBlockInfo.pMappedData = pBlock->GetMappedData();

+            // It is not originally mapped - map it.

+            if(currBlockInfo.pMappedData == VMA_NULL)

+            {

+                pDefragCtx->res = pBlock->Map(m_hAllocator, 1, &currBlockInfo.pMappedData);

+                if(pDefragCtx->res == VK_SUCCESS)

+                {

+                    currBlockInfo.flags |= BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION;

+                }

+            }

+        }

+    }

+

+    // Go over all moves. Do actual data transfer.

+    if(pDefragCtx->res == VK_SUCCESS)

+    {

+        const VkDeviceSize nonCoherentAtomSize = m_hAllocator->m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;

+        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };

+

+        for(size_t moveIndex = 0; moveIndex < moveCount; ++moveIndex)

+        {

+            const VmaDefragmentationMove& move = moves[moveIndex];

+

+            const BlockInfo& srcBlockInfo = blockInfo[move.srcBlockIndex];

+            const BlockInfo& dstBlockInfo = blockInfo[move.dstBlockIndex];

+

+            VMA_ASSERT(srcBlockInfo.pMappedData && dstBlockInfo.pMappedData);

+

+            // Invalidate source.

+            if(isNonCoherent)

+            {

+                VmaDeviceMemoryBlock* const pSrcBlock = m_Blocks[move.srcBlockIndex];

+                memRange.memory = pSrcBlock->GetDeviceMemory();

+                memRange.offset = VmaAlignDown(move.srcOffset, nonCoherentAtomSize);

+                memRange.size = VMA_MIN(

+                    VmaAlignUp(move.size + (move.srcOffset - memRange.offset), nonCoherentAtomSize),

+                    pSrcBlock->m_pMetadata->GetSize() - memRange.offset);

+                (*m_hAllocator->GetVulkanFunctions().vkInvalidateMappedMemoryRanges)(m_hAllocator->m_hDevice, 1, &memRange);

+            }

+

+            // THE PLACE WHERE ACTUAL DATA COPY HAPPENS.

+            memcpy(

+                reinterpret_cast<char*>(dstBlockInfo.pMappedData) + move.dstOffset,

+                reinterpret_cast<char*>(srcBlockInfo.pMappedData) + move.srcOffset,

+                static_cast<size_t>(move.size));

+

+            if(IsCorruptionDetectionEnabled())

+            {

+                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset - VMA_DEBUG_MARGIN);

+                VmaWriteMagicValue(dstBlockInfo.pMappedData, move.dstOffset + move.size);

+            }

+

+            // Flush destination.

+            if(isNonCoherent)

+            {

+                VmaDeviceMemoryBlock* const pDstBlock = m_Blocks[move.dstBlockIndex];

+                memRange.memory = pDstBlock->GetDeviceMemory();

+                memRange.offset = VmaAlignDown(move.dstOffset, nonCoherentAtomSize);

+                memRange.size = VMA_MIN(

+                    VmaAlignUp(move.size + (move.dstOffset - memRange.offset), nonCoherentAtomSize),

+                    pDstBlock->m_pMetadata->GetSize() - memRange.offset);

+                (*m_hAllocator->GetVulkanFunctions().vkFlushMappedMemoryRanges)(m_hAllocator->m_hDevice, 1, &memRange);

+            }

+        }

+    }

+

+    // Go over all blocks in reverse order. Unmap those that were mapped just for defragmentation.

+    // Regardless of pCtx->res == VK_SUCCESS.

+    for(size_t blockIndex = blockCount; blockIndex--; )

+    {

+        const BlockInfo& currBlockInfo = blockInfo[blockIndex];

+        if((currBlockInfo.flags & BLOCK_FLAG_MAPPED_FOR_DEFRAGMENTATION) != 0)

+        {

+            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];

+            pBlock->Unmap(m_hAllocator, 1);

+        }

+    }

+}

+

+void VmaBlockVector::ApplyDefragmentationMovesGpu(

+    class VmaBlockVectorDefragmentationContext* pDefragCtx,

+    const VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,

+    VkCommandBuffer commandBuffer)

+{

+    const size_t blockCount = m_Blocks.size();

+

+    pDefragCtx->blockContexts.resize(blockCount);

+    memset(pDefragCtx->blockContexts.data(), 0, blockCount * sizeof(VmaBlockDefragmentationContext));

+

+    // Go over all moves. Mark blocks that are used with BLOCK_FLAG_USED.

+    const size_t moveCount = moves.size();

+    for(size_t moveIndex = 0; moveIndex < moveCount; ++moveIndex)

+    {

+        const VmaDefragmentationMove& move = moves[moveIndex];

+        pDefragCtx->blockContexts[move.srcBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;

+        pDefragCtx->blockContexts[move.dstBlockIndex].flags |= VmaBlockDefragmentationContext::BLOCK_FLAG_USED;

+    }

+

+    VMA_ASSERT(pDefragCtx->res == VK_SUCCESS);

+

+    // Go over all blocks. Create and bind buffer for whole block if necessary.

+    {

+        VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+        bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT |

+            VK_BUFFER_USAGE_TRANSFER_DST_BIT;

+

+        for(size_t blockIndex = 0; pDefragCtx->res == VK_SUCCESS && blockIndex < blockCount; ++blockIndex)

+        {

+            VmaBlockDefragmentationContext& currBlockCtx = pDefragCtx->blockContexts[blockIndex];

+            VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];

+            if((currBlockCtx.flags & VmaBlockDefragmentationContext::BLOCK_FLAG_USED) != 0)

+            {

+                bufCreateInfo.size = pBlock->m_pMetadata->GetSize();

+                pDefragCtx->res = (*m_hAllocator->GetVulkanFunctions().vkCreateBuffer)(

+                    m_hAllocator->m_hDevice, &bufCreateInfo, m_hAllocator->GetAllocationCallbacks(), &currBlockCtx.hBuffer);

+                if(pDefragCtx->res == VK_SUCCESS)

+                {

+                    pDefragCtx->res = (*m_hAllocator->GetVulkanFunctions().vkBindBufferMemory)(

+                        m_hAllocator->m_hDevice, currBlockCtx.hBuffer, pBlock->GetDeviceMemory(), 0);

+                }

+            }

+        }

+    }

+

+    // Go over all moves. Post data transfer commands to command buffer.

+    if(pDefragCtx->res == VK_SUCCESS)

+    {

+        const VkDeviceSize nonCoherentAtomSize = m_hAllocator->m_PhysicalDeviceProperties.limits.nonCoherentAtomSize;

+        VkMappedMemoryRange memRange = { VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE };

+

+        for(size_t moveIndex = 0; moveIndex < moveCount; ++moveIndex)

+        {

+            const VmaDefragmentationMove& move = moves[moveIndex];

+

+            const VmaBlockDefragmentationContext& srcBlockCtx = pDefragCtx->blockContexts[move.srcBlockIndex];

+            const VmaBlockDefragmentationContext& dstBlockCtx = pDefragCtx->blockContexts[move.dstBlockIndex];

+

+            VMA_ASSERT(srcBlockCtx.hBuffer && dstBlockCtx.hBuffer);

+

+            VkBufferCopy region = {

+                move.srcOffset,

+                move.dstOffset,

+                move.size };

+            (*m_hAllocator->GetVulkanFunctions().vkCmdCopyBuffer)(

+                commandBuffer, srcBlockCtx.hBuffer, dstBlockCtx.hBuffer, 1, &region);

+        }

+    }

+

+    // Save buffers to defrag context for later destruction.

+    if(pDefragCtx->res == VK_SUCCESS && moveCount > 0)

+    {

+        pDefragCtx->res = VK_NOT_READY;

+    }

+}

+

+void VmaBlockVector::FreeEmptyBlocks(VmaDefragmentationStats* pDefragmentationStats)

+{

+    m_HasEmptyBlock = false;

+    for(size_t blockIndex = m_Blocks.size(); blockIndex--; )

+    {

+        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];

+        if(pBlock->m_pMetadata->IsEmpty())

+        {

+            if(m_Blocks.size() > m_MinBlockCount)

+            {

+                if(pDefragmentationStats != VMA_NULL)

+                {

+                    ++pDefragmentationStats->deviceMemoryBlocksFreed;

+                    pDefragmentationStats->bytesFreed += pBlock->m_pMetadata->GetSize();

+                }

+

+                VmaVectorRemove(m_Blocks, blockIndex);

+                pBlock->Destroy(m_hAllocator);

+                vma_delete(m_hAllocator, pBlock);

+            }

+            else

+            {

+                m_HasEmptyBlock = true;

+            }

+        }

+    }

+}

+

 #if VMA_STATS_STRING_ENABLED

 

 void VmaBlockVector::PrintDetailedMap(class VmaJsonWriter& json)

 {

-    VmaMutexLock lock(m_Mutex, m_hAllocator->m_UseMutex);

+    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);

 

     json.BeginObject();

 

@@ -11080,84 +11619,109 @@
 

 #endif // #if VMA_STATS_STRING_ENABLED

 

-VmaDefragmentator* VmaBlockVector::EnsureDefragmentator(

-    VmaAllocator hAllocator,

-    uint32_t currentFrameIndex)

+void VmaBlockVector::Defragment(

+    class VmaBlockVectorDefragmentationContext* pCtx,

+    VmaDefragmentationStats* pStats,

+    VkDeviceSize& maxCpuBytesToMove, uint32_t& maxCpuAllocationsToMove,

+    VkDeviceSize& maxGpuBytesToMove, uint32_t& maxGpuAllocationsToMove,

+    VkCommandBuffer commandBuffer)

 {

-    if(m_pDefragmentator == VMA_NULL)

-    {

-        m_pDefragmentator = vma_new(m_hAllocator, VmaDefragmentator)(

-            hAllocator,

-            this,

-            currentFrameIndex);

-    }

-

-    return m_pDefragmentator;

-}

-

-VkResult VmaBlockVector::Defragment(

-    VmaDefragmentationStats* pDefragmentationStats,

-    VkDeviceSize& maxBytesToMove,

-    uint32_t& maxAllocationsToMove)

-{

-    if(m_pDefragmentator == VMA_NULL)

-    {

-        return VK_SUCCESS;

-    }

-

-    VmaMutexLock lock(m_Mutex, m_hAllocator->m_UseMutex);

-

-    // Defragment.

-    VkResult result = m_pDefragmentator->Defragment(maxBytesToMove, maxAllocationsToMove);

-

-    // Accumulate statistics.

-    if(pDefragmentationStats != VMA_NULL)

-    {

-        const VkDeviceSize bytesMoved = m_pDefragmentator->GetBytesMoved();

-        const uint32_t allocationsMoved = m_pDefragmentator->GetAllocationsMoved();

-        pDefragmentationStats->bytesMoved += bytesMoved;

-        pDefragmentationStats->allocationsMoved += allocationsMoved;

-        VMA_ASSERT(bytesMoved <= maxBytesToMove);

-        VMA_ASSERT(allocationsMoved <= maxAllocationsToMove);

-        maxBytesToMove -= bytesMoved;

-        maxAllocationsToMove -= allocationsMoved;

-    }

+    pCtx->res = VK_SUCCESS;

     

-    // Free empty blocks.

-    m_HasEmptyBlock = false;

-    for(size_t blockIndex = m_Blocks.size(); blockIndex--; )

-    {

-        VmaDeviceMemoryBlock* pBlock = m_Blocks[blockIndex];

-        if(pBlock->m_pMetadata->IsEmpty())

-        {

-            if(m_Blocks.size() > m_MinBlockCount)

-            {

-                if(pDefragmentationStats != VMA_NULL)

-                {

-                    ++pDefragmentationStats->deviceMemoryBlocksFreed;

-                    pDefragmentationStats->bytesFreed += pBlock->m_pMetadata->GetSize();

-                }

+    const VkMemoryPropertyFlags memPropFlags =

+        m_hAllocator->m_MemProps.memoryTypes[m_MemoryTypeIndex].propertyFlags;

+    const bool canDefragmentOnCpu = maxCpuBytesToMove > 0 && maxCpuAllocationsToMove > 0 &&

+        (memPropFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;

+    const bool canDefragmentOnGpu = maxGpuBytesToMove > 0 && maxGpuAllocationsToMove > 0;

 

-                VmaVectorRemove(m_Blocks, blockIndex);

-                pBlock->Destroy(m_hAllocator);

-                vma_delete(m_hAllocator, pBlock);

+    // There are options to defragment this memory type.

+    if(canDefragmentOnCpu || canDefragmentOnGpu)

+    {

+        bool defragmentOnGpu;

+        // There is only one option to defragment this memory type.

+        if(canDefragmentOnGpu != canDefragmentOnCpu)

+        {

+            defragmentOnGpu = canDefragmentOnGpu;

+        }

+        // Both options are available: Heuristics to choose the best one.

+        else

+        {

+            defragmentOnGpu = (memPropFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0 ||

+                m_hAllocator->IsIntegratedGpu();

+        }

+

+        if(m_hAllocator->m_UseMutex)

+        {

+            m_Mutex.LockWrite();

+            pCtx->mutexLocked = true;

+        }

+

+        // Defragment.

+        const VkDeviceSize maxBytesToMove = defragmentOnGpu ? maxGpuBytesToMove : maxCpuBytesToMove;

+        const uint32_t maxAllocationsToMove = defragmentOnGpu ? maxGpuAllocationsToMove : maxCpuAllocationsToMove;

+        VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> > moves = 

+            VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >(VmaStlAllocator<VmaDefragmentationMove>(m_hAllocator->GetAllocationCallbacks()));

+        pCtx->res = pCtx->GetAlgorithm()->Defragment(moves, maxBytesToMove, maxAllocationsToMove);

+

+        // Accumulate statistics.

+        if(pStats != VMA_NULL)

+        {

+            const VkDeviceSize bytesMoved = pCtx->GetAlgorithm()->GetBytesMoved();

+            const uint32_t allocationsMoved = pCtx->GetAlgorithm()->GetAllocationsMoved();

+            pStats->bytesMoved += bytesMoved;

+            pStats->allocationsMoved += allocationsMoved;

+            VMA_ASSERT(bytesMoved <= maxBytesToMove);

+            VMA_ASSERT(allocationsMoved <= maxAllocationsToMove);

+            if(defragmentOnGpu)

+            {

+                maxGpuBytesToMove -= bytesMoved;

+                maxGpuAllocationsToMove -= allocationsMoved;

             }

             else

             {

-                m_HasEmptyBlock = true;

+                maxCpuBytesToMove -= bytesMoved;

+                maxCpuAllocationsToMove -= allocationsMoved;

+            }

+        }

+    

+        if(pCtx->res >= VK_SUCCESS)

+        {

+            if(defragmentOnGpu)

+            {

+                ApplyDefragmentationMovesGpu(pCtx, moves, commandBuffer);

+            }

+            else

+            {

+                ApplyDefragmentationMovesCpu(pCtx, moves);

             }

         }

     }

-

-    return result;

 }

 

-void VmaBlockVector::DestroyDefragmentator()

+void VmaBlockVector::DefragmentationEnd(

+    class VmaBlockVectorDefragmentationContext* pCtx,

+    VmaDefragmentationStats* pStats)

 {

-    if(m_pDefragmentator != VMA_NULL)

+    // Destroy buffers.

+    for(size_t blockIndex = pCtx->blockContexts.size(); blockIndex--; )

     {

-        vma_delete(m_hAllocator, m_pDefragmentator);

-        m_pDefragmentator = VMA_NULL;

+        VmaBlockDefragmentationContext& blockCtx = pCtx->blockContexts[blockIndex];

+        if(blockCtx.hBuffer)

+        {

+            (*m_hAllocator->GetVulkanFunctions().vkDestroyBuffer)(

+                m_hAllocator->m_hDevice, blockCtx.hBuffer, m_hAllocator->GetAllocationCallbacks());

+        }

+    }

+

+    if(pCtx->res >= VK_SUCCESS)

+    {

+        FreeEmptyBlocks(pStats);

+    }

+

+    if(pCtx->mutexLocked)

+    {

+        VMA_ASSERT(m_hAllocator->m_UseMutex);

+        m_Mutex.UnlockWrite();

     }

 }

 

@@ -11165,7 +11729,7 @@
     uint32_t currentFrameIndex,

     size_t* pLostAllocationCount)

 {

-    VmaMutexLock lock(m_Mutex, m_hAllocator->m_UseMutex);

+    VmaMutexLockWrite lock(m_Mutex, m_hAllocator->m_UseMutex);

     size_t lostAllocationCount = 0;

     for(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)

     {

@@ -11186,7 +11750,7 @@
         return VK_ERROR_FEATURE_NOT_PRESENT;

     }

 

-    VmaMutexLock lock(m_Mutex, m_hAllocator->m_UseMutex);

+    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);

     for(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)

     {

         VmaDeviceMemoryBlock* const pBlock = m_Blocks[blockIndex];

@@ -11205,7 +11769,7 @@
     const uint32_t memTypeIndex = m_MemoryTypeIndex;

     const uint32_t memHeapIndex = m_hAllocator->MemoryTypeIndexToHeapIndex(memTypeIndex);

 

-    VmaMutexLock lock(m_Mutex, m_hAllocator->m_UseMutex);

+    VmaMutexLockRead lock(m_Mutex, m_hAllocator->m_UseMutex);

 

     for(uint32_t blockIndex = 0; blockIndex < m_Blocks.size(); ++blockIndex)

     {

@@ -11221,9 +11785,9 @@
 }

 

 ////////////////////////////////////////////////////////////////////////////////

-// VmaDefragmentator members definition

+// VmaDefragmentationAlgorithm members definition

 

-VmaDefragmentator::VmaDefragmentator(

+VmaDefragmentationAlgorithm::VmaDefragmentationAlgorithm(

     VmaAllocator hAllocator,

     VmaBlockVector* pBlockVector,

     uint32_t currentFrameIndex) :

@@ -11235,10 +11799,9 @@
     m_Allocations(VmaStlAllocator<AllocationInfo>(hAllocator->GetAllocationCallbacks())),

     m_Blocks(VmaStlAllocator<BlockInfo*>(hAllocator->GetAllocationCallbacks()))

 {

-    VMA_ASSERT(pBlockVector->GetAlgorithm() == 0);

 }

 

-VmaDefragmentator::~VmaDefragmentator()

+VmaDefragmentationAlgorithm::~VmaDefragmentationAlgorithm()

 {

     for(size_t i = m_Blocks.size(); i--; )

     {

@@ -11246,7 +11809,7 @@
     }

 }

 

-void VmaDefragmentator::AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged)

+void VmaDefragmentationAlgorithm::AddAllocation(VmaAllocation hAlloc, VkBool32* pChanged)

 {

     AllocationInfo allocInfo;

     allocInfo.m_hAllocation = hAlloc;

@@ -11254,37 +11817,8 @@
     m_Allocations.push_back(allocInfo);

 }

 

-VkResult VmaDefragmentator::BlockInfo::EnsureMapping(VmaAllocator hAllocator, void** ppMappedData)

-{

-    // It has already been mapped for defragmentation.

-    if(m_pMappedDataForDefragmentation)

-    {

-        *ppMappedData = m_pMappedDataForDefragmentation;

-        return VK_SUCCESS;

-    }

-            

-    // It is originally mapped.

-    if(m_pBlock->GetMappedData())

-    {

-        *ppMappedData = m_pBlock->GetMappedData();

-        return VK_SUCCESS;

-    }

-            

-    // Map on first usage.

-    VkResult res = m_pBlock->Map(hAllocator, 1, &m_pMappedDataForDefragmentation);

-    *ppMappedData = m_pMappedDataForDefragmentation;

-    return res;

-}

-

-void VmaDefragmentator::BlockInfo::Unmap(VmaAllocator hAllocator)

-{

-    if(m_pMappedDataForDefragmentation != VMA_NULL)

-    {

-        m_pBlock->Unmap(hAllocator, 1);

-    }

-}

-

-VkResult VmaDefragmentator::DefragmentRound(

+VkResult VmaDefragmentationAlgorithm::DefragmentRound(

+    VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,

     VkDeviceSize maxBytesToMove,

     uint32_t maxAllocationsToMove)

 {

@@ -11354,35 +11888,17 @@
                 if((m_AllocationsMoved + 1 > maxAllocationsToMove) ||

                     (m_BytesMoved + size > maxBytesToMove))

                 {

-                    return VK_INCOMPLETE;

+                    return VK_SUCCESS;

                 }

 

-                void* pDstMappedData = VMA_NULL;

-                VkResult res = pDstBlockInfo->EnsureMapping(m_hAllocator, &pDstMappedData);

-                if(res != VK_SUCCESS)

-                {

-                    return res;

-                }

+                VmaDefragmentationMove move;

+                move.srcBlockIndex = pSrcBlockInfo->m_OriginalBlockIndex;

+                move.dstBlockIndex = pDstBlockInfo->m_OriginalBlockIndex;

+                move.srcOffset = srcOffset;

+                move.dstOffset = dstAllocRequest.offset;

+                move.size = size;

+                moves.push_back(move);

 

-                void* pSrcMappedData = VMA_NULL;

-                res = pSrcBlockInfo->EnsureMapping(m_hAllocator, &pSrcMappedData);

-                if(res != VK_SUCCESS)

-                {

-                    return res;

-                }

-                

-                // THE PLACE WHERE ACTUAL DATA COPY HAPPENS.

-                memcpy(

-                    reinterpret_cast<char*>(pDstMappedData) + dstAllocRequest.offset,

-                    reinterpret_cast<char*>(pSrcMappedData) + srcOffset,

-                    static_cast<size_t>(size));

-

-                if(VMA_DEBUG_MARGIN > 0)

-                {

-                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset - VMA_DEBUG_MARGIN);

-                    VmaWriteMagicValue(pDstMappedData, dstAllocRequest.offset + size);

-                }

-                

                 pDstBlockInfo->m_pBlock->m_pMetadata->Alloc(

                     dstAllocRequest,

                     suballocType,

@@ -11428,7 +11944,8 @@
     }

 }

 

-VkResult VmaDefragmentator::Defragment(

+VkResult VmaDefragmentationAlgorithm::Defragment(

+    VmaVector< VmaDefragmentationMove, VmaStlAllocator<VmaDefragmentationMove> >& moves,

     VkDeviceSize maxBytesToMove,

     uint32_t maxAllocationsToMove)

 {

@@ -11442,6 +11959,7 @@
     for(size_t blockIndex = 0; blockIndex < blockCount; ++blockIndex)

     {

         BlockInfo* pBlockInfo = vma_new(m_hAllocator, BlockInfo)(m_hAllocator->GetAllocationCallbacks());

+        pBlockInfo->m_OriginalBlockIndex = blockIndex;

         pBlockInfo->m_pBlock = m_pBlockVector->m_Blocks[blockIndex];

         m_Blocks.push_back(pBlockInfo);

     }

@@ -11484,19 +12002,13 @@
     VkResult result = VK_SUCCESS;

     for(size_t round = 0; (round < 2) && (result == VK_SUCCESS); ++round)

     {

-        result = DefragmentRound(maxBytesToMove, maxAllocationsToMove);

-    }

-

-    // Unmap blocks that were mapped for defragmentation.

-    for(size_t blockIndex = 0; blockIndex < blockCount; ++blockIndex)

-    {

-        m_Blocks[blockIndex]->Unmap(m_hAllocator);

+        result = DefragmentRound(moves, maxBytesToMove, maxAllocationsToMove);

     }

 

     return result;

 }

 

-bool VmaDefragmentator::MoveMakesSense(

+bool VmaDefragmentationAlgorithm::MoveMakesSense(

         size_t dstBlockIndex, VkDeviceSize dstOffset,

         size_t srcBlockIndex, VkDeviceSize srcOffset)

 {

@@ -11516,6 +12028,196 @@
 }

 

 ////////////////////////////////////////////////////////////////////////////////

+// VmaBlockVectorDefragmentationContext

+

+VmaBlockVectorDefragmentationContext::VmaBlockVectorDefragmentationContext(

+    VmaAllocator hAllocator,

+    VmaPool hCustomPool,

+    VmaBlockVector* pBlockVector,

+    uint32_t currFrameIndex) :

+    res(VK_SUCCESS),

+    mutexLocked(false),

+    blockContexts(VmaStlAllocator<VmaBlockDefragmentationContext>(hAllocator->GetAllocationCallbacks())),

+    m_hAllocator(hAllocator),

+    m_hCustomPool(hCustomPool),

+    m_pBlockVector(pBlockVector),

+    m_pAlgorithm(VMA_NULL)

+{

+    m_pAlgorithm = vma_new(m_hAllocator, VmaDefragmentationAlgorithm)(

+        m_hAllocator, m_pBlockVector, currFrameIndex);

+}

+

+VmaBlockVectorDefragmentationContext::~VmaBlockVectorDefragmentationContext()

+{

+    vma_delete(m_hAllocator, m_pAlgorithm);

+}

+

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

+// VmaDefragmentationContext

+

+VmaDefragmentationContext_T::VmaDefragmentationContext_T(

+    VmaAllocator hAllocator,

+    uint32_t currFrameIndex,

+    VmaDefragmentationStats* pStats) :

+    m_hAllocator(hAllocator),

+    m_CurrFrameIndex(currFrameIndex),

+    m_pStats(pStats),

+    m_CustomPoolContexts(VmaStlAllocator<VmaBlockVectorDefragmentationContext*>(hAllocator->GetAllocationCallbacks()))

+{

+    memset(m_DefaultPoolContexts, 0, sizeof(m_DefaultPoolContexts));

+}

+

+VmaDefragmentationContext_T::~VmaDefragmentationContext_T()

+{

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

+    {

+        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[i];

+        pBlockVectorCtx->GetBlockVector()->DefragmentationEnd(pBlockVectorCtx, m_pStats);

+        vma_delete(m_hAllocator, pBlockVectorCtx);

+    }

+    for(size_t i = m_hAllocator->m_MemProps.memoryTypeCount; i--; )

+    {

+        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[i];

+        if(pBlockVectorCtx)

+        {

+            pBlockVectorCtx->GetBlockVector()->DefragmentationEnd(pBlockVectorCtx, m_pStats);

+            vma_delete(m_hAllocator, pBlockVectorCtx);

+        }

+    }

+}

+

+void VmaDefragmentationContext_T::AddAllocations(

+    uint32_t allocationCount,

+    VmaAllocation* pAllocations,

+    VkBool32* pAllocationsChanged)

+{

+    // Dispatch pAllocations among defragmentators. Create them when necessary.

+    for(size_t allocIndex = 0; allocIndex < allocationCount; ++allocIndex)

+    {

+        const VmaAllocation hAlloc = pAllocations[allocIndex];

+        VMA_ASSERT(hAlloc);

+        // DedicatedAlloc cannot be defragmented.

+        if((hAlloc->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &&

+            // Lost allocation cannot be defragmented.

+            (hAlloc->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))

+        {

+            VmaBlockVectorDefragmentationContext* pBlockVectorDefragCtx = VMA_NULL;

+

+            const VmaPool hAllocPool = hAlloc->GetPool();

+            // This allocation belongs to custom pool.

+            if(hAllocPool != VK_NULL_HANDLE)

+            {

+                // Pools with algorithm other than default are not defragmented.

+                if(hAllocPool->m_BlockVector.GetAlgorithm() == 0)

+                {

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

+                    {

+                        if(m_CustomPoolContexts[i]->GetCustomPool() == hAllocPool)

+                        {

+                            pBlockVectorDefragCtx = m_CustomPoolContexts[i];

+                            break;

+                        }

+                    }

+                    if(!pBlockVectorDefragCtx)

+                    {

+                        pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(

+                            m_hAllocator,

+                            hAllocPool,

+                            &hAllocPool->m_BlockVector,

+                            m_CurrFrameIndex);

+                        m_CustomPoolContexts.push_back(pBlockVectorDefragCtx);

+                    }

+                }

+            }

+            // This allocation belongs to default pool.

+            else

+            {

+                const uint32_t memTypeIndex = hAlloc->GetMemoryTypeIndex();

+                pBlockVectorDefragCtx = m_DefaultPoolContexts[memTypeIndex];

+                if(!pBlockVectorDefragCtx)

+                {

+                    pBlockVectorDefragCtx = vma_new(m_hAllocator, VmaBlockVectorDefragmentationContext)(

+                        m_hAllocator,

+                        VMA_NULL, // hCustomPool

+                        m_hAllocator->m_pBlockVectors[memTypeIndex],

+                        m_CurrFrameIndex);

+                    m_DefaultPoolContexts[memTypeIndex] = pBlockVectorDefragCtx;

+                }

+            }

+

+            if(pBlockVectorDefragCtx)

+            {

+                VkBool32* const pChanged = (pAllocationsChanged != VMA_NULL) ?

+                    &pAllocationsChanged[allocIndex] : VMA_NULL;

+                pBlockVectorDefragCtx->GetAlgorithm()->AddAllocation(hAlloc, pChanged);

+            }

+        }

+    }

+}

+

+VkResult VmaDefragmentationContext_T::Defragment(

+    VkDeviceSize maxCpuBytesToMove, uint32_t maxCpuAllocationsToMove,

+    VkDeviceSize maxGpuBytesToMove, uint32_t maxGpuAllocationsToMove,

+    VkCommandBuffer commandBuffer, VmaDefragmentationStats* pStats)

+{

+    if(pStats)

+    {

+        memset(pStats, 0, sizeof(VmaDefragmentationStats));

+    }

+

+    if(commandBuffer == VK_NULL_HANDLE)

+    {

+        maxGpuBytesToMove = 0;

+        maxGpuAllocationsToMove = 0;

+    }

+

+    VkResult res = VK_SUCCESS;

+

+    // Process default pools.

+    for(uint32_t memTypeIndex = 0;

+        memTypeIndex < m_hAllocator->GetMemoryTypeCount() && res >= VK_SUCCESS;

+        ++memTypeIndex)

+    {

+        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_DefaultPoolContexts[memTypeIndex];

+        if(pBlockVectorCtx)

+        {

+            VMA_ASSERT(pBlockVectorCtx->GetBlockVector());

+            pBlockVectorCtx->GetBlockVector()->Defragment(

+                pBlockVectorCtx,

+                pStats,

+                maxCpuBytesToMove, maxCpuAllocationsToMove,

+                maxGpuBytesToMove, maxGpuAllocationsToMove,

+                commandBuffer);

+            if(pBlockVectorCtx->res != VK_SUCCESS)

+            {

+                res = pBlockVectorCtx->res;

+            }

+        }

+    }

+

+    // Process custom pools.

+    for(size_t customCtxIndex = 0, customCtxCount = m_CustomPoolContexts.size();

+        customCtxIndex < customCtxCount && res >= VK_SUCCESS;

+        ++customCtxIndex)

+    {

+        VmaBlockVectorDefragmentationContext* pBlockVectorCtx = m_CustomPoolContexts[customCtxIndex];

+        VMA_ASSERT(pBlockVectorCtx && pBlockVectorCtx->GetBlockVector());

+        pBlockVectorCtx->GetBlockVector()->Defragment(

+            pBlockVectorCtx,

+            pStats,

+            maxCpuBytesToMove, maxCpuAllocationsToMove,

+            maxGpuBytesToMove, maxGpuAllocationsToMove,

+            commandBuffer);

+        if(pBlockVectorCtx->res != VK_SUCCESS)

+        {

+            res = pBlockVectorCtx->res;

+        }

+    }

+

+    return res;

+}

+

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

 // VmaRecorder

 

 #if VMA_RECORDING_ENABLED

@@ -12172,6 +12874,7 @@
     m_VulkanFunctions.vkDestroyBuffer = &vkDestroyBuffer;

     m_VulkanFunctions.vkCreateImage = &vkCreateImage;

     m_VulkanFunctions.vkDestroyImage = &vkDestroyImage;

+    m_VulkanFunctions.vkCmdCopyBuffer = &vkCmdCopyBuffer;

 #if VMA_DEDICATED_ALLOCATION

     if(m_UseKhrDedicatedAllocation)

     {

@@ -12204,6 +12907,7 @@
         VMA_COPY_IF_NOT_NULL(vkDestroyBuffer);

         VMA_COPY_IF_NOT_NULL(vkCreateImage);

         VMA_COPY_IF_NOT_NULL(vkDestroyImage);

+        VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);

 #if VMA_DEDICATED_ALLOCATION

         VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);

         VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);

@@ -12230,6 +12934,7 @@
     VMA_ASSERT(m_VulkanFunctions.vkDestroyBuffer != VMA_NULL);

     VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);

     VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);

+    VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);

 #if VMA_DEDICATED_ALLOCATION

     if(m_UseKhrDedicatedAllocation)

     {

@@ -12427,7 +13132,7 @@
 

     // Register it in m_pDedicatedAllocations.

     {

-        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);

+        VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);

         AllocationVectorType* pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];

         VMA_ASSERT(pDedicatedAllocations);

         VmaVectorInsertSorted<VmaPointerLess>(*pDedicatedAllocations, *pAllocation);

@@ -12732,7 +13437,7 @@
 

     // Process custom pools.

     {

-        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);

+        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);

         for(size_t poolIndex = 0, poolCount = m_Pools.size(); poolIndex < poolCount; ++poolIndex)

         {

             m_Pools[poolIndex]->m_BlockVector.AddStats(pStats);

@@ -12743,7 +13448,7 @@
     for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)

     {

         const uint32_t memHeapIndex = MemoryTypeIndexToHeapIndex(memTypeIndex);

-        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);

+        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);

         AllocationVectorType* const pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];

         VMA_ASSERT(pDedicatedAllocVector);

         for(size_t allocIndex = 0, allocCount = pDedicatedAllocVector->size(); allocIndex < allocCount; ++allocIndex)

@@ -12766,125 +13471,41 @@
 

 static const uint32_t VMA_VENDOR_ID_AMD = 4098;

 

-VkResult VmaAllocator_T::Defragment(

-    VmaAllocation* pAllocations,

-    size_t allocationCount,

-    VkBool32* pAllocationsChanged,

-    const VmaDefragmentationInfo* pDefragmentationInfo,

-    VmaDefragmentationStats* pDefragmentationStats)

+VkResult VmaAllocator_T::DefragmentationBegin(

+    const VmaDefragmentationInfo2& info,

+    VmaDefragmentationStats* pStats,

+    VmaDefragmentationContext* pContext)

 {

-    if(pAllocationsChanged != VMA_NULL)

+    if(info.pAllocationsChanged != VMA_NULL)

     {

-        memset(pAllocationsChanged, 0, allocationCount * sizeof(VkBool32));

-    }

-    if(pDefragmentationStats != VMA_NULL)

-    {

-        memset(pDefragmentationStats, 0, sizeof(*pDefragmentationStats));

+        memset(info.pAllocationsChanged, 0, info.allocationCount * sizeof(VkBool32));

     }

 

-    const uint32_t currentFrameIndex = m_CurrentFrameIndex.load();

+    *pContext = vma_new(this, VmaDefragmentationContext_T)(

+        this, m_CurrentFrameIndex.load(), pStats);

 

-    VmaMutexLock poolsLock(m_PoolsMutex, m_UseMutex);

+    (*pContext)->AddAllocations(

+        info.allocationCount, info.pAllocations, info.pAllocationsChanged);

 

-    const size_t poolCount = m_Pools.size();

+    VkResult res = (*pContext)->Defragment(

+        info.maxCpuBytesToMove, info.maxCpuAllocationsToMove,

+        info.maxGpuBytesToMove, info.maxGpuAllocationsToMove,

+        info.commandBuffer, pStats);

 

-    // Dispatch pAllocations among defragmentators. Create them in BlockVectors when necessary.

-    for(size_t allocIndex = 0; allocIndex < allocationCount; ++allocIndex)

+    if(res != VK_NOT_READY)

     {

-        VmaAllocation hAlloc = pAllocations[allocIndex];

-        VMA_ASSERT(hAlloc);

-        const uint32_t memTypeIndex = hAlloc->GetMemoryTypeIndex();

-        // DedicatedAlloc cannot be defragmented.

-        const VkMemoryPropertyFlags requiredMemFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;

-        if((hAlloc->GetType() == VmaAllocation_T::ALLOCATION_TYPE_BLOCK) &&

-            // Only HOST_VISIBLE and HOST_COHERENT memory types can be defragmented.

-            ((m_MemProps.memoryTypes[memTypeIndex].propertyFlags & requiredMemFlags) == requiredMemFlags) &&

-            // Lost allocation cannot be defragmented.

-            (hAlloc->GetLastUseFrameIndex() != VMA_FRAME_INDEX_LOST))

-        {

-            VmaBlockVector* pAllocBlockVector = VMA_NULL;

-

-            const VmaPool hAllocPool = hAlloc->GetPool();

-            // This allocation belongs to custom pool.

-            if(hAllocPool != VK_NULL_HANDLE)

-            {

-                // Pools with linear or buddy algorithm are not defragmented.

-                if(hAllocPool->m_BlockVector.GetAlgorithm() == 0)

-                {

-                    pAllocBlockVector = &hAllocPool->m_BlockVector;

-                }

-            }

-            // This allocation belongs to general pool.

-            else

-            {

-                pAllocBlockVector = m_pBlockVectors[memTypeIndex];

-            }

-

-            if(pAllocBlockVector != VMA_NULL)

-            {

-                VmaDefragmentator* const pDefragmentator =

-                    pAllocBlockVector->EnsureDefragmentator(this, currentFrameIndex);

-                VkBool32* const pChanged = (pAllocationsChanged != VMA_NULL) ?

-                    &pAllocationsChanged[allocIndex] : VMA_NULL;

-                pDefragmentator->AddAllocation(hAlloc, pChanged);

-            }

-        }

+        vma_delete(this, *pContext);

+        *pContext = VMA_NULL;

     }

 

-    VkResult result = VK_SUCCESS;

+    return res;

+}

 

-    // ======== Main processing.

-

-    VkDeviceSize maxBytesToMove = SIZE_MAX;

-    uint32_t maxAllocationsToMove = UINT32_MAX;

-    if(pDefragmentationInfo != VMA_NULL)

-    {

-        maxBytesToMove = pDefragmentationInfo->maxBytesToMove;

-        maxAllocationsToMove = pDefragmentationInfo->maxAllocationsToMove;

-    }

-

-    // Process standard memory.

-    for(uint32_t memTypeIndex = 0;

-        (memTypeIndex < GetMemoryTypeCount()) && (result == VK_SUCCESS);

-        ++memTypeIndex)

-    {

-        // Only HOST_VISIBLE memory types can be defragmented.

-        if((m_MemProps.memoryTypes[memTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)

-        {

-            result = m_pBlockVectors[memTypeIndex]->Defragment(

-                pDefragmentationStats,

-                maxBytesToMove,

-                maxAllocationsToMove);

-        }

-    }

-

-    // Process custom pools.

-    for(size_t poolIndex = 0; (poolIndex < poolCount) && (result == VK_SUCCESS); ++poolIndex)

-    {

-        result = m_Pools[poolIndex]->m_BlockVector.Defragment(

-            pDefragmentationStats,

-            maxBytesToMove,

-            maxAllocationsToMove);

-    }

-

-    // ========  Destroy defragmentators.

-

-    // Process custom pools.

-    for(size_t poolIndex = poolCount; poolIndex--; )

-    {

-        m_Pools[poolIndex]->m_BlockVector.DestroyDefragmentator();

-    }

-

-    // Process standard memory.

-    for(uint32_t memTypeIndex = GetMemoryTypeCount(); memTypeIndex--; )

-    {

-        if((m_MemProps.memoryTypes[memTypeIndex].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0)

-        {

-            m_pBlockVectors[memTypeIndex]->DestroyDefragmentator();

-        }

-    }

-

-    return result;

+VkResult VmaAllocator_T::DefragmentationEnd(

+    VmaDefragmentationContext context)

+{

+    vma_delete(this, context);

+    return VK_SUCCESS;

 }

 

 void VmaAllocator_T::GetAllocationInfo(VmaAllocation hAllocation, VmaAllocationInfo* pAllocationInfo)

@@ -13040,7 +13661,7 @@
 

     // Add to m_Pools.

     {

-        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);

+        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);

         (*pPool)->SetId(m_NextPoolId++);

         VmaVectorInsertSorted<VmaPointerLess>(m_Pools, *pPool);

     }

@@ -13052,7 +13673,7 @@
 {

     // Remove from m_Pools.

     {

-        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);

+        VmaMutexLockWrite lock(m_PoolsMutex, m_UseMutex);

         bool success = VmaVectorRemoveSorted<VmaPointerLess>(m_Pools, pool);

         VMA_ASSERT(success && "Pool not found in Allocator.");

     }

@@ -13111,7 +13732,7 @@
 

     // Process custom pools.

     {

-        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);

+        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);

         for(size_t poolIndex = 0, poolCount = m_Pools.size(); poolIndex < poolCount; ++poolIndex)

         {

             if(((1u << m_Pools[poolIndex]->m_BlockVector.GetMemoryTypeIndex()) & memoryTypeBits) != 0)

@@ -13371,7 +13992,7 @@
 

     const uint32_t memTypeIndex = allocation->GetMemoryTypeIndex();

     {

-        VmaMutexLock lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);

+        VmaMutexLockWrite lock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);

         AllocationVectorType* const pDedicatedAllocations = m_pDedicatedAllocations[memTypeIndex];

         VMA_ASSERT(pDedicatedAllocations);

         bool success = VmaVectorRemoveSorted<VmaPointerLess>(*pDedicatedAllocations, allocation);

@@ -13423,7 +14044,7 @@
     bool dedicatedAllocationsStarted = false;

     for(uint32_t memTypeIndex = 0; memTypeIndex < GetMemoryTypeCount(); ++memTypeIndex)

     {

-        VmaMutexLock dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);

+        VmaMutexLockRead dedicatedAllocationsLock(m_DedicatedAllocationsMutex[memTypeIndex], m_UseMutex);

         AllocationVectorType* const pDedicatedAllocVector = m_pDedicatedAllocations[memTypeIndex];

         VMA_ASSERT(pDedicatedAllocVector);

         if(pDedicatedAllocVector->empty() == false)

@@ -13485,7 +14106,7 @@
 

     // Custom pools

     {

-        VmaMutexLock lock(m_PoolsMutex, m_UseMutex);

+        VmaMutexLockRead lock(m_PoolsMutex, m_UseMutex);

         const size_t poolCount = m_Pools.size();

         if(poolCount > 0)

         {

@@ -14324,13 +14945,66 @@
     const VmaDefragmentationInfo *pDefragmentationInfo,

     VmaDefragmentationStats* pDefragmentationStats)

 {

-    VMA_ASSERT(allocator && pAllocations);

+    // Deprecated interface, reimplemented using new one.

 

-    VMA_DEBUG_LOG("vmaDefragment");

+    VmaDefragmentationInfo2 info2 = {};

+    info2.allocationCount = (uint32_t)allocationCount;

+    info2.pAllocations = pAllocations;

+    info2.pAllocationsChanged = pAllocationsChanged;

+    if(pDefragmentationInfo != VMA_NULL)

+    {

+        info2.maxCpuAllocationsToMove = pDefragmentationInfo->maxAllocationsToMove;

+        info2.maxCpuBytesToMove = pDefragmentationInfo->maxBytesToMove;

+    }

+    else

+    {

+        info2.maxCpuAllocationsToMove = UINT32_MAX;

+        info2.maxCpuBytesToMove = VK_WHOLE_SIZE;

+    }

+    // info2.flags, maxGpuAllocationsToMove, maxGpuBytesToMove, commandBuffer deliberately left zero.

+

+    VmaDefragmentationContext ctx;

+    VkResult res = vmaDefragmentationBegin(allocator, &info2, pDefragmentationStats, &ctx);

+    if(res == VK_NOT_READY)

+    {

+        res = vmaDefragmentationEnd( allocator, ctx);

+    }

+    return res;

+}

+

+VkResult vmaDefragmentationBegin(

+    VmaAllocator allocator,

+    const VmaDefragmentationInfo2* pInfo,

+    VmaDefragmentationStats* pStats,

+    VmaDefragmentationContext *pContext)

+{

+    VMA_ASSERT(allocator && pInfo && pContext);

+

+    VMA_DEBUG_LOG("vmaDefragmentationBegin");

 

     VMA_DEBUG_GLOBAL_MUTEX_LOCK

 

-    return allocator->Defragment(pAllocations, allocationCount, pAllocationsChanged, pDefragmentationInfo, pDefragmentationStats);

+    return allocator->DefragmentationBegin(*pInfo, pStats, pContext);

+}

+

+VkResult vmaDefragmentationEnd(

+    VmaAllocator allocator,

+    VmaDefragmentationContext context)

+{

+    VMA_ASSERT(allocator);

+

+    VMA_DEBUG_LOG("vmaDefragmentationEnd");

+

+    if(context != VK_NULL_HANDLE)

+    {

+        VMA_DEBUG_GLOBAL_MUTEX_LOCK

+

+        return allocator->DefragmentationEnd(context);

+    }

+    else

+    {

+        return VK_SUCCESS;

+    }

 }

 

 VkResult vmaBindBufferMemory(